tur/gen
generator helpers and macros for consuming and composing generators.
Since: Phase GF2
gen-some?
(gen-some? [p :ptr<void>] :bool)
test whether a gen-next result contains a value.
| p | void* pointer returned by gen-next |
true if p is non-NULL (a value was yielded), false if the generator was exhausted and gen-next returned NULL.
(let [v (gen-next g)]
(when (gen-some? v) (println (gen-unwrap v))))
Since: GF2
gen-unwrap
(gen-unwrap [p :ptr<void>] :int)
extract the int64_t value from a gen-next pointer.
| p | a non-NULL void* pointer returned by gen-next |
The int64_t value that was yielded.
(gen-unwrap (gen-next g)) ; => yielded int value
Since: GF2
gen-none
(gen-none :ptr<void>)
return a null generator result representing no value.
NULL as :ptr<void>; test with gen-some? to distinguish from a real value.
(gen-none) ; => NULL
Since: GF2
gen-arr-new
(gen-arr-new :int)
allocate an empty array for use with gen-collect.
Opaque pointer to an empty array (len=0).
(let [a (gen-arr-new)] ...)
Since: GF2
gen-arr-push!
(gen-arr-push! [a val] :nil)
append val to the end of a gen-arr array.
| a | array pointer returned by gen-arr-new | |
| val | int64_t value to append |
(gen-arr-push! my-arr 42)
Since: GF2
gen-arr-len
(gen-arr-len [a] :int)
return the number of elements in a gen-arr array.
| a | array pointer returned by gen-arr-new |
Number of collected elements.
(gen-arr-len my-arr) ; => 3
Since: GF2
gen-arr-get
(gen-arr-get [a i] :int)
return the element at index i in a gen-arr array.
| a | array pointer returned by gen-arr-new | |
| i | zero-based index |
The int64_t value stored at position i.
(gen-arr-get my-arr 0) ; => first element
Since: GF2
gen-collect
(gen-collect [g])
materialise all yielded values into a gen-arr array.
| g | a generator expression |
A gen-arr-new array containing all int64_t values yielded by g. Iterate with gen-arr-len and gen-arr-get.
(let [arr (gen-collect g)]
(println (gen-arr-len arr)))
Since: GF2
gen-for-each
(gen-for-each [f g])
call f with every value yielded by a generator.
| f | a one-argument callable applied to each yielded value | |
| g | a generator expression |
(gen-for-each println my-gen)
Since: GF2
gen-nth
(gen-nth [n g])
return the nth (0-indexed) yielded value, or gen-none.
| n | zero-based index | |
| g | a generator expression |
The raw void* pointer from gen-next at position n, or gen-none (NULL) if the generator has fewer than n+1 values. Test with gen-some? and extract with gen-unwrap.
(let [v (gen-nth 2 my-gen)]
(when (gen-some? v) (println (gen-unwrap v))))
Since: GF2
yield*
(yield* [inner])
re-yield every value from an inner generator.
| inner | a generator expression whose values are to be forwarded |
(gen []
(yield* inner-gen)
(yield 99))
Since: GF2