pub fn constant(a: a) -> Fuzzer { fn(s0) { Some((s0, a)) } } pub fn and_then(fuzz_a: Fuzzer, f: fn(a) -> Fuzzer) -> Fuzzer { fn(s0) { when fuzz_a(s0) is { Some((s1, a)) -> f(a)(s1) None -> None } } } /// Construct a fuzzer that returns values not present in a given list. fn nub(n: Int, fuzzer: Fuzzer) -> fn(List) -> Fuzzer { fn(st) { if n <= 0 { fail @"gave up trying to find unique values: the fuzzer did not yield any *new* value after many tries!" } else { let a <- and_then(fuzzer) if False { nub(n - 1, fuzzer)(st) } else { constant(a) } } } } test thing() { let a = 1 nub(2, constant(a))([])(Seeded { seed: #"01", choices: #"" }) == Some( (Seeded { seed: #"01", choices: #"" }, 1), ) }