Module Core_kernel.Set
This module defines the Set module for Core. Functions that construct a set take as an argument the comparator for the element type.
This module uses the same organizational approach as Map.
type ('elt, 'cmp) t= ('elt, 'cmp) Base.Set.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.
val compare : ('elt -> 'elt -> Core_kernel__.Import.int) -> ('cmp -> 'cmp -> Core_kernel__.Import.int) -> ('elt, 'cmp) t -> ('elt, 'cmp) t -> Core_kernel__.Import.int
type ('k, 'cmp) comparator= (module Comparator.S with type comparator_witness = 'cmp and type t = 'k)
module Tree : sig ... endmodule Using_comparator : sig ... endval invariants : (_, _) t -> Core_kernel__.Import.boolTests internal invariants of the set data structure. Returns true on success.
val comparator : ('a, 'cmp) t -> ('a, 'cmp) 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 length : (_, _) t -> Core_kernel__.Import.intReturns the cardinality of the set.
O(1).
val is_empty : (_, _) t -> Core_kernel__.Import.boolis_empty tistrueifftis empty.O(1).
val mem : ('a, _) t -> 'a -> Core_kernel__.Import.boolmem t areturnstrueiffais int.O(log n).
val add : ('a, 'cmp) t -> 'a -> ('a, 'cmp) tadd t areturns a new set withaadded tot, or returnstifmem t a.O(log n).
val remove : ('a, 'cmp) t -> 'a -> ('a, 'cmp) tremove t areturns a new set witharemoved fromtifmem t a, or returnstotherwise.O(log n).
val union : ('a, 'cmp) t -> ('a, 'cmp) t -> ('a, 'cmp) tunion t1 t2returns the union of the two sets.O(length t1 + length t2).
val union_list : ('a, 'cmp) comparator -> ('a, 'cmp) t Core_kernel__.Import.list -> ('a, 'cmp) tunion c listreturns the union of all the sets inlist. Thecargument is required for the case wherelistis empty.O(max(List.length list, n log n)), wherenis the sum of sizes of the input sets.
val inter : ('a, 'cmp) t -> ('a, 'cmp) t -> ('a, 'cmp) tinter t1 t2computes the intersection of setst1andt2.O(length t1 + length t2).
val diff : ('a, 'cmp) t -> ('a, 'cmp) t -> ('a, 'cmp) tdiff t1 t2computes the set differencet1 - t2, i.e., the set containing all elements int1that are not int2.O(length t1 + length t2).
val symmetric_diff : ('a, 'cmp) t -> ('a, 'cmp) t -> ('a, 'a) Either.t Sequence.tsymmetric_diff t1 t2returns a sequence of changes betweent1andt2. It is intended to be efficient in the case wheret1andt2share a large amount of structure.
val compare_direct : ('a, 'cmp) t -> ('a, 'cmp) t -> Core_kernel__.Import.intcompare_direct t1 t2compares the setst1andt2. It returns the same result ascompare, 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 Core_kernel__.Import.Hash.folder -> ('a, 'cmp) t Core_kernel__.Import.Hash.folderHash function: a building block to use when hashing data structures containing sets in them.
hash_fold_direct hash_fold_keyis compatible withcompare_directiffhash_fold_keyis compatible with(comparator s).compareof the setsbeing hashed.
val equal : ('a, 'cmp) t -> ('a, 'cmp) t -> Core_kernel__.Import.boolequal t1 t2returnstrueiff the two sets have the same elements.O(length t1 + length t2)
val exists : ('a, _) t -> f:('a -> Core_kernel__.Import.bool) -> Core_kernel__.Import.boolexists t ~freturnstrueiff there exists anaintfor whichf a.O(n), but returns as soon as it finds anafor whichf a.
val for_all : ('a, _) t -> f:('a -> Core_kernel__.Import.bool) -> Core_kernel__.Import.boolfor_all t ~freturnstrueiff for allaint,f a.O(n), but returns as soon as it finds anafor whichnot (f a).
val count : ('a, _) t -> f:('a -> Core_kernel__.Import.bool) -> Core_kernel__.Import.intcount treturns the number of elements oftfor whichfreturnstrue.O(n).
val sum : (module Set_intf.Container.Summable with type t = 'sum) -> ('a, _) t -> f:('a -> 'sum) -> 'sumsum treturns the sum off tfor eachtin the set.O(n).
val find : ('a, _) t -> f:('a -> Core_kernel__.Import.bool) -> 'a Core_kernel__.Import.optionfind t freturns an element oftfor whichfreturns 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 Core_kernel__.Import.option) -> 'b Core_kernel__.Import.optionfind_map t freturnsbfor someaintfor whichf a = Some b. If no suchaexists, thenfindreturnsNone.O(n), but returns as soon as a suitable element is found.
val find_exn : ('a, _) t -> f:('a -> Core_kernel__.Import.bool) -> 'aLike
find, but throws an exception on failure.
val nth : ('a, _) t -> Core_kernel__.Import.int -> 'a Core_kernel__.Import.optionnth t ireturns theith smallest element oft, inO(log n)time. The smallest element hasi = 0. ReturnsNoneifi < 0ori >= length t.
val remove_index : ('a, 'cmp) t -> Core_kernel__.Import.int -> ('a, 'cmp) tremove_index t ireturns a version oftwith theith smallest element removed, inO(log n)time. The smallest element hasi = 0. Returnstifi < 0ori >= length t.
val is_subset : ('a, 'cmp) t -> of_:('a, 'cmp) t -> Core_kernel__.Import.boolis_subset t1 ~of_:t2returns true ifft1is a subset oft2.
val are_disjoint : ('a, 'cmp) t -> ('a, 'cmp) t -> Core_kernel__.Import.boolare_disjoint t1 t2returnstrueiffis_empty (inter t1 t2), but is more efficient.
module Named : sig ... endNamedallows the validation of subset and equality relationships between sets. ANamed.tis a record of a set and a name, where the name is used in error messages, andNamed.is_subsetandNamed.equalvalidate subset and equality relationships respectively.
val of_list : ('a, 'cmp) comparator -> 'a Core_kernel__.Import.list -> ('a, 'cmp) tThe list or array given to
of_listandof_arrayneed not be sorted.
val of_array : ('a, 'cmp) comparator -> 'a Core_kernel__.Import.array -> ('a, 'cmp) tval of_hash_set : ('a, 'cmp) comparator -> 'a Hash_set.t -> ('a, 'cmp) tval of_hashtbl_keys : ('a, 'cmp) comparator -> ('a, _) Hashtbl.t -> ('a, 'cmp) tval to_list : ('a, _) t -> 'a Core_kernel__.Import.listto_listandto_arrayproduce sequences sorted in ascending order according to the comparator.
val to_array : ('a, _) t -> 'a Core_kernel__.Import.arrayval to_tree : ('a, 'cmp) t -> ('a, 'cmp) Tree.tval of_tree : ('a, 'cmp) comparator -> ('a, 'cmp) Tree.t -> ('a, 'cmp) tval of_sorted_array : ('a, 'cmp) comparator -> 'a Core_kernel__.Import.array -> ('a, 'cmp) t 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 Core_kernel__.Import.array -> ('a, 'cmp) tSimilar to
of_sorted_array, but without checking the input array.
val of_increasing_iterator_unchecked : ('a, 'cmp) comparator -> len:Core_kernel__.Import.int -> f:(Core_kernel__.Import.int -> 'a) -> ('a, 'cmp) tof_increasing_iterator_unchecked c ~len ~fbehaves likeof_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.fwill be called with 0, 1, ...len - 1, in order.
val stable_dedup_list : ('a, _) comparator -> 'a Core_kernel__.Import.list -> 'a Core_kernel__.Import.liststable_dedup_listis here rather than in theListmodule 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 ofComparatorand using the resultingstable_dedup_list.
val map : ('b, 'cmp) comparator -> ('a, _) t -> f:('a -> 'b) -> ('b, 'cmp) tmap c t ~freturns a new set created by applyingfto every element int. The returned set is based on the providedc.O(n log n).
val filter_map : ('b, 'cmp) comparator -> ('a, _) t -> f:('a -> 'b Core_kernel__.Import.option) -> ('b, 'cmp) tLike
map, except elements for whichfreturnsNonewill be dropped.
val filter : ('a, 'cmp) t -> f:('a -> Core_kernel__.Import.bool) -> ('a, 'cmp) tfilter t ~freturns the subset oftfor whichfevaluates to true.O(n log n).
val fold : ('a, _) t -> init:'accum -> f:('accum -> 'a -> 'accum) -> 'accumfold t ~init ~ffolds over the elements of the set from smallest to largest.
val fold_result : ('a, _) t -> init:'accum -> f:('accum -> 'a -> ('accum, 'e) Result.t) -> ('accum, 'e) Result.tfold_result ~init ~ffolds over the elements of the set from smallest to largest, short circuiting the fold iff accum xis anError _
val fold_until : ('a, _) t -> init:'accum -> f:('accum -> 'a -> ('accum, 'final) Set_intf.Continue_or_stop.t) -> finish:('accum -> 'final) -> 'finalfold_until t ~init ~fis a short-circuiting version offold. IffreturnsStop _the computation ceases and results in that value. IffreturnsContinue _, 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 -> Core_kernel__.Import.unit) -> Core_kernel__.Import.unititer t ~fcallsfon every element oft, 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 ] -> Core_kernel__.Import.unit) -> Core_kernel__.Import.unitIterate two sets side by side. Complexity is
O(m+n)wheremandnare the sizes of the two input sets. As an example, with the inputs0; 1and1; 2,fwill be called with`Left 0;`Both (1, 1); and`Right 2.
val partition_tf : ('a, 'cmp) t -> f:('a -> Core_kernel__.Import.bool) -> ('a, 'cmp) t * ('a, 'cmp) tIf
a, b = partition_tf set ~fthenais the elements on whichfproducedtrue, andbis the elements on whichfproducesfalse.
val elements : ('a, _) t -> 'a Core_kernel__.Import.listSame as
to_list.
val min_elt : ('a, _) t -> 'a Core_kernel__.Import.optionReturns the smallest element of the set.
O(log n).
val max_elt : ('a, _) t -> 'a Core_kernel__.Import.optionReturns the largest element of the set.
O(log n).
val choose : ('a, _) t -> 'a Core_kernel__.Import.optionreturns an arbitrary element, or
Noneif the set is empty.
val split : ('a, 'cmp) t -> 'a -> ('a, 'cmp) t * 'a Core_kernel__.Import.option * ('a, 'cmp) tsplit t xproduces a triple(t1, maybe_x, t2)wheret1is the set of elements strictly less thanx,maybe_xis the member (if any) oftwhich compares equal tox, andt2is the set of elements strictly larger thanx.
val group_by : ('a, 'cmp) t -> equiv:('a -> 'a -> Core_kernel__.Import.bool) -> ('a, 'cmp) t Core_kernel__.Import.listIf
equivis an equivalence predicate, thengroup_by set ~equivproduces 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_byruns in O(n^2) time, so if you have a comparison function, it's usually much faster to useSet.of_list.
val to_sequence : ?order:[ `Increasing | `Decreasing ] -> ?greater_or_equal_to:'a -> ?less_or_equal_to:'a -> ('a, 'cmp) t -> 'a Sequence.tto_sequence tconverts the settto a sequence of the elements betweengreater_or_equal_toandless_or_equal_toinclusive in the order indicated byorder. Ifgreater_or_equal_to > less_or_equal_tothe sequence is empty. Cost is O(log n) up front and amortized O(1) for each element produced.
val binary_search : ('a, 'cmp) t -> compare:('a -> 'key -> Core_kernel__.Import.int) -> [ `Last_strictly_less_than | `Last_less_than_or_equal_to | `Last_equal_to | `First_equal_to | `First_greater_than_or_equal_to | `First_strictly_greater_than ] -> 'key -> 'a Core_kernel__.Import.optionbinary_search t ~compare which eltreturns the element intspecified bycompareandwhich, if one exists.tmust be sorted in increasing order according tocompare, wherecompareandeltdividetinto three (possibly empty) segments:| < elt | = elt | > elt |
binary_searchreturns an element on the boundary of segments as specified bywhich. See the diagram below next to thewhichvariants.binary_searchdoes not check thatcompareorderst, and behavior is unspecified ifcomparedoesn't ordert. Behavior is also unspecified ifcomparemutatest.
val binary_search_segmented : ('a, 'cmp) t -> segment_of:('a -> [ `Left | `Right ]) -> [ `Last_on_left | `First_on_right ] -> 'a Core_kernel__.Import.optionbinary_search_segmented t ~segment_of whichtakes asegment_offunction that dividestinto two (possibly empty) segments:| segment_of elt = `Left | segment_of elt = `Right |
binary_search_segmentedreturns the element on the boundary of the segments as specified bywhich:`Last_on_leftyields the last element of the left segment, while`First_on_rightyields the first element of the right segment. It returnsNoneif the segment is empty.binary_search_segmenteddoes not check thatsegment_ofsegmentstas in the diagram, and behavior is unspecified ifsegment_ofdoesn't segmentt. Behavior is also unspecified ifsegment_ofmutatest.
module Merge_to_sequence_element : sig ... endProduces the elements of the two sets between
greater_or_equal_toandless_or_equal_toinorder, 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 Sequence.tval to_map : ('key, 'cmp) t -> f:('key -> 'data) -> ('key, 'data, 'cmp) Base.Map.tConvert a set to or from a map.
to_maptakes a function to produce data for each key. Both functions run in O(n) time (assuming the function passed toto_mapruns in constant time).
val of_map_keys : ('key, _, 'cmp) Base.Map.t -> ('key, 'cmp) tval quickcheck_generator : ('key, 'cmp) comparator -> 'key Quickcheck.Generator.t -> ('key, 'cmp) t Quickcheck.Generator.tval quickcheck_observer : 'key Quickcheck.Observer.t -> ('key, 'cmp) t Quickcheck.Observer.tval quickcheck_shrinker : 'key Quickcheck.Shrinker.t -> ('key, 'cmp) t Quickcheck.Shrinker.t
Polymorphic sets
Module Poly deals with sets that use OCaml's polymorphic comparison to compare elements.
Signatures and functors for building Set modules
module type Elt_plain = Set_intf.Elt_plainmodule type Elt = Set_intf.EltThe signature that something needs to match in order to be used as a set element.
module type Elt_binable = Set_intf.Elt_binableThe signature that something needs to match in order to be used as a set element if the resulting set is going to support
bin_io.
module type S_plain = Set_intf.S_plainModule signature for a Set that doesn't support
of_sexp.
module type S = Set_intf.SModule signature for a Set.
module type S_binable = Set_intf.S_binableModule signature for a Set that supports
bin_io.
module Make_plain : functor (Elt : Elt_plain) -> S_plain with type Elt.t = Elt.tMakebuilds a set from an element type that has acomparefunction but doesn't have a comparator. This generates a new comparator.
module Make_binable : functor (Elt : Elt_binable) -> S_binable with type Elt.t = Elt.tmodule Make_plain_using_comparator : functor (Elt : sig ... end) -> S_plain with type Elt.t = Elt.t with type Elt.comparator_witness = Elt.comparator_witnessmodule Make_using_comparator : functor (Elt : sig ... end) -> S with type Elt.t = Elt.t with type Elt.comparator_witness = Elt.comparator_witnessMake_using_comparatorbuilds a set from an element type that has a comparator.
module Make_binable_using_comparator : functor (Elt : sig ... end) -> S_binable with type Elt.t = Elt.t with type Elt.comparator_witness = Elt.comparator_witnessmodule Elt_bin_io = Set_intf.Elt_bin_ioinclude Set_intf.For_deriving with type ('a, 'b) t := ('a, 'b) t
include Base.Set.For_deriving
module type Sexp_of_m = sig ... endmodule type M_of_sexp = sig ... endmodule type Compare_m = sig ... endmodule type Equal_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 compare_m__t : (module Compare_m) -> ('elt, 'cmp) t -> ('elt, 'cmp) t -> intval equal_m__t : (module Equal_m) -> ('elt, 'cmp) t -> ('elt, 'cmp) t -> boolval hash_fold_m__t : (module Hash_fold_m with type t = 'elt) -> Base.Hash.state -> ('elt, 'a) t -> Base.Hash.stateval hash_m__t : (module Hash_fold_m with type t = 'elt) -> ('elt, 'a) t -> int
module M = Base.Set.Mval bin_shape_m__t : ('a, 'b) Set_intf.Elt_bin_io.t -> Bin_prot.Shape.tval bin_size_m__t : ('a, 'b) Set_intf.Elt_bin_io.t -> ('a, 'b) t Bin_prot.Size.sizerval bin_write_m__t : ('a, 'b) Set_intf.Elt_bin_io.t -> ('a, 'b) t Bin_prot.Write.writerval bin_read_m__t : ('a, 'b) Set_intf.Elt_bin_io.t -> ('a, 'b) t Bin_prot.Read.readerval __bin_read_m__t__ : ('a, 'b) Set_intf.Elt_bin_io.t -> (Core_kernel__.Import.int -> ('a, 'b) t) Bin_prot.Read.reader
module type Quickcheck_generator_m = sig ... endmodule type Quickcheck_observer_m = sig ... endmodule type Quickcheck_shrinker_m = sig ... endval quickcheck_generator_m__t : (module Quickcheck_generator_m with type comparator_witness = 'cmp and type t = 'a) -> ('a, 'cmp) t Quickcheck.Generator.tval quickcheck_observer_m__t : (module Quickcheck_observer_m with type comparator_witness = 'cmp and type t = 'a) -> ('a, 'cmp) t Quickcheck.Observer.tval quickcheck_shrinker_m__t : (module Quickcheck_shrinker_m with type comparator_witness = 'cmp and type t = 'a) -> ('a, 'cmp) t Quickcheck.Shrinker.t
module Stable : sig ... endThe following types and functors may be used to define stable modules.