Caml1999I0372 5$$b+Stdlib__Set+OrderedType$!t(;@@@A@@@@@'set.mlitt@@@@@@A@'compare)@@@@@@@@@@@@#intA@@@@@@@@w w@@1A@@@@#rxx$  @5B@@!S%#elt*;@@@A@@@@@4G  "5G  *@@@@FC@A@!t+;@@@A@@@@@>J U Y?J U _@@@@PD@A@%empty,@@@@KM ~ LM ~ @@]E@@#add-@+@@@@@@@@@@@@@@@@@@@fP  gP  @@xF@@)singleton.@@@@@@/@@@@@@yV  zV  @@G@@&remove/@.@@@@@@F@@@@@I@@@@@@@@Y 5 9Y 5 R@@H@@%union0@Y@@@@@@`@@@@@c@@@@@@@@_]a_]w@@I@@%inter1@s@@@@@@z@@@@@}@@@@@@@@bb@@J@@(disjoint2@@@@@@@@@@@@$boolE@@@@@@@@ee@@K@@$diff3@@@@@@@@@@@@@@@@@@@@i(,i(A@@L@@(cardinal4@@@@@@@@@@@@mm@@$M@@(elements5@@@@@@$listK@@@@@@@@@,r-r7@@>N@@'min_elt6@@@@@@@@@@@@?x @x5@@QO@@+min_elt_opt7@@@@@@&optionL@@@@@@@@@Y}Z}@@kP@@'max_elt8@@@@@@@@@@@@lm@@~Q@@+max_elt_opt9@2@@@@@-(@@@@@@@@@>@@R@@&choose:@J@@@ @@ <@@@ @@ @@@S@@*choose_opt;@]@@@ @@XS@@@@@@@@@@@T@@$find<@d@@@@@@|@@@@@n@@@@@@@@@@U@@(find_opt=@~@@@@@@@@@@@@@@@@@@@@@ @x|x@@V@@*find_first>@@@@@!@@"@@@#@@$@@%@@@@&@@'@@@(@@)@@*@ KO Kx@@W@@.find_first_opt?@@@@@+@@,@@@@-@@.@@/@@@@0@@1ڠ@@@2@@@3@@4@@5@1RV2R@@CX@@)find_last@@@@@@6@@7g@@@8@@9@@:@@@@;@@<@@@=@@>@@?@S{T{@@eY@@-find_last_optA@@ @@@@@@A@@@B@@C@@D@(@@@E@@F#@@@G@@@H@@I@@J@z{@@Z@@$iterB@@3@@@K@@L$unitF@@@M@@N@@O@Q@@@P@@Q @@@R@@S@@T@@@[@@$foldC@@X@@@U@@V@#acc@^@@W@@X@@Y@@Z@x@@@[@@\@@@]@@_@@`@@a@@@\@@#mapD@@@@@b@@c@@@d@@e@@f@@@@g@@h@@@i@@j@@k@@@]@@&filterE@@@@@l@@m@@@n@@o@@p@@@@q@@r@@@s@@t@@u@      @@^@@*filter_mapF@@@@@v@@wΠ@@@x@@@y@@z@@{@@@@|@@}@@@~@@@@@/"" 0""7@@A_@@)partitionG@@@@@@@e@@@@@@@@@@@@@@ @@@@@@@@@@@@@@Z$;$?[$;$i@@l`@@%splitH@@@@@@@'@@@@@@.@@@@@@@@9@@@@@@@@@@%Z%^%Z%@@a@@(is_emptyI@I@@@@@@@@@@@'$'('$'?@@b@@,is_singletonJ@]@@@@@@@@@@@'p't'p'@@c@@#memK@`@@@@@@x@@@@@@@@@@@@@ '' '(@@d@@%equalL@@@@@@@@@@@@@@@@@@@@(A(E(A(^@@e@@'compareM@@@@@@@@@@@@@@@@@@@@((((@@f@@&subsetN@@@@@@@@@@@@5@@@@@@@@)_)c)_)}@@)g@@'for_allO@@@@@@@M@@@@@@@@@@@@@X@@@@@@@@:));)*@@Lh@@&existsP@@@@@@@p@@@@@@@@@@@@@{@@@@@@@@]*d*h^*d*@@oi@@'to_listQ@#@@@@@K@@@@@@@@@u%++!v%++<@@j@@'of_listR@`.@@@@@@@@C@@@@@@)+|+)+|+@@k@@+to_seq_fromS@B@@@@@@Z@@@@@&Stdlib#Seq!tV@@@@@@@@@@@/,w,{/,w,@@l@@&to_seqT@x@@@@@#Seq!tq@@@@@@@@@4-0-44-0-O@@m@@*to_rev_seqU@@@@@@9#Seq!t@@@@@@@@@8--8--@@n@@'add_seqV@Q#Seq!t@@@@@@@@@@@@@@@@@@@@@@ <.. <..4@@o@@&of_seqW@s#Seq!t@@@@@@@@@@@@@@%@..&@..@@7p@@@@)B  *C..@;q@@Ӡ$Make&@#Ord'D X;@@@A!t@@@@@@@FF//EGF//U@@@@Xs@A@Y;@@@A@@@@@@@@A@ Z @@@@ @ @[@&@@@@@@@@@@@@@@@@@@@@@\@@@@@@%@@@@@@@@]@$@@@@@@7@@@@@:@@@@@@@@@@^@E@@@@@@L@@@@@O@@@@@@@@@@_@Z@@@@@@a@@@@@d@@@@@@@@@@`@o@@@@@@v@@@@@@@@@@@@@@@a@@@@@@@@@@@@@@@@@@@@@@b@@@@@@@@@@@@@@c@@@@@@۠@@@@@@@@@@@d@@@@@@@@@@@@@@e@@@@@@Π@@@@@@@@@@@f@@@@@@@@@@@@@@g@@@@@@@@@@@@@@@@@h@@@@@@@@@@@@@@i@@@@@@@@@@@@@@@@@j@ @@@@@@ @@@@@@@@@@@@@@@k@"@@@@@@5@@@@@/@@@@@@@@@@@@@l@@?@@@@@@@@@@@@@U@@@@@L@@@@@@@@@@m@@[@@@@@@@@@@@@@q@@@@@k@@@@@@@@@@@@@n@@{@@@@@@@@@@@@@@@@@@@@@@@@@@@@o@@@@@@@@@@ @@ @@ @@@@ @@ @@@@@@@@@@@@@p@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@q@@@@@@@@@%@@@@@@ @@!@@@@"@@#@ @@$ @@&@@'@@(@@|@{r@@@@@)@@*@@@+@@,@@-@@@@.@@/ @@@0@@1@@2@z@w@vs@@@@@3@@4u@@@5@@6@@7@$@@@8@@9'@@@:@@;@@<@t@q@pt@@*@@@=@@>o0@@@?@@@@@@A@@B@D@@@C@@DG@@@E@@F@@G@n@k@ju@@J@@@H@@Ii@@@J@@K@@L@`@@@M@@N@g@@@P@l@@@O@@Q@@R@@S@h@e@dv@k@@@T@@U@~@@@V@@W@@@@Z@c@@@Y@@@@X@@[@@\@@]@b@_@^w@@@@^@@_]@@@`@@a@\@Y@Xx@@@@b@@cW@@@d@@e@V@S@Ry@@@@f@@g@@@@h@@iQ@@@j@@k@@l@P@M@Lz@@@@m@@n@@@@o@@pK@@@q@@r@@s@J@G@F{@@@@t@@u@@@@v@@wE@@@x@@y@@z@D@A@@|@@@@{@@|@@@@}@@~?@@@@@@@@>@;@:}@@@@@@@9@@@@@@@@@@@@@8@@@@@@@@7@4@3~@@@@@@@2@@@@@@@@4@@@@@1@@@@@@@@0@-@,@B@@@@@+<@@@@@@@@@*@'@&@%K@@@@@@@@[@@@@@@$@!@ @Z@@@@@@m@@@@@i@@@@@@@@@@@@@@@@@@@3}@@@@@@@@@@@@@@@@@G @@@@@@@@@ @ @@X@@@@@@@@@@@@@@@@@@@@@@@@@s@@@@@@@@@@@@@@@@@@ #F//@ 4t@@@@^L+Stdlib__Set0ܔ@Z8XWaa2+Stdlib__Seq0?72#[O.Stdlib__Either0HD ?|>&Stdlib0t0VoS%{<F:8CamlinternalFormatBasics0|.e1R$|o@@@Caml1999T037<}sC+Stdlib__Set*ocaml.text&_none_@@A  Sets over ordered types. This module implements the set data structure, given a total ordering function over the set elements. All operations over sets are purely applicative (no side-effects). The implementation uses balanced binary trees, and is therefore reasonably efficient: insertion and membership take time logarithmic in the size of the set, for instance. The {!Make} functor constructs implementations for any type, given a [compare] function. For instance: {[ module IntPairs = struct type t = int * int let compare (x0,y0) (x1,y1) = match Stdlib.compare x0 x1 with 0 -> Stdlib.compare y0 y1 | c -> c end module PairsSet = Set.Make(IntPairs) let m = PairsSet.(empty |> add (2,3) |> add (5,7) |> add (11,13)) ]} This creates a new module [PairsSet], with a new type [PairsSet.t] of sets of [int * int]. 'set.mliSptv@@@@@@3@@@@@@#intA;@@#intA@@@@@;@A@$charB;@@$charA@@@@@A@A@&stringQ;@@&stringA@@@@@G@@@%bytesC;@@%bytesA@@@@@M@@@%floatD;@@%floatA@@@@@S@@@$boolE;@@%falsec@@]@$trued@@c@@@A@@@@@d@A@$unitF;@@"()e@@n@@@A@@@@@o@A@ #exnG;@@@A@@@@@s@@@#effH;@@O@A@A@@@@@@|@@@,continuationI;@@Q@@P@B,continuationA@nY@@@@@@@@@%arrayJ;@@R@A%arrayA@@@@@@@@@ $listK;@@S@A"[]f@@@"::g@@@T@@@ @@A@Y@@@@@@@@&optionL;@@V@A$Noneh@@@$Somei@@@@@A@Y@@@@@@@@)nativeintM;@@)nativeintA@@@@@@@@%int32N;@@%int32A@@@@@@@@%int64O;@@%int64A@@@@@@@@&lazy_tP;@@X@A&lazy_tA@Y@@@@@@@@ 5extension_constructorR;@@5extension_constructorA@@@@@@@@*floatarrayS;@@*floatarrayA@@@@@@@@&iarrayT;@@Y@A&iarrayA@Y@@@@@@@@ *atomic_locU;@@Z@A*atomic_locA@@@@@@ @@@ .Assert_failure`#@@@@@J@@@@@@@@[@@A!=ocaml.warn_on_literal_pattern%@&@0Division_by_zero]#@@@A+ . .@+End_of_file\#$@@@A366@'FailureY#,@'@@A<??@0Invalid_argumentX#5@0@@AE$H#H@-Match_failureV#>@@=@9@;@@a@@AV5Y4Y@)Not_foundZ#O@@@A^=a<a@-Out_of_memoryW#W@@@AfEiDi@.Stack_overflow^#_@@@AnMqLq@.Sys_blocked_io_#g@@@AvUyTy@)Sys_error[#o@j@@A^]@:Undefined_recursive_modulea#x@@w@s@u@@h@@Aon@:Continuation_already_takenb#@@@Awv@&Stdlib@A+OrderedTypeBrxrx@B@БA+!tAtt@@;@@@A@@@@@t@)ocaml.doc? The type of the set elements. uu@@@@@@@@@@@@@A@ѐ@@@@@@@3@@A#@'compareww@б@г7!tww@@ @@@{3@B<@A@@б@гH!tww@@ @@@|@@гҠ#intww@@ @@@}@@@@@~@@# @@@+@@ @@(.@@@w@b  A total ordering function over the set elements. This is a two-argument function [f] such that [f e1 e2] is zero if the elements [e1] and [e2] are equal, [f e1 e2] is strictly negative if [e1] is smaller than [e2], and [f e1 e2] is strictly positive if [e1] is greater than [e2]. Example: a suitable ordering function is the generic structural comparison function {!Stdlib.compare}. x~  @@@@@@@7A@@"@r2@@@@@@G@A@_"@@3.--.....@La$@A310011111@/@A6s7  @@H ) Input signature of the functor {!Make}. E@  F@  @@@@@@@Hrxx@F@!SERB  SB  @kq@Бlk/ {1:sets Sets} hE  iE  @@@@@@3gffggggg@fA@d@@Ð:9@99@@@9@9@6@AA+#eltCG  'G  *@@;@@A@@@@@G  "@ې? The type of the set elements. H + /H + S@@@@@@@@@C@@@A@@@@@@@@;@A+!tDJ U ^J U _@@;@@A@@@@@J U Y@3 The type of sets. K ` dK ` |@@@@@@@@@D@@@A@Ӑ@@@@@@@3@eNH@A!@%emptyM ~ M ~ @г3!tM ~ M ~ @@ @@@3@>8@A@@@M ~  @=0 The empty set. N  N  @@@@@@@E@@@M @@@@@@!#addP  P  @б@г#eltP  P  @@ @@@3@:M8@A@@б@г}!t,P  -P  @@ @@@@@г!t9P  :P  @@ @@@@@@@@@@# @@@+@@ @@(.@@@KP  @ [add x s] returns a set containing all elements of [s], plus [x]. If [x] was already in [s], [s] is returned unchanged (the result of the function is then physically equal to [s]). @before 4.03 Physical equality was not ensured. XQ  YT  @@@@@@@qF@@"@l@@@@@@G)singletonoV  pV  @б@г#eltzV  {V  @@ @@@3|{{|||||@`u8@A@@гڠ!tV  V  @@ @@@@@@@@@@ @@@V   @琠 @ [singleton x] returns the one-element set containing only [x]. W  W  3@@@@@@@G@@@@@@@@@3&removeY 5 =Y 5 C@б@г?#eltY 5 EY 5 H@@ @@@3@La8@A@@б@г'!tY 5 LY 5 M@@ @@@@@г4!tY 5 QY 5 R@@ @@@@@@@@@@# @@@+@@ @@(.@@@Y 5 9@F [remove x s] returns a set containing all elements of [s], except [x]. If [x] was not in [s], [s] is returned unchanged (the result of the function is then physically equal to [s]). @before 4.03 Physical equality was not ensured. Z S W]![@@@@@@@H@@"@V@@@@@@G%union_]e_]j@б@гu!t$_]l%_]m@@ @@@3&%%&&&&&@`u8@A@@б@г!t5_]q6_]r@@ @@@@@г!tB_]vC_]w@@ @@@@@@@@@@# @@@+@@ @@(.@@@T_]a@, Set union. a`x|b`x@@@@@@@zI@@"@u@@@@@@G%interxbyb@б@гԠ!tbb@@ @@@3@`u8@A@@б@г堐!tbb@@ @@@@@г!tbb@@ @@@@@@@@@@# @@@+@@ @@(.@@@b@3 Set intersection. cc@@@@@@@J@@"@Ԑ@@@@@@G(disjointee@б@г3!tee@@ @@@3@`u8@A@@б@гD!tee@@ @@@@@г$boolee@@ @@@@@@@@@@# @@@+@@ @@(.@@@e@c 4 Test if two sets are disjoint. @since 4.08 f g&@@@@@@@8K@@"@s3@@@@@@G$diff6i(07i(4@б@г!tAi(6Bi(7@@ @@@3CBBCCCCC@`u8@A@@б@г!tRi(;Si(<@@ @@@@@г!t_i(@`i(A@@ @@@@@@@@@@# @@@+@@ @@(.@@@qi(,@ Z Set difference: [diff s1 s2] contains the elements of [s1] that are not in [s2]. ~jBFk@@@@@@@L@@"@@@@@@@G(cardinalmm@б@г!tmm@@ @@@3@`u8@A@@г#intmm@@ @@@@@@@@@@ @@@m @ ) Return the number of elements of a set. nn@@@@@@@M@@@ݐ@@@@@@3ꐠ7 {1:elements Elements} pp@@@@@@3@EZ1@A(elements r r(@б@гO!tr*r+@@ @@@@@г|$list r3 r7@г#eltr/r2@@ @@@1@@@@@@6 @@@$@@ @@;'@@@'r@x Return the list of all elements of the given set. The returned list is sorted in increasing order with respect to the ordering [Ord.compare], where [Ord] is the argument given to {!Set.Make}. 4s8<5v@@@@@@@MN@@,@H@@@@@@Z'min_elt!Kx$Lx+@б@г!tVx-Wx.@@ @@@3XWWXXXXX@sn8@A@@гߠ#eltex2fx5@@ @@@@@@@@@@ @@@rx  @Ð Return the smallest element of the given set (with respect to the [Ord.compare] ordering), or raise [Not_found] if the set is empty. y6:{@@@@@@@O@@@@@@@@@3+min_elt_opt"}}@б@г!t}}@@ @@@3@La8@A@@г&option}}@г4#elt}}@@ @@@@@@@@@ @@@&@@ @@#)@@@}@ Return the smallest element of the given set (with respect to the [Ord.compare] ordering), or [None] if the set is empty. @since 4.05 ~@@@@@@@P@@,@-퐠@@@@@@B'max_elt#@б@гL!t@@ @@@3@[p8@A@@г#elt  @@ @@@@@@@@@@ @@@ @h O Same as {!min_elt}, but returns the largest element of the given set. $%@@@@@@@=Q@@@x8@@@@@@3+max_elt_opt$;"<-@б@г!tF/G0@@ @@@3HGGHHHHH@La8@A@@г&optionU8V>@г٠#elt_4`7@@ @@@@@@@@@ @@@&@@ @@#)@@@q@ g Same as {!min_elt_opt}, but returns the largest element of the given set. @since 4.05 ~?C@@@@@@@R@@,@@@@@@@B&choose%@б@г!t@@ @@@3@[p8@A@@г)#elt@@ @@@@@@@@@@ @@@ @ Return one element of the given set, or raise [Not_found] if the set is empty. Which element is chosen is unspecified, but equal elements will be chosen for equal sets. Q@@@@@@@S@@@ݐ@@@@@@3*choose_opt&@б@г Ord.compare e x >= 0) s] will return the first element [e] of [s] where [Ord.compare e x >= 0] (intuitively: [e >= x]), or raise [Not_found] if [x] is greater than any element of [s]. @since 4.05  uy} v:P@@@@@@@ W@@#@ @@@@@@Z.find_first_opt* RZ Rh@б@б@г#elt Rk Rn@@ @@@3        @u:@A@@г ]$bool Rr Rv@@ @@@@@@@@@@ @@б@г !t R{ R|@@ @@@#@@г &option R R@гM#elt R R@@ @@@:@@@@@@? @@@$@@ @@D'@@@9@@ @@I Rj@@@ RV"@< [find_first_opt f s], where [f] is a monotonically increasing function, returns an option containing the lowest element [e] of [s] such that [f e], or [None] if no such element exists. @since 4.05   py@@@@@@@ X@@2@L @@@@@@i)find_last+ { {@б@б@г#elt { {@@ @@@3        @:@A@@г ࠐ$bool +{ ,{@@ @@@@@@@@@@ @@б@г!t ?{ @{@@ @@@#@@гƠ#elt L{ M{@@ @@@0@@@@@@@5 @@@*@@ @@: \{@@@ _{@ [find_last f s], where [f] is a monotonically decreasing function, returns the highest element [e] of [s] such that [f e], or raises [Not_found] if no such element exists. @since 4.05  l ml@@@@@@@ Y@@#@ @@@@@@Z-find_last_opt,  @б@б@г #elt  @@ @@@ 3        @u:@A@@г T$bool  @@ @@@ @@@@@ @@  @@б@г!t  @@ @@@ #@@г &option  @гD#elt  @@ @@@:@@@@@@? @@@$@@ @@D'@@@9@@ @@I @@@ "@ 3 [find_last_opt f s], where [f] is a monotonically decreasing function, returns an option containing the highest element [e] of [s] such that [f e], or [None] if no such element exists. @since 4.05   @@@@@@@ Z@@2@ C @@@@@@i  ; {1:traversing Traversing}   @@@@@@3        @{1@A$iter-  @б@б@г#elt & '@@ @@@@@г נ$unit 3 4@@ @@@)@@@@@@@. @@б@г!t G H@@ @@@=@@г $unit T U@@ @@@J@@@@@@@O @@@*@@ @@T d@@@ g@ [iter f s] applies [f] in turn to all elements of [s]. The elements of [s] are presented to [f] in increasing order with respect to the ordering over the type of the elements.  t ux@@@@@@@ [@@#@  @@@@@@t$fold.  @б@б@г #elt  @@ @@@3        @:@A@@б@А#acc@-E@    @@А#acc   @@@@@!@@" @@@"@@# @@$% @@б@г !t  @@ @@@%.@@б@А#acc,4  @@А#acc2:  @@@9@@&9@@'A @@@@@( @@)F @@@0@@* @@+K @@@ @ = [fold f s init] computes [(f xN ... (f x2 (f x1 init))...)], where [x1 ... xN] are the elements of [s], in increasing order.   >@@@@@@@ \@@$@ M @@@@@@k  ? {1:transforming Transforming}   @@@@@@3        @}1@A#map/ # $@б@б@г #elt 0 1@@ @@@.@@г #elt = >@@ @@@/)@@@@@0@@1. @@б@г !t Q R@@ @@@2=@@г !t ^ _@@ @@@3J@@@@@4@@5O @@@*@@6 @@7T n@@@ q@   [map f s] is the set whose elements are [f a0],[f a1]... [f aN], where [a0],[a1]...[aN] are the elements of [s]. The elements are passed to [f] in increasing order with respect to the ordering over the type of the elements. If no element of [s] is changed by [f], [s] is returned unchanged. (If each output of [f] is physically equal to its input, the returned set is physically equal to [s].) @since 4.04  ~   @@@@@@@ ]@@#@  @@@@@@t&filter0      @б@б@г #elt      @@ @@@83        @:@A@@г f$bool      @@ @@@9@@@@@:@@; @@б@г !t      @@ @@@<#@@г #!t      @@ @@@=0@@@@@>@@?5 @@@*@@@ @@A:   @@@   @ 6  [filter f s] returns the set of all elements in [s] that satisfy predicate [f]. If [f] satisfies every element in [s], [s] is returned unchanged (the result of the function is then physically equal to [s]). @before 4.03 Physical equality was not ensured.    !"@@@@@@@ ^@@#@ F @@@@@@Z*filter_map1 "" ""@б@б@г #elt "" ""@@ @@@B3        @u:@A@@г y&option %""& &"",@г #elt /""" 0""%@@ @@@C@@@@@@E @@@&@@F @@G#)@@б@г !t H""1 I""2@@ @@@H2@@г !t U""6 V""7@@ @@@I?@@@@@J@@KD @@@*@@L @@MI e""@@@ h"" @  [filter_map f s] returns the set of all [v] such that [f x = Some v] for some element [x] of [s]. For example, {[filter_map (fun n -> if n mod 2 = 0 then Some (n / 2) else None) s]} is the set of halves of the even elements of [s]. If no element of [s] is changed or dropped by [f] (if [f x = Some x] for each element [x]), then [s] is returned unchanged: the result of the function is then physically equal to [s]. @since 4.11  u"8"< v$#$9@@@@@@@ _@@#@  @@@@@@i)partition2 $;$C $;$L@б@б@г #elt $;$O $;$R@@ @@@N3        @:@A@@г ]$bool $;$V $;$Z@@ @@@O@@@@@P@@Q @@б@г !t $;$_ $;$`@@ @@@R#@@В@г !t $;$d $;$e@@ @@@S4@@@г -!t $;$h $;$i@@ @@@TC@@@@@ @@UJ @@@/@@V @@WO2@@@D@@X @@YT $;$N@@@ $;$?@ G [partition f s] returns a pair of sets [(s1, s2)], where [s1] is the set of all the elements of [s] that satisfy the predicate [f], and [s2] is the set of all the elements of [s] that do not satisfy [f]. $j$n%1%X@@@@@@@`@@*@ W@@@@@@t%split3%Z%b%Z%g@б@г #elt%%Z%i&%Z%l@@ @@@Z3'&&'''''@8@A@@б@г !t6%Z%p7%Z%q@@ @@@[@@В@г !tG%Z%uH%Z%v@@ @@@\"@@@г $boolV%Z%yW%Z%}@@ @@@]1@@@г !te%Z%f%Z%@@ @@@^@@@@@&@@ @@_I-@@@@@@` @@aNC@@@V@@b @@cSY@@@%Z%^@ ѐ a [split x s] returns a triple [(l, present, r)], where [l] is the set of elements of [s] that are strictly less than [x]; [r] is the set of elements of [s] that are strictly greater than [x]; [present] is [false] if [s] contains no element equal to [x], or [true] if [s] contains an element equal to [x]. %%&&@@@@@@@a@@+@ @@@@@@r + {1:predicates Predicates and comparisons} &&&'"@@@@@@3@1@A(is_empty4'$','$'4@б@г !t'$'6'$'7@@ @@@d@@г$bool'$';'$'?@@ @@@e'@@@@@f@@g, @@@'$'( @ - % Test whether a set is empty or not. '@'D'@'n@@@@@@@b@@@ =@@@@@@K,is_singleton5'p'x'p'@б@г \!t 'p' 'p'@@ @@@h3        @d_8@A@@гϠ$bool'p''p'@@ @@@i@@@@@j@@k @@@''p't @ x H Test whether a set has exactly one element or not. @since 5.5 4''5 ''@@@@@@@Mc@@@ H@@@@@@3#mem6K ''L ''@б@г Р#eltV ''W ''@@ @@@l3XWWXXXXX@La8@A@@б@г !tg ''h ''@@ @@@m@@г)$boolt ''u '(@@ @@@n@@@@@o@@p# @@@+@@q @@r(.@@@ ''@ א 5 [mem x s] tests whether [x] belongs to the set [s].  (( ((?@@@@@@@d@@"@ @@@@@@G%equal7(A(I(A(N@б@г !t(A(P(A(Q@@ @@@s3@`u8@A@@б@г !t(A(U(A(V@@ @@@t@@г$bool(A(Z(A(^@@ @@@u@@@@@v@@w# @@@+@@x @@y(.@@@(A(E@6 h [equal s1 s2] tests whether the sets [s1] and [s2] are equal, that is, contain equal elements. (_(c((@@@@@@@ e@@"@F@@@@@@G'compare8 (( ((@б@г e!t((((@@ @@@z3@`u8@A@@б@г v!t%((&((@@ @@@{@@г#int2((3((@@ @@@|@@@@@}@@~# @@@+@@ @@(.@@@D((@ c Total ordering between sets. Can be used as the ordering function for doing sets of sets. Q((R);)]@@@@@@@jf@@"@e@@@@@@G&subset9h)_)gi)_)m@б@г Ġ!ts)_)ot)_)p@@ @@@3uttuuuuu@`u8@A@@б@г ՠ!t)_)t)_)u@@ @@@@@гF$bool)_)y)_)}@@ @@@@@@@@@@# @@@+@@ @@(.@@@)_)c@ P [subset s1 s2] tests whether the set [s1] is a subset of the set [s2]. )~)))@@@@@@@g@@"@Đ@@@@@@G'for_all:))))@б@б@гN#elt))))@@ @@@3@bw:@A@@г$bool))))@@ @@@@@@@@@@ @@б@гH!t))))@@ @@@#@@г$bool)*)*@@ @@@0@@@@@@@5 @@@*@@ @@:))@@@))@h T [for_all f s] checks if all elements of the set satisfy the predicate [f]. $** %*=*b@@@@@@@=h@@#@x8@@@@@@Z&exists;;*d*l<*d*r@б@б@г #eltH*d*uI*d*x@@ @@@3JIIJJJJJ@u:@A@@г $boolW*d*|X*d*@@ @@@@@@@@@@ @@б@г!tk*d*l*d*@@ @@@#@@г-$boolx*d*y*d*@@ @@@0@@@@@@@5 @@@*@@ @@:*d*t@@@*d*h@ܐ ] [exists f s] checks if at least one element of the set satisfies the predicate [f].  **!**@@@@@@@i@@#@@@@@@@Z; {1:converting Converting} #**#*+@@@@@@3@l1@A'to_list<%++%%++,@б@г!t%++/%++0@@ @@@@@гK$list%++8%++<@г^#elt%++4%++7@@ @@@1@@@@@@6 @@@$@@ @@;'@@@%++!@G 4 [to_list s] is {!elements}[ s]. @since 5.1 &+=+A'+e+z@@@@@@@j@@,@W@@@@@@Z'of_list=)+|+)+|+@б@г$list%)+|+&)+|+@г#elt/)+|+0)+|+@@ @@@310011111@}xB@A@@@ @@@ @@г!tC)+|+D)+|+@@ @@@@@@@@@@ @@@P)+|+ @ [of_list l] creates a set from a list of elements. This is usually more efficient than folding [add] over the list, except perhaps for lists with many duplicated elements. @since 4.02 ]*++^-,_,u@@@@@@@vk@@@q@@@@@@8+to_seq_from}t/,w,u/,w,@б@г#elt/,w,/,w,@@ @@@3@Qp8@A@@б@г᠐!t/,w,/,w,@@ @@@@@г #Seq!t/,w,/,w,@ /,w,/,w,@@г*#elt/,w,/,w,@@ @@@ %1@@@ @@@ '6 @@@-@@ ( @@ );0@@@C@@ * @@ +@F@@@/,w,{"@ [to_seq_from x s] iterates on a subset of the elements of [s] in ascending order, from [x] or above. @since 4.07 0,,2--.@@@@@@@l@@2@(萠@@@@@@_&to_seq~4-0-84-0->@б@гG!t4-0-A4-0-B@@ @@@ ,3@x8@A@@гs#Seq!t 4-0-J 4-0-M@  4-0-N4-0-O@@г#elt4-0-F4-0-I@@ @@@ -"@@@ @@@ /' @@@/@@ 0 @@ 1,2@@@*4-0-4@{ B Iterate on the whole set, in ascending order @since 4.07 75-P-T86--@@@@@@@Pm@@-@K@@@@@@K*to_rev_seqN8--O8--@б@г!tY8--Z8--@@ @@@ 23[ZZ[[[[[@dy8@A@@г#Seq!tl8--m8--@ p8--q8--@@г#elt{8--|8--@@ @@@ 3"@@@ @@@ 5' @@@/@@ 6 @@ 7,2@@@8--@ސ C Iterate on the whole set, in descending order @since 4.12 9--:-. @@@@@@@n@@-@@@@@@@K'add_seq<..<..@б@г*#Seq!t<..%<..(@ <..)<..*@@гI#elt<..!<..$@@ @@@ 83@wK@A@@@" @@@ : @@б@г6!t<...<../@@ @@@ ;@@гC!t<..3<..4@@ @@@ <#@@@@@ =@@ >( @@@*@@ ? @@ @-3@@@<..@U B Add the given elements to the set, in order. @since 4.07 =.5.9>.j.@@@@@@@*o@@"@e%@@@@@@L&of_seq(@..)@..@б@г#Seq!t7@..8@..@ ;@..<@..@@г#eltF@..G@..@@ @@@ A3HGGHHHHH@xK@A@@@" @@@ C @@г!tZ@..[@..@@ @@@ D@@@@@ E@@ F @@@g@.. @ 9 Build a set from the given bindings @since 4.07 tA..uB..@@@@@@@p@@@@@@@@@8@A@A@@B@"@@|?@@@e(@@v@V-@  @  @ l 4@  @  @ ` %@  @  G@ ' @  T@ 4 @  P@ 0@J@*@W@7@C@@@C@#@@i,@ @H@@@g@@P@0@z@@3@|@A_3@x@AC  C..@@6 * Output signature of the functor {!Make}. D..D./@@@@@@@B  @3@@A@$MakeFF//#F//'@t@@Т#OrdGF//)F//,@Р~+OrderedTypeF///F//:@3@A@ysA@Q<@@@v9@@@_"@@|@I@@r@R)@  @  @ h 0@  @  V@ 6 @  c@ C @  p@ = @  j@ 7@u@U@h@H@@f=@@@c&@@W@7@|@\$@@N@.@x@X@@̐@@@@@@2@Aon@@УР>!SF//>F//?@3@z@@r@@A  @@#eltF//JF//M@+#@;@@@A!t@@@ N@@@@F//EF//U@@@@s@@@Aг #OrdF//PF//S@F//T@@@/@@@@DH;@@@A! @@@@@@@@@@A@%H;@@@A@@@@@!@@A@ @@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@%@@@@@@jhZ@K@$@@@@@@7@@@@@:@@@@@@@@ @@E@@@@@@L@@@@@O@@@@@@@@@@Z@@@@@@a@@@@@d@@@@@@@@|@m@o@@@@@@v@@@@@W@@@@@@@@B@2@#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}@@@@@@@@@b`R@C@@@@@@@@@@@@%#@@@@@@@@@@@@@@@@@@@@@~@@}@@@|@@{@@@@@@z@@ys@@@x@@@w@@v@XVH@9@@@@u@@t@@@s@@r@ @@@@@q@@p@@@o@@@n@@m@@@ @@@l@@k@ @@@j@@i@@@h@@g@@f@xvh@Y@"@@@e@@d@5@@@c@@bC/@@@a@@@`@@_@@^@#!@@@?@@@]@@\ @@@[@@Z@@Y@U@@@X@@WL@@@V@@U@@T@   @ @@[@@@S@@R @@@Q@@P@@O@q@@@N@@M k@@@L@@@K@@J@@I@ h f X@ I@@{@@@H@@G =@@@F@@E@@D@@@@C@@B@@@A@@@@@?@   @ @@@@@>@@= @@@<@@;@@:@@@@9@@8 Π@@@7@@@6@@5@@4@   @ {@@@@@3@@2 q@@@1@@0@@/@@@@.@@- Z@@@,@@+@@*@ D B 4@ %@@@@@)@@(@ @@' @@&@@%@@$@@@@#@@"@ #@@! #@@ @@@@@   @ @@@@@@@@@@@@@@@@@@@@ @@@@@@@@ t r d@ U@@ @@@@@ I@@@@@@@@#@@@@@ &@@@ @@ @@ @   @ @@)@@@ @@ /@@@@@@@@@@@C@@@@@F@@@@@@@@   @ @@I@@@@@ @@@@@@@@_@@@@@@f@@@@k@@@@@@@@@@ P N @@ 1@j@@@@@@}@@@@@@@@@젠@ @@@@@@@@@@@@@@   @ @@@@@@ @@@@@@   @ |@@@@@@ n@@@@@@ ^ \ N@ ?@@@@@@@@@@@@ )@@@@@@@@   @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~p@a@@@@@@@@@@@@K@@@@@@@@64&@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@3@@@@@@@@@@@@@v@T@A@@@@@H;@@@@@@@@@-+@@ J@@@@@@@@Z@@@@@@@@Y@@@@@@l@@@@@h@@@@@@@@@@@y@j@@@@@@\[|@@@@@@@@@:8*@@@@@@@  @@@@@@@@@@@ɠ@@@@@@@@@@@@@@@@@@@@@@@p@nm@@@@@@@@@@@@@@@>0@@@@3@@AF//(@@ Z Functor building an implementation of the set structure given a totally ordered type. G/V/VH//@@@@@@@F// @ @@*O{&@vJr@@"@@@@@@@@@3@@ϐƑA@ A@  @@@@@@@@@zy@ji@^]@NM@BA@21@&%@@@@@@@|{@ba@FE@,+@@@@@@@@rq@_^@LK@21@@@@@@@@@m{1@A@ H************************************************************************:A@@;A@L@ H @BMMABM@ H OCaml FCGC@ H LDMD3@ H Xavier Leroy, projet Cristal, INRIA Rocquencourt RE44SE4@ H XFYF@ H Copyright 1996 Institut National de Recherche en Informatique et ^G_G@ H en Automatique. dHeHg@ H jIhhkIh@ H All rights reserved. This file is distributed under the terms of pJqJ@ H the GNU Lesser General Public License version 2.1, with the vKwKN@ H special exception on linking described in the file LICENSE. |LOO}LO@ H MM@ H************************************************************************NN5@ NOTE: If this file is set.mli, do not edit it directly! Instead, edit templates/set.template.mli and run tools/sync_stdlib_docs P77Q{@ * Sets over ordered types. This module implements the set data structure, given a total ordering function over the set elements. All operations over sets are purely applicative (no side-effects). The implementation uses balanced binary trees, and is therefore reasonably efficient: insertion and membership take time logarithmic in the size of the set, for instance. The {!Make} functor constructs implementations for any type, given a [compare] function. For instance: {[ module IntPairs = struct type t = int * int let compare (x0,y0) (x1,y1) = match Stdlib.compare x0 x1 with 0 -> Stdlib.compare y0 y1 | c -> c end module PairsSet = Set.Make(IntPairs) let m = PairsSet.(empty |> add (2,3) |> add (5,7) |> add (11,13)) ]} This creates a new module [PairsSet], with a new type [PairsSet.t] of sets of [int * int].  * The type of the set elements. ٠ * A total ordering function over the set elements. This is a two-argument function [f] such that [f e1 e2] is zero if the elements [e1] and [e2] are equal, [f e1 e2] is strictly negative if [e1] is smaller than [e2], and [f e1 e2] is strictly positive if [e1] is greater than [e2]. Example: a suitable ordering function is the generic structural comparison function {!Stdlib.compare}. | ** Input signature of the functor {!Make}. X0* {1:sets Sets} 8 * The type of the set elements.  4* The type of sets. 栠1* The empty set.  * [add x s] returns a set containing all elements of [s], plus [x]. If [x] was already in [s], [s] is returned unchanged (the result of the function is then physically equal to [s]). @before 4.03 Physical equality was not ensured. T A* [singleton x] returns the one-element set containing only [x].  * [remove x s] returns a set containing all elements of [s], except [x]. If [x] was not in [s], [s] is returned unchanged (the result of the function is then physically equal to [s]). @before 4.03 Physical equality was not ensured. -* Set union. T4* Set intersection.  5* Test if two sets are disjoint. @since 4.08  [* Set difference: [diff s1 s2] contains the elements of [s1] that are not in [s2]. @ ** Return the number of elements of a set. 8* {1:elements Elements} ݠ * Return the list of all elements of the given set. The returned list is sorted in increasing order with respect to the ordering [Ord.compare], where [Ord] is the argument given to {!Set.Make}.  * Return the smallest element of the given set (with respect to the [Ord.compare] ordering), or raise [Not_found] if the set is empty. K * Return the smallest element of the given set (with respect to the [Ord.compare] ordering), or [None] if the set is empty. @since 4.05  P* Same as {!min_elt}, but returns the largest element of the given set.  h* Same as {!min_elt_opt}, but returns the largest element of the given set. @since 4.05 U * Return one element of the given set, or raise [Not_found] if the set is empty. Which element is chosen is unspecified, but equal elements will be chosen for equal sets.  * Return one element of the given set, or [None] if the set is empty. Which element is chosen is unspecified, but equal elements will be chosen for equal sets. @since 4.05 :* {1:searching Searching}  * [find x s] returns the element of [s] equal to [x] (according to [Ord.compare]), or raise [Not_found] if no such element exists. @since 4.01 L * [find_opt x s] returns the element of [s] equal to [x] (according to [Ord.compare]), or [None] if no such element exists. @since 4.05 ᠠ * [find_first f s], where [f] is a monotonically increasing function, returns the lowest element [e] of [s] such that [f e], or raises [Not_found] if no such element exists. For example, [find_first (fun e -> Ord.compare e x >= 0) s] will return the first element [e] of [s] where [Ord.compare e x >= 0] (intuitively: [e >= x]), or raise [Not_found] if [x] is greater than any element of [s]. @since 4.05 p * [find_first_opt f s], where [f] is a monotonically increasing function, returns an option containing the lowest element [e] of [s] such that [f e], or [None] if no such element exists. @since 4.05  * [find_last f s], where [f] is a monotonically decreasing function, returns the highest element [e] of [s] such that [f e], or raises [Not_found] if no such element exists. @since 4.05  * [find_last_opt f s], where [f] is a monotonically decreasing function, returns an option containing the highest element [e] of [s] such that [f e], or [None] if no such element exists. @since 4.05 <* {1:traversing Traversing} 䠠 * [iter f s] applies [f] in turn to all elements of [s]. The elements of [s] are presented to [f] in increasing order with respect to the ordering over the type of the elements.  * [fold f s init] computes [(f xN ... (f x2 (f x1 init))...)], where [x1 ... xN] are the elements of [s], in increasing order.  * {1:transforming Transforming} 㠠 * [map f s] is the set whose elements are [f a0],[f a1]... [f aN], where [a0],[a1]...[aN] are the elements of [s]. The elements are passed to [f] in increasing order with respect to the ordering over the type of the elements. If no element of [s] is changed by [f], [s] is returned unchanged. (If each output of [f] is physically equal to its input, the returned set is physically equal to [s].) @since 4.04   * [filter f s] returns the set of all elements in [s] that satisfy predicate [f]. If [f] satisfies every element in [s], [s] is returned unchanged (the result of the function is then physically equal to [s]). @before 4.03 Physical equality was not ensured. * [filter_map f s] returns the set of all [v] such that [f x = Some v] for some element [x] of [s]. For example, {[filter_map (fun n -> if n mod 2 = 0 then Some (n / 2) else None) s]} is the set of halves of the even elements of [s]. If no element of [s] is changed or dropped by [f] (if [f x = Some x] for each element [x]), then [s] is returned unchanged: the result of the function is then physically equal to [s]. @since 4.11  * [partition f s] returns a pair of sets [(s1, s2)], where [s1] is the set of all the elements of [s] that satisfy the predicate [f], and [s2] is the set of all the elements of [s] that do not satisfy [f].   b* [split x s] returns a triple [(l, present, r)], where [l] is the set of elements of [s] that are strictly less than [x]; [r] is the set of elements of [s] that are strictly greater than [x]; [present] is [false] if [s] contains no element equal to [x], or [true] if [s] contains an element equal to [x].  | ,* {1:predicates Predicates and comparisons}  a &* Test whether a set is empty or not.  & I* Test whether a set has exactly one element or not. @since 5.5  ޠ 6* [mem x s] tests whether [x] belongs to the set [s].  i* [equal s1 s2] tests whether the sets [s1] and [s2] are equal, that is, contain equal elements.  & d* Total ordering between sets. Can be used as the ordering function for doing sets of sets.  ʠ Q* [subset s1 s2] tests whether the set [s1] is a subset of the set [s2].  n U* [for_all f s] checks if all elements of the set satisfy the predicate [f].  ^* [exists f s] checks if at least one element of the set satisfies the predicate [f].  <* {1:converting Converting}  q 5* [to_list s] is {!elements}[ s]. @since 5.1  ' * [of_list l] creates a set from a list of elements. This is usually more efficient than folding [add] over the list, except perhaps for lists with many duplicated elements. @since 4.02 Р * [to_seq_from x s] iterates on a subset of the elements of [s] in ascending order, from [x] or above. @since 4.07 \ C* Iterate on the whole set, in ascending order @since 4.07  D* Iterate on the whole set, in descending order @since 4.12  C* Add the given elements to the set, in order. @since 4.07 ( :* Build a set from the given bindings @since 4.07 Ƞ +* Output signature of the functor {!Make}. L [* Functor building an implementation of the set structure given a totally ordered type. @?)../ocamlc0-strict-sequence(-absname"-w5+a-4-9-41-42-44-45-48"-g+-warn-error"+A*-bin-annot)-nostdlib*-principal"-o/stdlib__Set.cmi"-cOP Z/home/teraram/ci/builds/workspace/parallel-build/flambda/true/label/ocaml-manycores/stdlib @@0܊V@a3TSSTTTTT@R@@8CamlinternalFormatBasics0|.e1R$|o&Stdlib0t0VoS%{<F:.Stdlib__Either0HD ?|>+Stdlib__Seq0?72#[O0ܔ@Z8XWaa2@0ܔ@Z8XWaa2Atl@  ӰC@ v X@~@ ~ s@f@v@@@ o@@,@@@̐?@IQ@f@֐@ʐ@1@    ,h@g  OP@>7G@";@ j ?@@C@ ڐ ͐A4@ 6 @* p @  ٰX@Đ, ? L@@P@@