This module defines the Set module for Base. Functions that construct a set take
as an argument the comparator for the element type.
type ('elt, 'cmp) tThe type of a set. The first type parameter identifies the type of the element, and the second identifies the comparator, which determines the comparison function that is used for ordering elements in this set. Many operations (e.g., union), require that they be passed sets with the same element type and the same comparator type.
type ('k, 'cmp) comparator = (module Base.Comparator.S with type comparator_witness = 'cmp and type t = 'k)val invariants : (_, _) t ‑> boolTests internal invariants of the set data structure. Returns true on success.
val comparator_s : ('a, 'cmp) t ‑> ('a, 'cmp) comparatorReturns a first-class module that can be used to build other map/set/etc with the same notion of comparison.
val comparator : ('a, 'cmp) t ‑> ('a, 'cmp) Base.Comparator.tval empty : ('a, 'cmp) comparator ‑> ('a, 'cmp) tCreates an empty set based on the provided comparator.
val singleton : ('a, 'cmp) comparator ‑> 'a ‑> ('a, 'cmp) tCreates a set based on the provided comparator that contains only the provided element.
val union_list : ('a, 'cmp) comparator ‑> ('a, 'cmp) t list ‑> ('a, 'cmp) tunion c list returns the union of all the sets in list. The
comparator argument is required for the case where list is empty.
O(max(List.length list, n log n)), where n is the sum of sizes of the input sets.
diff t1 t2 computes the set difference t1 - t2, i.e., the set containing all
elements in t1 that are not in t2. O(length t1 + length t2).
val symmetric_diff : ('a, 'cmp) t ‑> ('a, 'cmp) t ‑> ('a, 'a) Base.Either.t Base.Sequence.tsymmetric_diff t1 t2 returns a sequence of changes between t1 and t2. It is
intended to be efficient in the case where t1 and t2 share a large amount of
structure.
compare_direct t1 t2 compares the sets t1 and t2. It returns the same result
as compare, but unlike compare, doesn't require arguments to be passed in for the
type parameters of the set. O(length t1 + length t2).
val hash_fold_direct : 'a Base.Hash.folder ‑> ('a, 'cmp) t Base.Hash.folderHash function: a building block to use when hashing data structures containing sets in
them. hash_fold_direct hash_fold_key is compatible with compare_direct iff
hash_fold_key is compatible with (comparator s).compare of the set s being
hashed.
val exists : ('a, _) t ‑> f:('a ‑> bool) ‑> boolexists t ~f returns true iff there exists an a in t for which f a. O(n),
but returns as soon as it finds an a for which f a.
val for_all : ('a, _) t ‑> f:('a ‑> bool) ‑> boolfor_all t ~f returns true iff for all a in t, f a. O(n), but returns as
soon as it finds an a for which not (f a).
val count : ('a, _) t ‑> f:('a ‑> bool) ‑> intcount t returns the number of elements of t for which f returns true.
O(n).
val sum : (module Base.Commutative_group.S with type t = 'sum) ‑> ('a, _) t ‑> f:('a ‑> 'sum) ‑> 'sumsum t returns the sum of f t for each t in the set.
O(n).
val find : ('a, _) t ‑> f:('a ‑> bool) ‑> 'a optionfind t f returns an element of t for which f returns true, with no guarantee as
to which element is returned. O(n), but returns as soon as a suitable element is
found.
val find_map : ('a, _) t ‑> f:('a ‑> 'b option) ‑> 'b optionfind_map t f returns b for some a in t for which f a = Some b. If no such
a exists, then find returns None. O(n), but returns as soon as a suitable
element is found.
val nth : ('a, _) t ‑> int ‑> 'a optionnth t i returns the ith smallest element of t, in O(log n) time. The
smallest element has i = 0. Returns None if i < 0 or i >= length t.
remove_index t i returns a version of t with the ith smallest element removed,
in O(log n) time. The smallest element has i = 0. Returns t if i < 0 or
i >= length t.
subset is a synonym for is_subset.
module Named : sig ... endNamed allows the validation of subset and equality relationships between sets. A
Named.t is a record of a set and a name, where the name is used in error messages,
and Named.is_subset and Named.equal validate subset and equality relationships
respectively.
val of_list : ('a, 'cmp) comparator ‑> 'a list ‑> ('a, 'cmp) tThe list or array given to of_list and of_array need not be sorted.
val of_array : ('a, 'cmp) comparator ‑> 'a array ‑> ('a, 'cmp) tval to_list : ('a, _) t ‑> 'a listto_list and to_array produce sequences sorted in ascending order according to the
comparator.
val to_array : ('a, _) t ‑> 'a arrayval of_sorted_array : ('a, 'cmp) comparator ‑> 'a array ‑> ('a, 'cmp) t Base.Or_error.tCreate set from sorted array. The input must be sorted (either in ascending or
descending order as given by the comparator) and contain no duplicates, otherwise the
result is an error. The complexity of this function is O(n).
val of_sorted_array_unchecked : ('a, 'cmp) comparator ‑> 'a array ‑> ('a, 'cmp) tSimilar to of_sorted_array, but without checking the input array.
val of_increasing_iterator_unchecked : ('a, 'cmp) comparator ‑> len:int ‑> f:(int ‑> 'a) ‑> ('a, 'cmp) tof_increasing_iterator_unchecked c ~len ~f behaves like of_sorted_array_unchecked c
(Array.init len ~f), with the additional restriction that a decreasing order is not
supported. The advantage is not requiring you to allocate an intermediate array. f
will be called with 0, 1, ... len - 1, in order.
val stable_dedup_list : ('a, _) comparator ‑> 'a list ‑> 'a liststable_dedup_list is here rather than in the List module because the
implementation relies crucially on sets, and because doing so allows one to avoid uses
of polymorphic comparison by instantiating the functor at a different implementation
of Comparator and using the resulting stable_dedup_list.
val map : ('b, 'cmp) comparator ‑> ('a, _) t ‑> f:('a ‑> 'b) ‑> ('b, 'cmp) tmap c t ~f returns a new set created by applying f to every element in
t. The returned set is based on the provided comparator. O(n log n).
val filter_map : ('b, 'cmp) comparator ‑> ('a, _) t ‑> f:('a ‑> 'b option) ‑> ('b, 'cmp) tLike map, except elements for which f returns None will be dropped.
val fold : ('a, _) t ‑> init:'accum ‑> f:('accum ‑> 'a ‑> 'accum) ‑> 'accumfold t ~init ~f folds over the elements of the set from smallest to largest.
val fold_result : ('a, _) t ‑> init:'accum ‑> f:('accum ‑> 'a ‑> ('accum, 'e) Base.Result.t) ‑> ('accum, 'e) Base.Result.tfold_result ~init ~f folds over the elements of the set from smallest to
largest, short circuiting the fold if f accum x is an Error _
val fold_until : ('a, _) t ‑> init:'accum ‑> f:('accum ‑> 'a ‑> ('accum, 'final) Base__.Set_intf.Continue_or_stop.t) ‑> finish:('accum ‑> 'final) ‑> 'finalfold_until t ~init ~f is a short-circuiting version of fold. If f
returns Stop _ the computation ceases and results in that value. If f returns
Continue _, the fold will proceed.
val fold_right : ('a, _) t ‑> init:'accum ‑> f:('a ‑> 'accum ‑> 'accum) ‑> 'accumLike fold, except that it goes from the largest to the smallest element.
val iter : ('a, _) t ‑> f:('a ‑> unit) ‑> unititer t ~f calls f on every element of t, going in order from the smallest to
largest.
val iter2 : ('a, 'cmp) t ‑> ('a, 'cmp) t ‑> f:([ `Left of 'a | `Right of 'a | `Both of 'a * 'a ] ‑> unit) ‑> unitIterate two sets side by side. Complexity is O(m+n) where m and n are the sizes
of the two input sets. As an example, with the inputs 0; 1 and 1; 2, f will be
called with `Left 0; `Both (1, 1); and `Right 2.
if a, b = partition_tf set ~f then a is the elements on which f produced true,
and b is the elements on which f produces false.
split t x produces a triple (t1, maybe_x, t2) where t1 is the set of elements
strictly less than x, maybe_x is the member (if any) of t which compares equal
to x, and t2 is the set of elements strictly larger than x.
if equiv is an equivalence predicate, then group_by set ~equiv produces a list
of equivalence classes (i.e., a set-theoretic quotient). E.g.,
let chars = Set.of_list ['A'; 'a'; 'b'; 'c'] in
let equiv c c' = Char.equal (Char.uppercase c) (Char.uppercase c') in
group_by chars ~equivproduces:
[Set.of_list ['A';'a']; Set.singleton 'b'; Set.singleton 'c']group_by runs in O(n^2) time, so if you have a comparison function, it's usually
much faster to use Set.of_list.
val to_sequence : ?order:[ `Increasing | `Decreasing ] ‑> ?greater_or_equal_to:'a ‑> ?less_or_equal_to:'a ‑> ('a, 'cmp) t ‑> 'a Base.Sequence.tto_sequence t converts the set t to a sequence of the elements between
greater_or_equal_to and less_or_equal_to inclusive in the order indicated by
order. If greater_or_equal_to > less_or_equal_to the sequence is empty. Cost is
O(log n) up front and amortized O(1) for each element produced.
module Merge_to_sequence_element : sig ... endProduces the elements of the two sets between greater_or_equal_to and
less_or_equal_to in order, noting whether each element appears in the left set,
the right set, or both. In the both case, both elements are returned, in case the
caller can distinguish between elements that are equal to the sets' comparator. Runs
in O(length t + length t').
val merge_to_sequence : ?order:[ `Increasing | `Decreasing ] ‑> ?greater_or_equal_to:'a ‑> ?less_or_equal_to:'a ‑> ('a, 'cmp) t ‑> ('a, 'cmp) t ‑> ('a, 'a) Merge_to_sequence_element.t Base.Sequence.tmodule type Sexp_of_m : sig ... endmodule type M_of_sexp : sig ... endmodule type Compare_m : sig ... endmodule type Hash_fold_m = Base.Hasher.Sval sexp_of_m__t : (module Sexp_of_m with type t = 'elt) ‑> ('elt, 'cmp) t ‑> Base.Sexp.tval m__t_of_sexp : (module M_of_sexp with type comparator_witness = 'cmp and type t = 'elt) ‑> Base.Sexp.t ‑> ('elt, 'cmp) tval hash_fold_m__t : (module Hash_fold_m with type t = 'elt) ‑> Base.Hash.state ‑> ('elt, _) t ‑> Base.Hash.statemodule Poly : Base__.Set_intf.S_poly with type 'elt t = ('elt, Base.Comparator.Poly.comparator_witness) tA polymorphic Set.
module Using_comparator : sig ... endUsing comparator is a similar interface as the toplevel of Set, except the functions
take a ~comparator:('elt, 'cmp) Comparator.t where the functions at the toplevel of
Set takes a ('elt, 'cmp) comparator.
SetFor use in extensions of Base, like Core_kernel.
module With_comparator = Base__.Set_intf.With_comparatormodule With_first_class_module = Base__.Set_intf.With_first_class_modulemodule Without_comparator = Base__.Set_intf.Without_comparatormodule type S_poly = Base__.Set_intf.S_polymodule type Accessors0 = Base__.Set_intf.Accessors0module type Accessors1 = Base__.Set_intf.Accessors1module type Accessors2 = Base__.Set_intf.Accessors2module type Accessors_generic = Base__.Set_intf.Accessors_genericmodule type Creators0 = Base__.Set_intf.Creators0module type Creators1 = Base__.Set_intf.Creators1module type Creators2 = Base__.Set_intf.Creators2module type Creators_generic = Base__.Set_intf.Creators_genericmodule type Elt_plain = Base__.Set_intf.Elt_plain