Caml1999I037)e+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@@%union-@M@@@&@R@@@'U@@@(@@)@@*@_]a_]w@@I@@%inter.@c@@@+@h@@@,k@@@-@@.@@/@bb@@J@@(disjoint/@y@@@0@~@@@1$boolE@@@2@@3@@4@ee@@K@@$diff0@@@@5@@@@6@@@7@@8@@9@i(,i(A@@L@@(cardinal1@@@@:@@@;@@<@mm@@M@@(elements2@@@@=$listK@@@>@@@?@@@@ r r7@@N@@'min_elt3@@@@A@@@B@@C@x x5@@-O@@+min_elt_opt4@@@@D&optionL@@@E@@@F@@G@3}4}@@EP@@'max_elt5@@@@H@@@I@@J@DE@@VQ@@+max_elt_opt6@ @@@K)@@@L@@@M@@N@Z[>@@lR@@&choose7@"@@@O@@@P@@Q@kl@@}S@@*choose_opt8@3@@@RP+@@@S@@@T@@U@@@T@@$find9@:@@@V@N@@@WB@@@X@@Y@@Z@@@U@@(find_opt:@P@@@[@d@@@\\@@@]@@@^@@_@@`@x|x@@V@@*find_first;@@m@@@a@@@b@@c@@@@dy@@@e@@f@@g@KOKx@@W@@.find_first_opt<@@@@@h@@@i@@j@@@@k@@@l@@@m@@n@@o@RVR@@X@@)find_last=@@@@@p;@@@q@@r@@@@s@@@t@@u@@v@ { {@@Y@@-find_last_opt>@@@@@wW@@@x@@y@@@@z@@@{@@@|@@}@@~@,-@@>Z@@$iter?@@@@@$unitF@@@@@@@@@ @@@@@@@@KL@@][@@$fold@@@@@@@#acc@@@@@@ @@@@  @@@@@@@hi@@z\@@#mapA@@#@@@&@@@@@@:@@@=@@@@@@@@@@]@@&filterB@@>@@@@@@@@@V@@@Y@@@@@@@@    @@^@@*filter_mapC@@Z@@@a@@@@@@@@@v@@@y@@@@@@@@"" ""7@@_@@)partitionD@@z@@@ @@@@@@@@@@@@@@@@@@@@@@@@$;$?$;$i@@`@@%splitE@@@@@@@@@@@@@<@@@@@@@@@@@@@@ %Z%^ %Z%@@a@@(is_emptyF@@@@S@@@@@@'$'('$'?@@-b@@#memG@@@@@@@@j@@@@@@@@2'p't3'p'@@Dc@@%equalH@@@@@@@@@@@@@@@@I ''J ''@@[d@@'compareI@@@@@@@@G@@@@@@@@`(_(ca(_(}@@re@@&subsetJ@(@@@@-@@@@@@@@@@@w((x() @@f@@'for_allK@@2@@@@@@@@@J@@@@@@@@@@@)f)j)f)@@g@@&existsL@@O@@@@@@@@@g@@@@@@@@@@@)))*@@h@@'to_listM@y@@@q@@@@@@@@@ ** **@@i@@'of_listN@Ҡ@@@@@@@@@@@@$+ + $+ +'@@j@@+to_seq_fromO@@@@@@@@&Stdlib#Seq!t@@@@@@@@@@@*,,*,,/@@k@@&to_seqP@@@@#Seq!t@@@@@@@@@/,,/,,@@)l@@*to_rev_seqQ@@@@5#Seq!t@@@@@@@@@03-*-.13-*-M@@Bm@@'add_seqR@K#Seq!t@@@@@@@@@@@@@@@@@@N7--O7--@@`n@@&of_seqS@i#Seq!t@@@@@@!@@@@@@g;..h;...@@yo@@@@kB  l>.r.w@}p@@Ӡ$Make#@#Ord$RT;@@@A!t@@@5@@@@A..A..@@@@r@A@XU;@@@A@@@@@W@@@TA@SV @@@6@R@O@NW@$@@@7@@@@8@@@9@@:@@;@M@J@IX@@@@<@@@=@@>@H@E@DY@@@@?@-@@@@0@@@A@@B@@C@C@@@?Z@9@@@D@>@@@EA@@@F@@G@@H@>@;@:[@J@@@I@O@@@JR@@@K@@L@@M@9@6@5\@[@@@N@`@@@O4@@@P@@Q@@R@1@.@-]@l@@@S@q@@@Tt@@@U@@V@@W@,@)@(^@}@@@X'@@@Y@@Z@&@#@"_@@@@[!@@@\@@@]@@^@@@`@@@@_@@@`@@a@@@a@@@@b@@@c@@@d@@e@@@ b@@@@f@@@g@@h@ @ @c@@@@i@@@j@@@k@@l@@@d@@@@m@@@n@@o@@@e@@@@p@@@q@@@r@@s@@@f@@@@t@@@@u@@@v@@w@@x@@@g@@@@y@@@@z@@@{@@@|@@}@@~@@@h@@ @@@@@@@@@@@@@@@@@@@@@@i@@!@@@@@@@@@3@@@/@@@@@@@@@@@@@j@@;@@@@@@@@@M@@@F@@@@@@@@@@k@@Q@@@@@@@@@c@@@נ_@@@@@@@@@@@@@l@@k@@@@@@@@@}@@@@@@@@@@@@@m@@@@@@@@@@@@@@@@@@@@@@@@@n@@@@@@@@@@@@@@@@@@@@@@@@o@@@@@@@@@@@@@@@@@@@@@@@@p@@@@@@@@@@@@@@@@@@@@@@@@@@@q@@@@@@@@@@@@@@@@@@Ǡ@@@@@@@@@@@@@r@@@@@@@@@@@@Ϡ@@@@Π@@@@@@@@@@@@@s@"@@@@@@@@@@@t@$@@@@3@@@@@@@@@@@@@u@?@@@@D@@@@@@@@@@@@@v@P@@@@U@@@@@@@@@@@@@w@a@@@@f@@@@@@@@@@@@@x@@j@@@@@@@@@|@@@@@@@@@@@@@y@@@@@~@@@@@@@@@}@@@@@@@@|@y@xz@@@@w@@@@@@@@@v@s@r{@q@@@@@@@@@@@@p@m@l|@@@@@@@@khg@@@@@@@@@@@f@c@b}@@@@}a`@@@@@@@@ @_@\@[~@@@@ ZY@@@ @@@ @@ @X@U@T@SR@@@@@@@@@@@@@@@@@@Q@N@M@LK @@@@@@@@@@@@J@G@@@A..)@s@@@@^L+Stdlib__Set0\$;7 +Stdlib__Seq0nwzG&amg.Stdlib__Either0Vy`u~c à&Stdlib0Lku]8_٠8CamlinternalFormatBasics0%FU(Q/Tu@@@Caml1999T037:$vlC+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;@@@A@@@@@:@A@$charB;@@A@@@@@>@A@&stringQ;@@ A@@@@@B@@@%bytesC;@@ A@@@@@F@@@%floatD;@@A@@@@@J@@@$boolE;@@%falsec@@T@$trued@@Z@@@A@@@@@[@A@$unitF;@@"()e@@e@@@A@@@@@f@A@ #exnG;@@@A@@@@@j@@@#effH;@@O@A@A@@@@@@s@@@,continuationI;@@Q@@P@B@A@nY@@@@@@@@@%arrayJ;@@R@A@A@@@@@@@@@ $listK;@@S@A"[]f@@@"::g@@@T@@@ @@A@Y@@@@@@@@&optionL;@@V@A$Noneh@@@$Somei@@@@@A@Y@@@@@@@@)nativeintM;@@A@@@@@@@@%int32N;@@A@@@@@@@@%int64O;@@A@@@@@@@@&lazy_tP;@@X@AJA@Y@@@@@@@@5extension_constructorR;@@A@@@@@@@@*floatarrayS;@@A@@@@@@@@&iarrayT;@@Y@A[A@Y@@@@@@@@*atomic_locU;@@Z@AdA@@@@@@@@@.Assert_failure`#@@@@@J@@@@@@@@[@@A=ocaml.warn_on_literal_pattern @ @0Division_by_zero]#@@@A  @+End_of_file\#$@@@A@'FailureY#,@'@@A!$$@0Invalid_argumentX#5@0@@A*$-#-@-Match_failureV#>@@=@9@;@@a@@A;5>4>@)Not_foundZ#O@@@AC=F<F@-Out_of_memoryW#W@@@AKENDN@.Stack_overflow^#_@@@ASMVLV@.Sys_blocked_io_#g@@@A[U^T^@)Sys_error[#o@j@@Ad^g]g@:Undefined_recursive_modulea#x@@w@s@u@@h@@Auoxnx@:Continuation_already_takenb#@@@A}wv@&Stdlib@Ax+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~  @@@@@@@A@@@n@@@@@@C@A@["@@3@H]$@A3@@As  @@) ) Input signature of the functor {!Make}. &@  '@  @@@@@@@)rxx@'@!SE3B  4B  @Lp@БML/ {1:sets Sets} IE  JE  @@@@@@3HGGHHHHH@GA@d@@:9@99@@@9@9@6@AA+#eltCgG  'hG  *@@;@@A@@@@@kG  "@א? The type of the set elements. xH + /yH + 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@@@@@@!#addP  P  @б@г#eltP  P  @@ @@@3@:M8@A@@б@г}!t P  P  @@ @@@@@г!tP  P  @@ @@@@@@@@!@@@'@@$* @@@(P  @ [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. 5Q  6T  @@@@@@@NF@@@I@@@@@@C)singletonLV  MV  @б@г#eltWV  XV  @@ @@@3YXXYYYYY@\q8@A@@г֠!tfV  gV  @@ @@@@@@@@@@@qV   @ݐ @ [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@@ @@@@@г!t_]v_]w@@ @@@@@@@@!@@@'@@$* @@@'_]a@, Set union. 4`x|5`x@@@@@@@MI@@@H@@@@@@C%interKbLb@б@гƠ!tVbWb@@ @@@3XWWXXXXX@\q8@A@@б@гנ!tgbhb@@ @@@@@г䠐!ttbub@@ @@@@@@@@!@@@'@@$* @@@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@@б@г!ti(;i(<@@ @@@@@г!t*i(@+i(A@@ @@@@@@@@!@@@'@@$* @@@8i(,@ Z Set difference: [diff s1 s2] contains the elements of [s1] that are not in [s2]. EjBFFk@@@@@@@^L@@@Y@@@@@@C(cardinal\m]m@б@гנ!tgmhm@@ @@@3ihhiiiii@\q8@A@@гI#intvmwm@@ @@@@@@@@@@@m @퐠 ) Return the number of elements of a set. nn@@@@@@@M@@@@@@@@@17 {1:elements Elements} pp@@@@@@3@CX1@A(elements r r(@б@г3!tr*r+@@ @@@@@гL$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+@б@г!tx-x.@@ @@@3@ql8@A@@г#elt(x2)x5@@ @@@@@@@@@@@3x  @ 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:A{@@@@@@@YO@@@T@@@@@@1+min_elt_opt"W}X}@б@гҠ!tb}c}@@ @@@3dccddddd@J_8@A@@гР&optionq}r}@г#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@@гq&option8>@г#elt47@@ @@@@@@@@@ @@@$@@!'@@@,@ g Same as {!min_elt_opt}, but returns the largest element of the given set. @since 4.05 9?C:@@@@@@@RR@@*@M@@@@@@@&choose%PQ@б@гˠ!t[\@@ @@@3]\\]]]]]@Yn8@A@@г#eltjk@@ @@@@@@@@@@@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. 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@@ @@@@@б@г!t@@ @@@)@@гĠ#elt+,@@ @@@6@@@@@9@@@%@@<( @@@9@ [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 FG`v@@@@@@@_U@@@Z@@@@@@[(find_opt(]x^x@б@г#elthxix@@ @@@3jiijjjjj@to8@A@@б@г預!tyxzx@@ @@@@@г堐&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!tKpKq@@ @@@!@@г#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  y} :P@@@@@@@ 7W@@@ 2@@@@@@T.find_first_opt* 5RZ 6Rh@б@б@г۠#elt BRk CRn@@ @@@3 D C C D D D D D@o:@A@@г $bool QRr RRv@@ @@@@@@@@@@б@гӠ!t cR{ dR|@@ @@@!@@гϠ&option pR qR@г#elt zR {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 @@@@@@T-find_last_opt,  !@б@б@гƠ#elt - .@@ @@@ 3 / . . / / / / /@o:@A@@г $bool < =@@ @@@ @@@@@ @@б@г!t N O@@ @@@ !@@г &option [ \@г#elt e f@@ @@@ 8@@@@@@= @@@"@@@%@@@3@@C v@@@ y@吠 [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  @@ @@@@@г w$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@@@@@@@ [@@@ t @@@@@@n$fold.  @б@б@г #elt ) *@@ @@@3 + * * + + + + +@:@A@@б@А#acc@"E@  < =@@А#acc  B C@@@@@ @@@@@!@@б@гà!t S T@@ @@@*@@б@А#acc(0 _ `@@А#acc.6 e f@@@33@@; @@@@@>@@@(@@ A p @@@ s@ ߐ [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     @@@@@@@ ]@@@ n @@@@@@n&filter0      @б@б@г #elt #   $  @@ @@@*3 % $ $ % % % % %@:@A@@г $bool 2   3  @@ @@@+@@@@@,@@б@г !t D   E  @@ @@@-!@@г !t Q   R  @@ @@@..@@@@@/1@@@$@@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. m   n!"@@@@@@@ ^@@@  @@@@@@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 $;$V $;$Z@@ @@@;@@@@@<@@б@г !t /$;$_ 0$;$`@@ @@@=!@@В@г !t @$;$d A$;$e@@ @@@>2@@@г !t O$;$h P$;$i@@ @@@?A@@@@@ @@@H @@@- @@AK0@@@>@@BN b$;$N@@@ e$;$?@ ѐ [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].  r$j$n s%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 @@@@@@n + {1:predicates Predicates and comparisons} &&&'"@@@@@@3@1@A(is_empty4"'$',#'$'4@б@г !t-'$'6.'$'7@@ @@@K@@г $bool:'$';;'$'?@@ @@@L'@@@@@M*@@@E'$'( @ % Test whether a set is empty or not. R'@'DS'@'n@@@@@@@kb@@@ f@@@@@@I#mem5i'p'xj'p'{@б@г #eltt'p'}u'p'@@ @@@N3vuuvvvvv@b]8@A@@б@г !t'p''p'@@ @@@O@@гP$bool'p''p'@@ @@@P@@@@@Q!@@@'@@R$* @@@'p't@ 5 [mem x s] tests whether [x] belongs to the set [s]. ''''@@@@@@@c@@@ @@@@@@C%equal6 '' ''@б@г ?!t '' ''@@ @@@S3@\q8@A@@б@г P!t '' ''@@ @@@T@@г$bool '' ''@@ @@@U@@@@@V!@@@'@@W$* @@@ ''@ g h [equal s1 s2] tests whether the sets [s1] and [s2] are equal, that is, contain equal elements.  ''  (+(]@@@@@@@!d@@@ w@@@@@@C'compare7(_(g (_(n@б@г !t*(_(p+(_(q@@ @@@X3,++,,,,,@\q8@A@@б@г !t;(_(u<(_(v@@ @@@Y@@г#intH(_(zI(_(}@@ @@@Z@@@@@[!@@@'@@\$* @@@V(_(c@  c Total ordering between sets. Can be used as the ordering function for doing sets of sets. c(~(d((@@@@@@@|e@@@ w@@@@@@C&subset8z(({((@б@г !t((((@@ @@@]3@\q8@A@@б@г !t()()@@ @@@^@@гa$bool()() @@ @@@_@@@@@`!@@@'@@a$* @@@((@ P [subset s1 s2] tests whether the set [s1] is a subset of the set [s2]. ) ))L)d@@@@@@@f@@@-Ґ@@@@@@C'for_all9)f)n)f)u@б@б@г {#elt)f)x)f){@@ @@@b3@^s:@A@@г$bool)f))f)@@ @@@c@@@@@d@@б@г s!t)f))f)@@ @@@e!@@гΠ$bool)f))f)@@ @@@f.@@@@@g1@@@$@@h4)f)w @@@)f)j@ T [for_all f s] checks if all elements of the set satisfy the predicate [f]. ,))-))@@@@@@@Eg@@@@@@@@@@T&exists:C))D))@б@б@г 預#eltP)*Q)*@@ @@@i3RQQRRRRR@o:@A@@г$bool_)* `)* @@ @@@j@@@@@k@@б@г ᠐!tq)*r)*@@ @@@l!@@г<$bool~)*)*@@ @@@m.@@@@@n1@@@$@@o4)* @@@))@ ] [exists f s] checks if at least one element of the set satisfies the predicate [f]. ** *S*@@@@@@@h@@@ @@@@@@T; {1:converting Converting} ****@@@@@@3@f}1@A'to_list; ** **@б@г?!t ** **@@ @@@p@@гX$list ** **@г#elt ** **@@ @@@q1@@@@@@s6 @@@"@@t9%@@@ **@b 4 [to_list s] is {!elements}[ s]. @since 5.1 !**"*+@@@@@@@i@@*@r@@@@@@X'of_list<$+ +$+ +@б@г$list%$+ +&$+ +"@гȠ#elt/$+ +0$+ +@@ @@@u310011111@{vB@A@@@ @@@w @@г!tC$+ +&D$+ +'@@ @@@x@@@@@y@@@N$+ +  @ [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 [%+(+,\(+,@@@@@@@tj@@@o@@@@@@6+to_seq_from|r*,, s*,,@б@г#elt}*,,~*,,@@ @@@z3~~@On8@A@@б@г!t*,,!*,,"@@ @@@{@@г$#Seq!t*,,**,,-@ *,,.*,,/@@гG#elt*,,&*,,)@@ @@@ 1@@@ @@@ 6 @@@+@@ 9.@@@?@@ <B@@@*,,@- [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,4-,,@@@@@@@k@@.@=␠@@@@@@[&to_seq}/,,/,,@б@г`!t/,,/,,@@ @@@ 3@t8@A@@г#Seq!t/,,/,,@ /,,/,,@@г#elt/,,/,,@@ @@@ "@@@ @@@ ' @@@-@@ *0@@@"/,,@ B Iterate on the whole set, in ascending order @since 4.07 /0,,01--(@@@@@@@Hl@@+@C@@@@@@I*to_rev_seq~F3-*-2G3-*-<@б@г!tQ3-*-?R3-*-@@@ @@@ 3SRRSSSSS@bw8@A@@г#Seq!td3-*-He3-*-K@ h3-*-Li3-*-M@@г #elts3-*-Dt3-*-G@@ @@@ "@@@ @@@ ' @@@-@@ *0@@@3-*-.@ C Iterate on the whole set, in descending order @since 4.12 4-N-R5--@@@@@@@m@@+@@@@@@@I'add_seq7--7--@б@г;#Seq!t7--7--@ 7--7--@@г^#elt7--7--@@ @@@ 3@uK@A@@@" @@@  @@б@гK!t7--7--@@ @@@ @@гX!t7--7--@@ @@@ #@@@@@ &@@@&@@ )/ @@@7--@b B Add the given elements to the set, in order. @since 4.07 8--9-. @@@@@@@n@@@r@@@@@@H&of_seq;..;..@б@г#Seq!t);..$*;..'@ -;..(.;..)@@гѠ#elt8;.. 9;..#@@ @@@ 3:99:::::@tK@A@@@" @@@  @@г!tL;..-M;...@@ @@@ @@@@@ @@@W;.. @Ð 9 Build a set from the given bindings @since 4.07 d<./.3e=.[.q@@@@@@@}o@@@x@@@@@@6@ A@A@@U@5@@\@<@@Q@1 @  @  \@ < @  @  i@ I "@  @  b@ B @  @ n @  @  ,@@6@@M@-@L@,@p@P@@e@E @@4@@w@W@@H@(@x@@3@z@A]3@@AC  >.r.w@@?䐠 * Output signature of the functor {!Make}. ?.x.x?.x.@@@@@@@B  @3@@A@$MakeFA..A..@ s@@Т#OrdGA..A..@Р+OrderedTypeA..A..@3@A@A@^I@)@@P@0@@~E@%@@r>@ @  @  Z@ : @  @  g@ 4 @  @ u )@  @  B@ " @  J@ *@T@4@m@M@c@0 @@Y@9@@;@@h@H@@B@"@r@R@@Ӑ@@@@@@=@Aml@@УРI!S|A..}A..@3|{{|||||@x@@q@@A  @@&#eltA..A..@+.@;@@@A!t@@@ @@@@A..A..@@@@r@@@Aг #OrdA..A..@A..@@@/@@@@OH;@@@A! @@@ @@@@@@@A@0H;@@@A@@@@@,*@@A@  @@@ @@@@@@ @@@@ @@@ @@ ~@@ }@@@@@@ |@@@ {@@ z@use@V@@@@ y@-@@@ x0@@@ w@@ v@@ u@+)@ @9@@@ t@>@@@ sA@@@ r@@ q@@ p@@@J@@@ o@O@@@ nR@@@ m@@ l@@ k@@x@[@@@ j@`@@@ i^@@@ h@@ g@@ f@MK=@.@l@@@ e@q@@@ dt@@@ c@@ b@@ a@@@}@@@ `@@@ _@@ ^@@@@@@ ]@@@ \@@@ [@@ Z@mk]@N@@@@ Y@@@ X@@ W@0. @@@@@ V@@@ U@@@ T@@ S@@@@@@ R@@@ Q@@ P@@@@@@ O|@@@ N@@@ M@@ L@caS@D@@@@ K@@@ J@@ I@&$@@@@@ H @@@ G@@@ F@@ E@   @ @@@@ D@@@@ C@@@ B@@ A@@ @@   s@ d@@@@ ?@@@@ > J@@@ =@@@ <@@ ;@@ :@ . , @ @@ @@@ 9 @@@ 8@@ 7@@@@ 6@@@ 5@@ 4@@ 3@   @ @@!@@@ 2 @@@ 1@@ 0@3@@@ / /@@@ .@@@ -@@ ,@@ +@ s q c@ T@@;@@@ * D@@@ )@@ (@M@@@ 'F@@@ &@@ %@@ $@   @ @@Q@@@ # @@@ "@@ !@c@@@  ՠ_@@@ @@@ @@ @@ @   @ @@k@@@  x@@@ @@ @}@@@  a@@@ @@ @@ @ O M ?@ 0@@@@@ @  @@ @@ @@@@ @ $ $@@ @@ @@ @   @ @@@@@ @@@ @@ @@@@ @@@ @@ @@ @  } o@ `@@@@@  P@@@ @@ @@@@ @@@ @@ @@ @ ' % @ @@@@@  @@@ @@@ @@ @@@@ @@@ @@ @@ @   @ @@@@@  @@@ @@ @@@@ @@@@ @@@@ @@ @@ @@ @ [ Y K@ <@@@@ @@@@ @@@@ ꠠ@ @@@ 렠@@@@ @@ @@ @@ @@@!@@@ @@@ @@ @@@#@@@ @2@@@ m@@@ @@ @@ @\ZL@=@>@@@ @C@@@ #@@@ @@ @@ @@@O@@@ @T@@@ @@@ @@ @@ @@@`@@@ @e@@@ @@@ @@ @@ @~|n@_@@i@@@ O@@@ @@ @{@@@ 8@@@ @@ @@ @&$@@@@@@ @@@ @@ @@@@ @@@ @@ @@ @@@@@@ @@@ @@@ @@ @use@V@R@@@ @@@ @@@ @@ @-+@@@@@ @@@@ @@@ @@@ @@ @@ @@@@@@ *@@@ @@@ @@ @r@c@@@@ <SR@@@ @@@ @@ @31#@@K@@@ @@@ @@@@ @@@ @@ @@ @@@b @@@ @@@ @@@ @@ @x@@_cB@@23@@AA..G@@O Z Functor building an implementation of the set structure given a totally ordered type. B..C//B@@@@@@@A..X@Y@@}y@/@@"l@@@@@@@@@3@!@baA@ZYA@WV@QP@A@@76@('@@  @@@@@@@@@@@}|@ji@VU@>=@*)@@@@@@@@rq@hg@YX@JI@;:@,+@@@@@@@@@@kyy@A@ H************************************************************************pA@@qA@L@ H vBMMwBM@ H OCaml |C}C@ H DD3@ H Xavier Leroy, projet Cristal, INRIA Rocquencourt E44E4@ H FF@ H Copyright 1996 Institut National de Recherche en Informatique et GG@ 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 KKN@ H special exception on linking described in the file LICENSE. LOOLO@ 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}. 0* {1:sets Sets}  * The type of the set elements. a4* 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]. g * [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. 4* 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. i8* {1:elements Elements} N * 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.  * 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 k 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 5:* {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 Ϡ * [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 h * [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  * [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  4  * [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  O * [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].  G ,* {1:predicates Predicates and comparisons}  , &* Test whether a set is empty or not.  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.  C 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 Z * [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 7 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 i :* 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 D/builds/workspace/precheck/flambda/false/label/ocaml-linux-32/stdlib @@0n`de!gG3@@@8CamlinternalFormatBasics0%FU(Q/Tu&Stdlib0Lku]8_٠.Stdlib__Either0Vy`u~c à+Stdlib__Seq0nwzG&amg0\$;7@0\$;7As@ E @QԐ(@]@ B @ΐ@/@@@ @CK@F@@@D~߰@@<@@z@P:@@ <   W@ِ=  @  fW@p@ , xKg@@ N@  ذYǰ@  <@ .W@ S |@hw  L  @@P@@