package gen

  1. Overview
  2. Docs

Module type Gen_intf.SSource

Sourcetype 'a t
Sourceval empty : 'a t

Empty generator, with no elements

Sourceval singleton : 'a -> 'a t

One-element generator

Sourceval repeat : 'a -> 'a t

Repeat same element endlessly

Sourceval iterate : 'a -> ('a -> 'a) -> 'a t

iterate x f is [x; f x; f (f x); f (f (f x)); ...]

Sourceval unfold : ('b -> ('a * 'b) option) -> 'b -> 'a t

Dual of fold, with a deconstructing operation. It keeps on unfolding the 'b value into a new 'b, and a 'a which is yielded, until None is returned.

Sourceval init : ?limit:int -> (int -> 'a) -> 'a t

Calls the function, starting from 0, on increasing indices. If limit is provided and is a positive int, iteration will stop at the limit (excluded). For instance init ~limit:4 id will yield 0, 1, 2, and 3.

Basic combinators

Sourceval is_empty : _ t -> bool

Check whether the enum is empty. Pops an element, if any

Sourceval fold : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b

Fold on the generator, tail-recursively. Consumes the generator.

Sourceval reduce : ('a -> 'a -> 'a) -> 'a t -> 'a

Fold on non-empty sequences. Consumes the generator.

Sourceval scan : ('b -> 'a -> 'b) -> 'b -> 'a t -> 'b t

Like fold, but keeping successive values of the accumulator. Consumes the generator.

Sourceval unfold_scan : ('b -> 'a -> 'b * 'c) -> 'b -> 'a t -> 'c t

A mix of unfold and scan. The current state is combined with the current element to produce a new state, and an output value of type 'c.

  • since 0.2.2
Sourceval iter : ('a -> unit) -> 'a t -> unit

Iterate on the enum, consumes it.

Sourceval iteri : (int -> 'a -> unit) -> 'a t -> unit

Iterate on elements with their index in the enum, from 0, consuming it.

Sourceval length : _ t -> int

Length of an enum (linear time), consuming it

Sourceval map : ('a -> 'b) -> 'a t -> 'b t

Lazy map. No iteration is performed now, the function will be called when the result is traversed.

Sourceval append : 'a t -> 'a t -> 'a t

Append the two enums; the result contains the elements of the first, then the elements of the second enum.

Sourceval flatten : 'a gen t -> 'a t

Flatten the enumeration of generators

Sourceval flat_map : ('a -> 'b gen) -> 'a t -> 'b t

Monadic bind; each element is transformed to a sub-enum which is then iterated on, before the next element is processed, and so on.

Sourceval mem : ?eq:('a -> 'a -> bool) -> 'a -> 'a t -> bool

Is the given element, member of the enum?

Sourceval take : int -> 'a t -> 'a t

Take at most n elements

Sourceval drop : int -> 'a t -> 'a t

Drop n elements

Sourceval nth : int -> 'a t -> 'a

n-th element, or Not_found

  • raises Not_found

    if the generator contains less than n arguments

Sourceval take_nth : int -> 'a t -> 'a t

take_nth n g returns every element of g whose index is a multiple of n. For instance take_nth 2 (1--10) |> to_list will return 1;3;5;7;9

Sourceval filter : ('a -> bool) -> 'a t -> 'a t

Filter out elements that do not satisfy the predicate.

Sourceval take_while : ('a -> bool) -> 'a t -> 'a t

Take elements while they satisfy the predicate

Sourceval drop_while : ('a -> bool) -> 'a t -> 'a t

Drop elements while they satisfy the predicate

Sourceval filter_map : ('a -> 'b option) -> 'a t -> 'b t

Maps some elements to 'b, drop the other ones

Sourceval zip_index : 'a t -> (int * 'a) t

Zip elements with their index in the enum

Sourceval unzip : ('a * 'b) t -> 'a t * 'b t

Unzip into two sequences, splitting each pair

Sourceval partition : ('a -> bool) -> 'a t -> 'a t * 'a t

partition p l returns the elements that satisfy p, and the elements that do not satisfy p

Sourceval for_all : ('a -> bool) -> 'a t -> bool

Is the predicate true for all elements?

Sourceval exists : ('a -> bool) -> 'a t -> bool

Is the predicate true for at least one element?

Sourceval min : ?lt:('a -> 'a -> bool) -> 'a t -> 'a

Minimum element, according to the given comparison function.

Sourceval max : ?lt:('a -> 'a -> bool) -> 'a t -> 'a

Maximum element, see min

Sourceval eq : ?eq:('a -> 'a -> bool) -> 'a t -> 'a t -> bool

Equality of generators.

Sourceval lexico : ?cmp:('a -> 'a -> int) -> 'a t -> 'a t -> int

Lexicographic comparison of generators. If a generator is a prefix of the other one, it is considered smaller.

Sourceval compare : ?cmp:('a -> 'a -> int) -> 'a t -> 'a t -> int

Synonym for lexico

Sourceval find : ('a -> bool) -> 'a t -> 'a option

find p e returns the first element of e to satisfy p, or None.

Sourceval sum : int t -> int

Sum of all elements

Multiple iterators

Sourceval map2 : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t

Map on the two sequences. Stops once one of them is exhausted.

Sourceval iter2 : ('a -> 'b -> unit) -> 'a t -> 'b t -> unit

Iterate on the two sequences. Stops once one of them is exhausted.

Sourceval fold2 : ('acc -> 'a -> 'b -> 'acc) -> 'acc -> 'a t -> 'b t -> 'acc

Fold the common prefix of the two iterators

Sourceval for_all2 : ('a -> 'b -> bool) -> 'a t -> 'b t -> bool

Succeeds if all pairs of elements satisfy the predicate. Ignores elements of an iterator if the other runs dry.

Sourceval exists2 : ('a -> 'b -> bool) -> 'a t -> 'b t -> bool

Succeeds if some pair of elements satisfy the predicate. Ignores elements of an iterator if the other runs dry.

Sourceval zip_with : ('a -> 'b -> 'c) -> 'a t -> 'b t -> 'c t

Combine common part of the enums (stops when one is exhausted)

Sourceval zip : 'a t -> 'b t -> ('a * 'b) t

Zip together the common part of the enums

Complex combinators

Sourceval merge : 'a gen t -> 'a t

Pick elements fairly in each sub-generator. The merge of enums e1, e2, ... picks elements in e1, e2, in e3, e1, e2 .... Once a generator is empty, it is skipped; when they are all empty, and none remains in the input, their merge is also empty. For instance, merge [1;3;5] [2;4;6] will be, in disorder, 1;2;3;4;5;6.

Sourceval intersection : ?cmp:('a -> 'a -> int) -> 'a t -> 'a t -> 'a t

Intersection of two sorted sequences. Only elements that occur in both inputs appear in the output

Sourceval sorted_merge : ?cmp:('a -> 'a -> int) -> 'a t -> 'a t -> 'a t

Merge two sorted sequences into a sorted sequence

Sourceval sorted_merge_n : ?cmp:('a -> 'a -> int) -> 'a t list -> 'a t

Sorted merge of multiple sorted sequences

Sourceval tee : ?n:int -> 'a t -> 'a gen list

Duplicate the enum into n generators (default 2). The generators share the same underlying instance of the enum, so the optimal case is when they are consumed evenly

Sourceval round_robin : ?n:int -> 'a t -> 'a gen list

Split the enum into n generators in a fair way. Elements with index = k mod n with go to the k-th enum. n default value is 2.

Sourceval interleave : 'a t -> 'a t -> 'a t

interleave a b yields an element of a, then an element of b, and so on. When a generator is exhausted, this behaves like the other generator.

Sourceval intersperse : 'a -> 'a t -> 'a t

Put the separator element between all elements of the given enum

Sourceval product : 'a t -> 'b t -> ('a * 'b) t

Cartesian product, in no predictable order. Works even if some of the arguments are infinite.

Sourceval group : ?eq:('a -> 'a -> bool) -> 'a t -> 'a list t

Group equal consecutive elements together.

Sourceval uniq : ?eq:('a -> 'a -> bool) -> 'a t -> 'a t

Remove consecutive duplicate elements. Basically this is like fun e -> map List.hd (group e).

Sourceval sort : ?cmp:('a -> 'a -> int) -> 'a t -> 'a t

Sort according to the given comparison function. The enum must be finite.

Sourceval sort_uniq : ?cmp:('a -> 'a -> int) -> 'a t -> 'a t

Sort and remove duplicates. The enum must be finite.

Sourceval chunks : int -> 'a t -> 'a array t

chunks n e returns a generator of arrays of length n, composed of successive elements of e. The last array may be smaller than n

Sourceval permutations : 'a t -> 'a list t

Permutations of the enum.

  • since 0.2.2
Sourceval combinations : int -> 'a t -> 'a list t

Combinations of given length. The ordering of the elements within each combination is unspecified. Example (ignoring ordering): combinations 2 (1--3) |> to_list = [[1;2]; [1;3]; [2;3]]

  • since 0.2.2
Sourceval power_set : 'a t -> 'a list t

All subsets of the enum (in no particular order). The ordering of the elements within each subset is unspecified.

  • since 0.2.2

Basic conversion functions

Sourceval of_list : 'a list -> 'a t

Enumerate elements of the list

Sourceval to_list : 'a t -> 'a list

non tail-call trasnformation to list, in the same order

Sourceval to_rev_list : 'a t -> 'a list

Tail call conversion to list, in reverse order (more efficient)

Sourceval to_array : 'a t -> 'a array

Convert the enum to an array (not very efficient)

Sourceval of_array : ?start:int -> ?len:int -> 'a array -> 'a t

Iterate on (a slice of) the given array

Sourceval rand_int : int -> int t

Random ints in the given range.

Sourceval int_range : int -> int -> int t

int_range a b enumerates integers between a and b, included. a is assumed to be smaller than b.

Sourcemodule Infix : sig ... end
Sourceval (--) : int -> int -> int t

Synonym for int_range

Sourceval (>>=) : 'a t -> ('a -> 'b gen) -> 'b t

Monadic bind operator

Sourceval pp : ?start:string -> ?stop:string -> ?sep:string -> ?horizontal:bool -> (Format.formatter -> 'a -> unit) -> Format.formatter -> 'a t -> unit

Pretty print the content of the generator on a formatter.

OCaml

Innovation. Community. Security.