simple<T> method

Generator<T> simple<T>({
  1. required T generate(
    1. Random random,
    2. int size
    ),
  2. required Iterable<T> shrink(
    1. T input
    ),
})

Creates a new, simple Generator that produces values and knows how to simplify them.

Implementation

Generator<T> simple<T>({
  required T Function(Random random, int size) generate,
  required Iterable<T> Function(T input) shrink,
}) {
  // Map both given functions to the semantics of generators: Instead of
  // having two top-level functions, we have one function that generates
  // `ShrinkableValue`s that each know how the shrink themselves.

  late Shrinkable<T> Function(T) generateShrinkable;
  generateShrinkable = (T value) {
    return Shrinkable(value, () sync* {
      for (final value in shrink(value)) {
        yield generateShrinkable(value);
      }
    });
  };
  return (random, size) {
    return generateShrinkable(generate(random, size));
  };
}