Caml1999I037*H+Stdlib__Set+OrderedType$!t(;@@@A@@@@@'set.mlitt@@@@@@A@'compare)@@@@@@@@#intA@@@@@@@@ww@@-A@@@@rxx   @1B@@!S%#elt*;@@@A@@@@@0G  "1G  *@@@@BC@A@!t+;@@@A@@@@@:J U Y;J U _@@@@LD@A@%empty,@@@@GM ~ HM ~ @@YE@@#add-@)@@@@@@@@@@@@@@@^P  _P  @@pF@@)singleton.@@@@)@@@@@@oV  pV  @@G@@&remove/@(@@@@<@@@?@@@ @@!@@"@Y 5 9Y 5 R@@H@@%union0@M@@@#@R@@@$U@@@%@@&@@'@_]a_]w@@I@@%inter1@c@@@(@h@@@)k@@@*@@+@@,@bb@@J@@(disjoint2@y@@@-@~@@@.$boolE@@@/@@0@@1@ee@@K@@$diff3@@@@2@@@@3@@@4@@5@@6@i(,i(A@@L@@(cardinal4@@@@7@@@8@@9@mm@@M@@(elements5@@@@:$listK@@@;@@@<@@=@ r r7@@N@@'min_elt6@@@@>@@@?@@@@x x5@@-O@@+min_elt_opt7@@@@A&optionL@@@B@@@C@@D@3}4}@@EP@@'max_elt8@@@@E@@@F@@G@DE@@VQ@@+max_elt_opt9@ @@@H)@@@I@@@J@@K@Z[>@@lR@@&choose:@"@@@L@@@M@@N@kl@@}S@@*choose_opt;@3@@@OP+@@@P@@@Q@@R@@@T@@$find<@:@@@S@N@@@TB@@@U@@V@@W@@@U@@(find_opt=@P@@@X@d@@@Y\@@@Z@@@[@@\@@]@x|x@@V@@*find_first>@@m@@@^@@@_@@`@@@@ay@@@b@@c@@d@KOKx@@W@@.find_first_opt?@@@@@e@@@f@@g@@@@h@@@i@@@j@@k@@l@RVR@@X@@)find_last@@@@@@m;@@@n@@o@@@@p@@@q@@r@@s@ { {@@Y@@-find_last_optA@@@@@tW@@@u@@v@@@@w@@@x@@@y@@z@@{@,-@@>Z@@$iterB@@@@@|$unitF@@@}@@~@@@@ @@@@@@@@KL@@][@@$foldC@@@@@@#acc@@@@@@ @@@@  @@@@@@@hi@@z\@@#mapD@@#@@@&@@@@@@:@@@=@@@@@@@@@@]@@&filterE@@>@@@@@@@@@V@@@Y@@@@@@@@    @@^@@*filter_mapF@@Z@@@a@@@@@@@@@v@@@y@@@@@@@@"" ""7@@_@@)partitionG@@z@@@ @@@@@@@@@@@@@@@@@@@@@@@@$;$?$;$i@@`@@%splitH@@@@@@@@@@@@@<@@@@@@@@@@@@@@ %Z%^ %Z%@@a@@(is_emptyI@@@@S@@@@@@'$'('$'?@@-b@@,is_singletonJ@@@@e@@@@@@-'p't.'p'@@?c@@#memK@@@@@@@@|@@@@@@@@D ''E '(@@Vd@@%equalL@ @@@@@@@@@@@@@@@[(A(E\(A(^@@me@@'compareM@#@@@@(@@@Y@@@@@@@@r((s((@@f@@&subsetN@:@@@@?@@@@@@@@@@@)_)c)_)}@@g@@'for_allO@@D@@@@@@@@@\@@@@@@@@@@@)))*@@h@@&existsP@@a@@@@@@@@@y@@@@@@@@@@@*d*h*d*@@i@@'to_listQ@@@@Ѡ@@@@@@@@@%++!%++<@@j@@'of_listR@@@@@@@@@@@@@)+|+)+|+@@k@@+to_seq_fromS@@@@@@@@&Stdlib#Seq!t@@@@@@@@@@@/,w,{/,w,@@"l@@&to_seqT@@@@#Seq!t@@@@@@@@@)4-0-4*4-0-O@@;m@@*to_rev_seqU@@@@5#Seq!t@@@@@@@@@B8--C8--@@Tn@@'add_seqV@K#Seq!t@@@@@@@@@@@@@@@@@@`<..a<..4@@ro@@&of_seqW@i#Seq!t @@@@@@3@@@@@@y@..z@..@@p@@@@}B  ~C..@q@@Ӡ$Make&@#Ord'dX;@@@A!t@@@/@@@@F//EF//U@@@@s@A@jY;@@@A@@@@@i@@@fA@eZ @@@0@d@a@`[@$@@@1@@@@2@@@3@@4@@5@_@\@[\@@@@6@@@7@@8@Z@W@V]@@@@9@-@@@:0@@@;@@<@@=@U@R@Q^@9@@@>@>@@@?A@@@@@@A@@B@P@M@L_@J@@@C@O@@@DR@@@E@@F@@G@K@H@G`@[@@@H@`@@@IF@@@J@@K@@L@C@@@?a@l@@@M@q@@@Nt@@@O@@P@@Q@>@;@:b@}@@@R9@@@S@@T@8@5@4c@@@@U3@@@V@@@W@@X@0@-@,d@@@@Y@@@Z@@[@+@(@'e@@@@\&@@@]@@@^@@_@#@ @f@@@@`@@@a@@b@@@g@@@@c@@@d@@@e@@f@@@h@@@@g@@@h@@i@@@i@@@@j@@@k@@@l@@m@ @ @ j@@@@n@@@@o@@@p@@q@@r@@@k@@@@s@@@@t@@@u@@@v@@w@@x@@@l@@ @@@y@@@z@@{@@@@|@@@}@@~@@@@@m@@!@@@@@@@@@3@@@/@@@@@@@@@@@@@n@@;@@@@@@@@@M@@@F@@@@@@@@@@o@@Q@@@@@@@@@c@@@_@@@@@@@@@@@@@p@@k@@@@@@@@@}@@@@@@@@@@@@@q@@@@@@@@@@@@@@@@@@@@@@@@@r@@@@@@@@@@@@@@@@@@@@@@@@s@@@@@@@@@@@@@@@@@@@@@@@@t@@@@@Ǡ@@@@@@@@@@@@@@@@@@@@@@u@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@v@@@@@@@@@@@@ɠ@@@@Ƞ@@@@@@@@@@@@@w@"@@@@@@@@@@@x@.@@@@@@@@@@@y@0@@@@?@@@@@@@@@@@@@z@K@@@@P@@@@@@@@@@@@@{@\@@@@a@@@@@@@@@@@@@|@m@@@@r@@@@@@@@@@@@@}@@v@@@@@@@@@@@@@@@@@@@@@@~@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@~@}@@@@@@@@@@@@|@y@x@@@@@@@@wts@@@@@@@@@@@r@o@n@@@@ml@@@@@@@@@k@h@g@@@@fe@@@@@@ @@ @d@a@`@_^@@@ @@@ @@@@ @@@@@@@@]@Z@Y@XW@@@@@@%@@@@@@V@S@@@F//5@t@@@@^L+Stdlib__Set0kb'G|PIF(+Stdlib__Seq0nwzG&amg.Stdlib__Either0Vy`u~c à&Stdlib0-i8Q"L{v;8CamlinternalFormatBasics0%FU(Q/Tu@@@Caml1999T037;xinC+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@^  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~  @@@@@@@3A@@@n.@@@@@@C@A@["@@3*))*****@H]$@A3-,,-----@+@A2s3  @@D ) Input signature of the functor {!Make}. A@  B@  @@@@@@@Drxx@B@!SENB  OB  @gq@Бhg/ {1:sets Sets} dE  eE  @@@@@@3cbbccccc@bA@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 ~  @90 The empty set. N  N  @@@@@@@E@@@I @@@@@@!#add P   P  @б@г#eltP  P  @@ @@@3@:M8@A@@б@г}!t(P  )P  @@ @@@@@г!t5P  6P  @@ @@@@@@@@!@@@'@@$* @@@CP  @ [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. PQ  QT  @@@@@@@iF@@@d@@@@@@C)singletongV  hV  @б@г#eltrV  sV  @@ @@@3tssttttt@\q8@A@@г֠!tV  V  @@ @@@@@@@@@@@V   @ݐ @ [singleton x] returns the one-element set containing only [x]. W  W  3@@@@@@@G@@@@@@@@@1&removeY 5 =Y 5 C@б@г9#eltY 5 EY 5 H@@ @@@3@J_8@A@@б@г!!tY 5 LY 5 M@@ @@@@@г.!tY 5 QY 5 R@@ @@@@@@@@!@@@'@@$* @@@Y 5 9@8 [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@@@H@@@@@@C%union _]e _]j@б@гk!t_]l_]m@@ @@@3@\q8@A@@б@г|!t'_]q(_]r@@ @@@@@г!t4_]v5_]w@@ @@@@@@@@!@@@'@@$* @@@B_]a@, Set union. O`x|P`x@@@@@@@hI@@@c@@@@@@C%interfbgb@б@гƠ!tqbrb@@ @@@3srrsssss@\q8@A@@б@гנ!tbb@@ @@@@@г䠐!tbb@@ @@@@@@@@!@@@'@@$* @@@b@3 Set intersection. cc@@@@@@@J@@@@@@@@@C(disjointee@б@г!!tee@@ @@@3@\q8@A@@б@г2!tee@@ @@@@@г$boolee@@ @@@@@@@@!@@@'@@$* @@@e@I 4 Test if two sets are disjoint. @since 4.08 fg&@@@@@@@K@@@Y@@@@@@C$diffi(0i(4@б@г|!t'i(6(i(7@@ @@@3)(()))))@\q8@A@@б@г!t8i(;9i(<@@ @@@@@г!tEi(@Fi(A@@ @@@@@@@@!@@@'@@$* @@@Si(,@ Z Set difference: [diff s1 s2] contains the elements of [s1] that are not in [s2]. `jBFak@@@@@@@yL@@@t@@@@@@C(cardinalwmxm@б@гנ!tmm@@ @@@3@\q8@A@@гd#intmm@@ @@@@@@@@@@@m @퐠 ) Return the number of elements of a set. nn@@@@@@@M@@@@@@@@@1ʐ7 {1:elements Elements} pp@@@@@@3@CX1@A(elements r r(@б@г3!tr*r+@@ @@@@@г\$listr3r7@гs#eltr/r2@@ @@@1@@@@@@6 @@@"@@9%@@@r@V 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}. s8<v@@@@@@@+N@@*@f&@@@@@@X'min_elt!)x$*x+@б@г!t4x-5x.@@ @@@365566666@ql8@A@@г#eltCx2Dx5@@ @@@@@@@@@@@Nx  @ 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:\{@@@@@@@tO@@@o@@@@@@1+min_elt_opt"r}s}@б@гҠ!t}}~}@@ @@@3~~@J_8@A@@гࠐ&option}}@г#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@@*@ǐ@@@@@@@'max_elt#@б@г*!t@@ @@@3@Yn8@A@@гb#elt@@ @@@@@@@@@@@ @@ O Same as {!min_elt}, but returns the largest element of the given set. @@@@@@@Q@@@P@@@@@@1+max_elt_opt$"-@б@гs!t/0@@ @@@3      @J_8@A@@г&option-8.>@г#elt7487@@ @@@@@@@@@ @@@$@@!'@@@G@ g Same as {!min_elt_opt}, but returns the largest element of the given set. @since 4.05 T?CU@@@@@@@mR@@*@h@@@@@@@&choose%kl@б@гˠ!tvw@@ @@@3xwwxxxxx@Yn8@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@@@@@@@@@1*choose_opt&@б@г!t@@ @@@3@J_8@A@@г"&option@гV#elt@@ @@@@@@@@@ @@@$@@!'@@@@9 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 i@@@@@@@T@@*@I @@@@@@@9 {1:searching Searching} @@@@@@3@Rg1@A$find' @б@г#elt*+@@ @@@@@б@г!t9:@@ @@@)@@гĠ#eltFG@@ @@@6@@@@@9@@@%@@<( @@@T@ [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 ab`v@@@@@@@zU@@@u@@@@@@[(find_opt(xxyx@б@г#eltxx@@ @@@3@to8@A@@б@г預!txx@@ @@@@@г&optionxx@г)#eltxx@@ @@@(@@@@@@- @@@"@@0%@@@6@@39@@@x|@ [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 3I@@@@@@@V@@-@ߐ@@@@@@R*find_first)KSK]@б@б@гm#eltK`Kc@@ @@@3@m:@A@@г$boolKgKk@@ @@@@@@@@@@б@гe!t Kp Kq@@ @@@!@@г#elt Ku Kx@@ @@@.@@@@@1@@@$@@4 )K_ @@@ ,KO@}  [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  9y} ::P@@@@@@@ RW@@@ M@@@@@@T.find_first_opt* PRZ QRh@б@б@г۠#elt ]Rk ^Rn@@ @@@3 _ ^ ^ _ _ _ _ _@o:@A@@г !$bool lRr mRv@@ @@@@@@@@@@б@гӠ!t ~R{ R|@@ @@@!@@гߠ&option R R@г#elt R R@@ @@@8@@@@@@= @@@"@@@%@@@3@@C 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@@.@  ʐ@@@@@@c)find_last+ { {@б@б@гX#elt { {@@ @@@3        @~:@A@@г $bool { {@@ @@@@@@@@@@б@гP!t { {@@ @@@!@@г#elt { {@@ @@@.@@@@@1@@@$@@4 { @@@ {@h [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@@@@@@@ =Y@@@x 8@@@@@@T-find_last_opt, ; <@б@б@гƠ#elt H I@@ @@@ 3 J I I J J J J J@o:@A@@г $bool W X@@ @@@ @@@@@ @@б@г!t i j@@ @@@ !@@г ʠ&option v w@г#elt  @@ @@@ 8@@@@@@= @@@"@@@%@@@3@@C @@@ @吠 [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@@.@ @@@@@@c  ; {1:traversing Traversing}   @@@@@@3        @u1@A$iter-  @б@б@гV#elt  @@ @@@@@г $unit  @@ @@@)@@@@@,@@б@гL!t  @@ @@@;@@г $unit  @@ @@@H@@@@@K@@@$@@N  @@@ @ d [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.   !x@@@@@@@ 9[@@@ t 4@@@@@@n$fold. 7 8@б@б@г #elt D E@@ @@@3 F E E F F F F F@:@A@@б@А#acc@"E@  W X@@А#acc  ] ^@@@@@ @@@@@!@@б@гà!t n o@@ @@@*@@б@А#acc(0 z {@@А#acc.6  @@@33@@; @@@@@>@@@(@@ A  @@@ @ ߐ [fold f s init] computes [(f xN ... (f x2 (f x1 init))...)], where [x1 ... xN] are the elements of [s], in increasing order.   >@@@@@@@ \@@@  @@@@@@a  ? {1:transforming Transforming}   @@@@@@3        @s1@A#map/  @б@б@г P#elt  @@ @@@#@@г ]#elt  @@ @@@$)@@@@@%,@@б@г F!t  @@ @@@&;@@г S!t  @@ @@@'H@@@@@(K@@@$@@)N  @@@ @ ^  [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     @@@@@@@ 3]@@@ n .@@@@@@n&filter0 1   2  @б@б@г #elt >   ?  @@ @@@*3 @ ? ? @ @ @ @ @@:@A@@г $bool M   N  @@ @@@+@@@@@,@@б@г !t _   `  @@ @@@-!@@г !t l   m  @@ @@@..@@@@@/1@@@$@@04 x   @@@ {  @ ̐  [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.    !"@@@@@@@ ^@@@  @@@@@@T*filter_map1 "" ""@б@б@г *#elt "" ""@@ @@@13        @o:@A@@г &option ""& "",@г C#elt """ ""%@@ @@@2@@@@@@4 @@@$@@5!'@@б@г 1!t ""1 ""2@@ @@@60@@г >!t ""6 ""7@@ @@@7=@@@@@8@@@@$@@9C "" @@@ "" @ I  [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  "8"< $#$9@@@@@@@ _@@@ Y @@@@@@c)partition2 $;$C $;$L@б@б@г #elt )$;$O *$;$R@@ @@@:3 + * * + + + + +@~:@A@@г $bool 8$;$V 9$;$Z@@ @@@;@@@@@<@@б@г !t J$;$_ K$;$`@@ @@@=!@@В@г !t [$;$d \$;$e@@ @@@>2@@@г !t j$;$h k$;$i@@ @@@?A@@@@@ @@@H @@@- @@AK0@@@>@@BN }$;$N@@@ $;$?@ ѐ [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@@@@@@@ `@@&@  @@@@@@n%split3 %Z%b %Z%g@б@г -#elt %Z%i %Z%l@@ @@@C3        @8@A@@б@г !t %Z%p %Z%q@@ @@@D@@В@г &!t %Z%u %Z%v@@ @@@E"@@@г $bool %Z%y %Z%}@@ @@@F1@@@г D!t %Z% %Z%@@ @@@G@@@@@&@@ @@HI-@@@> @@ILA@@@R@@JOU@@@%Z%^@ W 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@@'@ g'@@@@@@n54 + {1:predicates Predicates and comparisons} 1&&2&'"@@@@@@30//00000@1@A(is_empty4='$',>'$'4@б@г !tH'$'6I'$'7@@ @@@K@@г $boolU'$';V'$'?@@ @@@L'@@@@@M*@@@`'$'( @ % Test whether a set is empty or not. m'@'Dn'@'n@@@@@@@b@@@ @@@@@@I,is_singleton5'p'x'p'@б@г 䠐!t'p''p'@@ @@@N3@b]8@A@@гS$bool'p''p'@@ @@@O@@@@@P@@@'p't @ H Test whether a set has exactly one element or not. @since 5.5 '' ''@@@@@@@c@@@ ʐ@@@@@@1#mem6 '' ''@б@г V#elt '' ''@@ @@@Q3@J_8@A@@б@г >!t '' ''@@ @@@R@@г$bool '' '(@@ @@@S@@@@@T!@@@'@@U$* @@@ ''@ U 5 [mem x s] tests whether [x] belongs to the set [s].  (( ((?@@@@@@@*d@@@ e%@@@@@@C%equal7((A(I)(A(N@б@г !t3(A(P4(A(Q@@ @@@V354455555@\q8@A@@б@г !tD(A(UE(A(V@@ @@@W@@г$boolQ(A(ZR(A(^@@ @@@X@@@@@Y!@@@'@@Z$* @@@_(A(E@ h [equal s1 s2] tests whether the sets [s1] and [s2] are equal, that is, contain equal elements. l(_(cm((@@@@@@@e@@@ @@@@@@C'compare8((((@б@г 㠐!t((((@@ @@@[3@\q8@A@@б@г !t((((@@ @@@\@@г#int((((@@ @@@]@@@@@^!@@@'@@_$* @@@((@ c Total ordering between sets. Can be used as the ordering function for doing sets of sets. (();)]@@@@@@@f@@@ې@@@@@@C&subset9)_)g)_)m@б@г >!t)_)o)_)p@@ @@@`3@\q8@A@@б@г O!t)_)t)_)u@@ @@@a@@г$bool)_)y)_)}@@ @@@b@@@@@c!@@@'@@d$* @@@)_)c@f P [subset s1 s2] tests whether the set [s1] is a subset of the set [s2]. ")~)#))@@@@@@@;g@@@v6@@@@@@C'for_all:9)):))@б@б@г Ġ#eltF))G))@@ @@@e3HGGHHHHH@^s:@A@@г $boolU))V))@@ @@@f@@@@@g@@б@г !tg))h))@@ @@@h!@@г)$boolt)*u)*@@ @@@i.@@@@@j1@@@$@@k4)) @@@))@Ԑ T [for_all f s] checks if all elements of the set satisfy the predicate [f]. ** *=*b@@@@@@@h@@@@@@@@@T&exists;*d*l*d*r@б@б@г2#elt*d*u*d*x@@ @@@l3@o:@A@@гx$bool*d*|*d*@@ @@@m@@@@@n@@б@г*!t*d**d*@@ @@@o!@@г$bool*d**d*@@ @@@p.@@@@@q1@@@$@@r4*d*t @@@*d*h@B ] [exists f s] checks if at least one element of the set satisfies the predicate [f].  **!**@@@@@@@i@@@R@@@@@@T ; {1:converting Converting} #**#*+@@@@@@3@f}1@A'to_list<(%++%)%++,@б@г!t3%++/4%++0@@ @@@s@@г$list@%++8A%++<@гȠ#eltJ%++4K%++7@@ @@@t1@@@@@@v6 @@@"@@w9%@@@Z%++!@ 4 [to_list s] is {!elements}[ s]. @since 5.1 g&+=+Ah'+e+z@@@@@@@j@@*@{@@@@@@X'of_list=~)+|+)+|+@б@г$list)+|+)+|+@г#elt)+|+)+|+@@ @@@x3@{vB@A@@@ @@@z @@г!t)+|+)+|+@@ @@@{@@@@@|@@@)+|+ @ [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@@@@@@@k@@@Ӑ@@@@@@6+to_seq_from}/,w,/,w,@б@г_#elt/,w,/,w,@@ @@@}3@On8@A@@б@гG!t/,w,/,w,@@ @@@~@@гm#Seq!t/,w,/,w,@ /,w,/,w,@@г#elt/,w,/,w,@@ @@@ 1@@@ @@@ 6 @@@+@@ 9.@@@?@@ <B@@@%/,w,{@v [to_seq_from x s] iterates on a subset of the elements of [s] in ascending order, from [x] or above. @since 4.07 20,,32--.@@@@@@@Kl@@.@F@@@@@@[&to_seq~I4-0-8J4-0->@б@г!tT4-0-AU4-0-B@@ @@@ 3VUUVVVVV@t8@A@@г#Seq!tg4-0-Jh4-0-M@ k4-0-Nl4-0-O@@г#eltv4-0-Fw4-0-I@@ @@@ "@@@ @@@ ' @@@-@@ *0@@@4-0-4@א B Iterate on the whole set, in ascending order @since 4.07 5-P-T6--@@@@@@@m@@+@@@@@@@I*to_rev_seq8--8--@б@г !t8--8--@@ @@@ 3@bw8@A@@г2#Seq!t8--8--@ 8--8--@@гU#elt8--8--@@ @@@ "@@@ @@@ ' @@@-@@ *0@@@8--@8 C Iterate on the whole set, in descending order @since 4.12 9--:-. @@@@@@@ n@@+@H@@@@@@I'add_seq <.. <..@б@г#Seq!t<..%<..(@ <..)<..*@@г#elt)<..!*<..$@@ @@@ 3+**+++++@uK@A@@@" @@@  @@б@г!t?<...@<../@@ @@@ @@г!tL<..3M<..4@@ @@@ #@@@@@ &@@@&@@ )/ @@@Z<..@ B Add the given elements to the set, in order. @since 4.07 g=.5.9h>.j.@@@@@@@o@@@{@@@@@@H&of_seq~@..@..@б@г#Seq!t@..@..@ @..@..@@г#elt@..@..@@ @@@ 3@tK@A@@@" @@@  @@г!t@..@..@@ @@@ @@@@@ @@@@.. @ 9 Build a set from the given bindings @since 4.07 A..B..@@@@@@@p@@@ܐ@@@@@@6@[UA@4.A@ @@~W@7@@L@,@@zS@  @  @  O@ / @  @  k@ K @  @  C@ # @  \@ < @  u@ B@@L@@v@@u@@r@R@@g@G@@6@@y@Y@@J@*@z@@30//00000@|@A_332233333@@A8C  9C..@@J * Output signature of the functor {!Make}. GD..HD./@@@@@@@JB  @3HGGHHHHH@@A@$MakeFWF//#XF//'@pt@@Т#OrdGcF//)dF//,@РҠ+OrderedTypelF///mF//:@3lkklllll@ 'A@A@@t;@@@{B@"@@p7@@@iB@" @  @  O@ / @  @  H@ ( @  t@ T @  @ m @  @ u @@3@@2@@{V@6@@]@=@@?@@l@L@@F@&@v@V@@ @@@@@@@Aon@@УР!SF//>F//?@3@z@@r@@A  @@s#eltF//JF//M@+{@;@@@A!t@@@ @@@@F//EF//U@@@@s@@@Aг #OrdF//PF//S@F//T@@@/@@@@H;@@@A! @@@ @@@@@@@A@}H;@@@A@@@@@yw@@iA@X @@@ @HF8@)@@@@ @@@@ @@@ @@ @@ @@@@@@ @@@ @@ @@@@@@ @-@@@ 0@@@ @@ @@ ~@xvh@Y@9@@@ }@>@@@ |A@@@ {@@ z@@ y@.,@@J@@@ x@O@@@ wR@@@ v@@ u@@ t@@@[@@@ s@`@@@ r@@@ q@@ p@@ o@@{@l@@@ n@q@@@ mt@@@ l@@ k@@ j@PN@@1@}@@@ i!@@@ h@@ g@@@@@@ fӠ@@@ e@@@ d@@ c@@@@@@ b@@@ a@@ `@}{m@^@@@@ _N@@@ ^@@@ ]@@ \@53%@@@@@ [@@@ Z@@ Y@@@@@@ Xɠ@@@ W@@@ V@@ U@@@@@@ T@@@ S@@ R@sqc@T@@@@ QD@@@ P@@@ O@@ N@+)@ @@@@ M@@@@ L@@@ K@@ J@@ I@   @ @@@@ H@@@@ G @@@ F@@@ E@@ D@@ C@ { y k@ \@@ @@@ B L@@@ A@@ @@@@@ ?@@@ >@@ =@@ <@ # ! @ @@!@@@ ; @@@ :@@ 9@3@@@ 8 ݠ/@@@ 7@@@ 6@@ 5@@ 4@   @ @@;@@@ 3 @@@ 2@@ 1@M@@@ 0F@@@ /@@ .@@ -@ h f X@ I@@Q@@@ , 9@@@ +@@ *@c@@@ ) "_@@@ (@@@ '@@ &@@ %@   @ @@k@@@ $ @@@ #@@ "@}@@@ ! @@@ @@ @@ @   @ }@@@@@ @ j j@@ @@ @@@@ @ q q@@ @@ @@ @ 5 3 %@ @@@@@ @@@ @@ @@@@ @@@ @@ @@ @   @ @@@@@  @@@ @@ @@@@ @@@ @@ @@ @ t r d@ U@@@@@  E@@@ @@@ @@ @@@@ @@@ @@ @@ @   @ @@@@@  @@@ @@ @@@@ @@@@ @@@@ @@ @@ @@ @   @ @@@@ @@@@ @@@@ @ e@@@ @@@@ @@ @@ @@ @ A ? 1@ @!@@@  @@@ @@ @@@-@@@ @@@ @@ @@@/@@@ @>@@@ }@@@ @@ @@ @lj\@M@J@@@ @O@@@ 3@@@ @@ @@ @" @@[@@@ @`@@@ @@@ @@ @@ @@@l@@@ @q@@@ @@@ @@ @@ @~@o@@u@@@ _@@@ @@ @@@@ H@@@ @@ @@ @64&@@@@@@ @@@ @@ @@@@ @@@ @@ @@ @@@@@@ @@@ @@@ @@ @u@f@b@@@ @@@ @@@ @@ @=;-@@@@@ @@@@ q@@@ @@@ @@ @@ @@@@@@ @@@ @@@ @@ @@s@@@@ cb@@@ @@@ @@ @CA3@$@ @@@ @@@ @@@@ @@@ @@ @@ @@@à@@@ @@@ $@@@ @@ @@@koN@@>3RQQRRRRR@@AWF//(S@@h Z Functor building an implementation of the set structure given a totally ordered type. eG/V/VfH//@@@@@@@hF//d@e@@?+@&=)"@"@"Ő@@@@@@&@@@3|{{|||||@/@'nmA@feA@cb@]\@ML@CB@43@%$@@@@@@@@@@@@@vu@ba@JI@65@@  @@@@@@~}@ts@ji@[Z@LK@=<@.-@@@@@@@@@@m{@A@ H************************************************************************A@@A@L@ H BMMBM@ H OCaml CC@ H DD3@ H Xavier Leroy, projet Cristal, INRIA Rocquencourt E44E4@ H FF@ H Copyright 1996 Institut National de Recherche en Informatique et  G G@ H en Automatique. HHg@ H IhhIh@ H All rights reserved. This file is distributed under the terms of JJ@ H the GNU Lesser General Public License version 2.1, with the "K#KN@ H special exception on linking described in the file LICENSE. (LOO)LO@ H .M/M@ H************************************************************************4N5N5@ NOTE: If this file is set.mli, do not edit it directly! Instead, edit templates/set.template.mli and run tools/sync_stdlib_docs :P77;Q{@ * 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}. 0* {1:sets Sets} 蠠 * 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.  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. j-* Set union. 4* Set intersection.  5* Test if two sets are disjoint. @since 4.08 b [* 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}. a * Return the smallest element of the given set (with respect to the [Ord.compare] ordering), or raise [Not_found] if the set is empty.  * 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 + * 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} u * [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 * * [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 X * [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 s * [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}  &* Test whether a set is empty or not.  N 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.  X 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].  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}  5* [to_list s] is {!elements}[ s]. @since 5.1 o * [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 L 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}.  [* 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"-c Z/home/teraram/ci/builds/workspace/parallel-build/flambda/true/label/ocaml-manycores/stdlib @@0܊V@a3@@@8CamlinternalFormatBasics0%FU(Q/Tu&Stdlib0-i8Q"L{v;.Stdlib__Either0Vy`u~c à+Stdlib__Seq0nwzG&amg00kb'G|PIF(@0kb'G|PIF(AtZ@  X@ 2{m@`@  U@,x@pA@@@ik@@@@@ް?Px@@@@@@ Ð " B 6@e 9 Z@ Z Ȱ V@Ғ@   U@@S@  :)\@ d @s @ ǐ ސL@~   \@@P@@