Caml1999I0312X %]%*+Stdlib__Map+OrderedType\!t`8@@@A@@@@@'map.mliss@@@@@A@'comparea@@@@@@@@#intA@@@@@@@@vv@@,A@@@q ~  @0B@!S]#keyb8@@@A@@@@@/C  0C  @@@@@CA@!tc8!a@@A@A@I@B@@@?F ; ?@F ; J@@@@PDA@%emptyd!a@@@@@QI  RI  @@bE@(is_emptye@!a@@@@$boolE@@@@@@jL  kL  @@{F@#memf@L@@@@3!a@@@@@@@@@@@@O  O  $@@G@#addg@@@@@!a@@U @@@Y @@@@@@@@@@S  S  @@H@&updateh@;@@@@@&optionJ!a@@@@  @@@@@@@@@@@@@@@@@@@\dh\d@@I@)singletoni@g@@@@!a@@@@@@@@@ii9@@J@&removej@@@@@!a@@@@@@@@@@@@oo@@K@%mergek@@@@@@`!a@@@@@k!b@@@@t!c@@@@@@@@@@@@@@@@@@@@@@@@@@@@DvExb@@UL@%unionl@@@@@@!a@@ @@@@@@@@@@@@@@!@@@%@@@@@ @@ @@ @q48r4y@@M@'comparem@@!a@@o@@@ @@ @@@B@@@@H@@@@@@@@@@@@@@@N@%equaln@@!a@@G@@@@@@@@i@@@@o@@@W@@@@@@@@@@X\X@@O@$itero@@W@@@ @!a@$$unitF@@@!@@"@@#@@@@% @@@&@@'@@(@@@P@$foldp@@}@@@)@!a@-@!b@/@@*@@+@@,@@@@.@  @@0@@1@@2@   @@Q@'for_allq@@@@@3@!a@7@@@4@@5@@6@ݠ @@@8@@@9@@:@@;@-. @@>R@&existsr@@@@@<@!a@@@@@=@@>@@?@ @@@A@@@B@@C@@D@QR@@bS@&filters@@@@@E@!a@J@@@F@@G@@H@% @@@I)@@@K@@L@@M@u@Dv@s@@T@*filter_mapt@@ @@@N@!a@RԠ!b@T@@@O@@P@@Q@N@@@SR@@@U@@V@@W@@@U@)partitionu@@6@@@X@!a@^P@@@Y@@Z@@[@r @@@\y@@@_~@@@]@@`@@a@@b@!!!!@@V@(cardinalv@!a@c@@@d@@@e@@f@"""# @@W@(bindingsw@!a@h@@@g$listI@@@i@@j@@@k@@l@#]#a#]#@@X@+min_bindingx@Š!a@n@@@m@@@o @@p@@q@$$$$@@-Y@/min_binding_opty@ߠ!a@s@@@rx@@@t@@u@@@v@@w@;%%<%%@@LZ@+max_bindingz@!a@y@@@x@@@z @@{@@|@U&l&pV&l&@@f[@/max_binding_opt{@!a@~@@@}@@@@@@@@@@@t''u''L@@\@&choose|@7!a@@@@@@@ @@@@@''''@@]@*choose_opt}@Q!a@@@@3@@@@@@@@@@@((()@@^@%split~@C@@@@u!a@@@@ @@@@@@@@@@@@@@@@ )) )* @@_@$find@m@@@@!a@@@@@@@@@++++@@`@(find_opt@@@@@!a@@@@P @@@@@@@@ ,7,; ,7,a@@a@*find_first@@@@@@@@@@@ڠ!a@@@@@@@ @@@@@@@1 --2 --6@@Bb@.find_first_opt@@@@@@@@@@@!a@@@@@@@@@@@@@@@@@[-//!\-//_@@lc@)find_last@@@@@@@@@@@)!a@@@@@@@ @@@@@@@40W0[40W0@@d@-find_last_opt@@@@@,@@@@@@N!a@@@@0@@@à@@@@@@@@@@;1v1z;1v1@@e@#map@@!a@!b@@@@y @@@} @@@@@@@@C22C22@@f@$mapi@@a@@@@!a@!b@@@@@@ @@@ @@@@@@@@J44J44I@@g@&to_seq@!a@@@@&Stdlib#Seq!t@@@ڠ@@@@@@@@P44P45#@@#h@*to_rev_seq@ՠ!a@@@@%#Seq!t@@@@@@@@@@@4T5y5}5T5y5@@Ei@+to_seq_from@@@@@!a@@@@L#Seq!t@@@@@@@@@@@@@[X56\X562@@lj@'add_seq@f#Seq!t@@@!a@@@@@@@3 @@@7@@@@@@@@]66]66@@k@&of_seq@#Seq!t#@@@!a@@@@@@Y@@@@@@a7M7Qa7M7v@@l@@@A  d77@m@Ӡ$Make^@#Ord_Ñ8@@@A!t@@@@@@@g78g78*@@@@oA@8@@A@A@@@@@@A@ @@@@@@@@ @@@@@@@@@@}@z@y@4@@@@ x@@@@u@@@@@@@@t@q@p@@@@@o@@6@@@: @@@@@@@@@@l@i@h@*@@@@@gd@@@@a@@@@@@V @@@Z@@@@@@@@@@`@]@\@J@@@@[@j@@@@@@@@X@U@T@Z@@@@yS@@@@~@@@@@@@@P@M@L@@p@@@@KJ@@@@@GF@@@@CB@@@@@@@@@@@@@@@@@@@@@@@@@@@@?@<@;@@@@@@:@@7@@@@@@@@@@Ơ @@@@̠@@@Р@@@@@@@@@@6@3@2@@1@@.@@@@@@@@ @@@@@@@-@@@@@@@@@@,@)@(@@'@@$@@@@@@@@ @@@@@@@#@@@@@@@@@@"@@@@@@@@@@@@@@@@@! @@@@@@@@@@@@@@@@@@@@@@@@@@@@@; @@@@  @@@@@@@ @@@@/@@@@@@@@@@@@@T @@@@@@@@@@@@@@@I@@@ @@ @@@ @@ @@ @n @@@@@@@@@@@@@@@c@@@@@@@@@@@@@ @@@ @@@@@@@@@@@@~@@@@@@!@@@@@@@@ @@@  @@@"@@#@@$@@@@@@@@%@@+@@@&@@'@@(@ @@@)Ǡ@@@,̠@@@*@@-@@.@@/@@@@֠@0@@@1@@@2@@3@@@@@5@@@4Ƞ@@@6 @@7@@@8@@9@@@@@;@@@:@@@< @@=@@>@@@@ @@@@@?@@@A @@B@@@C@@D@@@@"@F@@@E@@@G @@H@@I@@@@4@K@@@J%@@@L @@M@@@N@@O@@@@J@Q@@@P8@@@R @@S@@T@@@@\@V@@@UM@@@W @@X@@@Y@@Z@@@@X@@@[@w@_@@@\@@@` @@@^@@@]@@a@@b@@c@@@@y@@@d@@f@@@e@@g@@h@@~@}@@@@i@|@k@@@jy@@@l@@m@@n@x@u@t@@@@@os@@@p@@q@r@s@@@r@@@t @@u@@v@@w@o@l@k@@@@@xj@@@y@@z@ݠi@|@@@{f@@@} @@~@@@@@@@@e@b@a@@@@@`@@@@@@_@@@@@@@ @@@@@@@\@Y@X@@@@@W@@@@@@V@@@@S @@@ @@@@@@@@@@R@O@N@@M@J@@@@5@@@9 @@@@@@@@G@D@C@@+@@@@B@?@@@@@@N@@@R @@@@@@@@<@9@8@\7@@@@410O@@@@@@@@@@@/@,@+@t*@@@@L'&g@@@@@@@@@@@%@"@!@r@@@@ @@@@i@@@@@@@@@@@@@@@@|@@@@@@@@@@@@@ @@@@@@@@@@ @  @@@ @@@@@@ՠ@@@@@@@@@@ g77@ p@@@^L+Stdlib__Map0ҭfȨ؜ׇ0+Stdlib__Seq0yt\eǟ&Q,}.Stdlib__Either0 }rCT0J){9)&Stdlib0>,W:(8CamlinternalFormatBasics0cEXy Stdlib.compare y0 y1 | c -> c end module PairsMap = Map.Make(IntPairs) let m = PairsMap.(empty |> add (0,1) "hello" |> add (1,0) "world") ]} This creates a new module [PairsMap], with a new type ['a PairsMap.t] of maps from [int * int] to ['a]. In this example, [m] contains [string] values so its type is [string PairsMap.t]. 'map.mliSo@@@@@@0@@@@@@%arrayH8@@M@A@A@@@@@@8@@@$boolE8@@%false^@@B@$true_@@H@@@A@@@@@I@A@$charB8@@@A@@@@@M@A@#exnG8@@AA@@@@@Q@@@5extension_constructorP8@@@A@@@@@U@@@%floatD8@@@A@@@@@Y@@@*floatarrayQ8@@@A@@@@@]@@@#intA8@@@A@@@@@a@A@%int32L8@@@A@@@@@e@@@%int64M8@@@A@@@@@i@@@&lazy_tN8@@O@A@A@Y@@@@@r@@@$listI8@@P@A"[]a@@@"::b@@@Q@@@ @@A@Y@@@@@@@@)nativeintK8@@@A@@@@@@@@&optionJ8@@S@A$Nonec@@@$Somed@@@@@A@Y@@@@@@@@&stringO8@@@A@@@@@@@@$unitF8@@"()`@@@@@A@@@@@@A@ .Assert_failure\ p@@@@Jm@@@@@@V@@A͠=ocaml.warn_on_literal_patternѐ@@0Division_by_zeroY @@@Aנ  @+End_of_fileX !@@@Aߠ@'FailureU )@%@@A蠰@0Invalid_argumentT 2@.@@A񠰠$#@-Match_failureR ;@:67@@\@@A21@ )Not_foundV I@@@A: 9 @-Out_of_memoryS Q@@@ABA@.Stack_overflowZ Y@@@AJI@.Sys_blocked_io[ a@@@AR"Q"@)Sys_errorW i@e@@A([+Z+@:Undefined_recursive_module] r@qmn@@c@@A6i9h9@ %bytesC8@@@A@@@@@=@@@&Stdlib@A6б+OrderedType B=q>q@БA(!t ALsMs@@8@@@A@@@@@Ps@)ocaml.doca; The type of the map keys. ^t_t@@@@@@@@@v@@@A@@0^]]^^^^^@\@A@'compare kvlv@б@г*!tvvwv@@ @@@0xwwxxxxx@w5/@A@@б@г;!tvv@@ @@@@@г>#intvv@@ @@@@@@@@!@@@'@@$* @@@v@R  A total ordering function over the keys. This is a two-argument function [f] such that [f e1 e2] is zero if the keys [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}. w  }  @@@@@@@A@@7@lfA@O@@0@<Q@A0@@Ar~  @@l ) Input signature of the functor {!Make}.     @@@@@@@q@ɰ@б!SrEA  A  @БA(#key CC  C  @@8@@@A@@@@@C  @; The type of the map keys. D  D  9@@@@@@@@@ C@@A@@0@A@`@@C6B@A@A(!tD F ; I F ; J@А!a@0@ 828@@@A@A@G@B@@@F ; ?@ϐ 0 The type of maps from type [key] to type ['a]. +G K O,G K @@@@@@@@@CD@A/F ; F0F ; H@@@@@8"@A@A@I@B@@@@@ @@A@@032233333@ @A,@%empty@I  AI  @г>!tII  JI  @А!a@E@0QPPQQQQQ@?O$@AWI  XI  @@@ @@@ @@@`I  @0 The empty map. lJ  mJ  @@@@@@@E@&@(is_emptyxL  yL  @б@гx!tL  L  @А!a@E@0@;T2@AL  L  @@@ @@@ @@гn$boolL  L  @@ @@@@@@@@@@@L   @Z % Test whether a map is empty or not. M  M  @@@@@@@F@@,#memO  O  @б@г預#keyO  O  @@ @@@0@E`,@A@@б@гӠ!tO  O  @А!a@E@O  O  @@@ @@@@@гǠ$boolO  O  $@@ @@@+@@@@@.@@@4@@17 @@@O  @ [ [mem x m] returns [true] if [m] contains a binding for [x], and [false] otherwise. P % )Q i @@@@@@@*G@@D#addS  S  @б@гE#key)S  *S  @@ @@@0+**+++++@]r,@A@@б@А!a@E@ <S  =S  @@б@г@@@9@@A4@@@G@@DJ@@@uS  @%  [add key data m] returns a map containing the same bindings as [m], plus a binding of [key] to [data]. If [key] was already bound in [m] to a value that is physically equal to [data], [m] is returned unchanged (the result of the function is then physically equal to [m]). Otherwise, the previous binding of [key] in [m] disappears. @before 4.03 Physical equality was not ensured. T  Z)b@@@@@@@H@(@W&update\dl\dr@б@г#key\dt\dw@@ @@@0@p,@A@@б@б@г&option\d\d@А!a@E@\d|\d~@@@ @@@ @@г9&option\d\d@А!a.\d\d@@@ @@@5 @@@@@8@@б@гԠ!t\d\d@А!a4H\d\d@@@:@@@O @@г預!t\d\d@А!aI]\d\d@@@O@@@d @@@@@g@@@4@@j\d{@@@q@@nt@@@\dh@ f [update key f m] returns a map containing the same bindings as [m], except for the binding of [key]. Depending on the value of [y] where [y] is [f (find_opt key m)], the binding of [key] is added, removed or updated. If [y] is [None], the binding is removed if it exists; otherwise, if [y] is [Some z] then [key] is associated to [z] in the resulting map. If [key] was already bound in [m] to a value that is physically equal to [z], [m] is returned unchanged (the result of the function is then physically equal to [m]). @since 4.06.0 ]g @@@@@@@2I@)@)singleton&i'i&@б@гM#key1i(2i+@@ @@@032233333@,@A@@б@А!a@E@ Di/Ei1@@гB!tMi8Ni9@А!aTi5Ui7@@@@@@$ @@@@@'@@@-@@*0@@@ci@ u [singleton x y] returns the one-element map that contains a binding [y] for [x]. @since 3.12.0 oj:>pm@@@@@@@J@%@=&remove{o|o@б@г#keyoo@@ @@@0@Vk,@A@@б@г!too@А!a@E@oo@@@ @@@@@г!too@А!a,oo@@@ @@@3 @@@@@6@@@<@@9?@@@o@w 1 [remove x m] returns a map containing the same bindings as [m], except for [x] which is unbound in the returned map. If [x] was not in [m], [m] is returned unchanged (the result of the function is then physically equal to [m]). @before 4.03 Physical equality was not ensured. pt@@@@@@@K@%@L%mergev"v'@б@б@г#keyw)3w)6@@ @@@0@g|.@A@@б@гq&optionw)=w)C@А!a@E@ w): w)<@@@ @@@@@б@г&optionw)Jw)P@А!b@E@3%w)G&w)I@@@ @@@:@@г&option3w)W4w)]@А!c@E@M?w)T@w)V@@@ @@@T@@@!@@W$@@@@@@ZC@@@`@@]c@@б@гM!tXxbnYxbo@А!a[m_xbk`xbm@@@a@@@t @@б@гd!toxbvpxbw@А!bVvxbswxbu@@@\@@@ @@гy!txb~xb@А!cQxb{xb}@@@W@@@ @@@@@@@@6@@9@@@N@@w)2@@@v@N  [merge f m1 m2] computes a map whose keys are a subset of the keys of [m1] and of [m2]. The presence of each such binding, and the corresponding value, is determined with the function [f]. In terms of the [find_opt] operation, we have [find_opt x (merge f m1 m2) = f x (find_opt x m1) (find_opt x m2)] for any key [x], provided that [f x None None = None]. @since 3.12.0 y+2@@@@@@@L@)@%union4<4A@б@б@гߠ#key4D4G@@ @@@0@.@A@@б@А!a@E@ 4K4M@@б@А!a 4Q4S@@г[&option4Z4`@А!a%4W4Y@@@#@@@, @@@'@@ /@@@*@@ 2%@@@8@@ 5;@@б@г!t4h4i@А!a=E4e4g@@@C@@@ L @@б@г!t4p4q@А!aT\%4m&4o@@@Z@@@c @@г(!t34x44y@А!aiq:4u;4w@@@o@@@x @@@@@{@@@6@@~9@@@N@@J4C@@@M48@  [union f m1 m2] computes a map whose keys are a subset of the keys of [m1] and of [m2]. When the same binding is defined in both arguments, the function [f] is used to combine them. This is a special case of [merge]: [union f m1 m2] is equivalent to [merge f' m1 m2], where - [f' _key None None = None] - [f' _key (Some v) None = Some v] - [f' _key None (Some v) = Some v] - [f' key (Some v1) (Some v2) = f key v1 v2] @since 4.03.0 Yz~Z|@@@@@@@qM@)@'compareef@б@б@А!a@$E@0pooppppp@*@Avw@@б@А!a ~@@г1#int@@ @@@@@@!@@@@@$@@ @@б@г!t@А!a4/@@@:@@@6 @@б@г!t@А!aKF@@@Q@@@M @@гr#int@@ @@@Z@@@@@ ]@@@.@@!`1 @@@F@@"c@@@@ Total ordering between maps. The first argument is a total ordering used to compare data associated with equal keys in the two maps.  V@@@@@@@N@!@w%equalX`Xe@б@б@А!a@2E@%0@*@AXhXj@@б@А!a  Xn Xp@@г㠐$boolXtXx@@ @@@&@@@!@@'@@@$@@( @@б@г!t)X*X@А!a4/0X}1X@@@:@@@*6 @@б@г5!t@XAX@А!aKFGXHX@@@Q@@@,M @@г$$boolUXVX@@ @@@-Z@@@@@.]@@@.@@/`1 @@@F@@0cdXg@@@gX\@ [equal cmp m1 m2] tests whether the maps [m1] and [m2] are equal, that is, contain equal keys and associate them with equal data. [cmp] is the equality predicate used to compare the data associated with the keys. st[@@@@@@@O@!@w$iter@б@б@г#key@@ @@@30@.@A@@б@А!a@>E@4 @@г$unit@@ @@@5@@@@@6@@@%@@7"( @@б@г!t@А!a*2@@@0@@@99 @@г+$unit@@ @@@:F@@@@@;I@@@,@@<L @@@@  [iter f m] applies [f] to all bindings in map [m]. [f] receives the key as first argument, and the associated value as second argument. The bindings are passed to [f] in increasing order with respect to the ordering over the type of the keys. @@@@@@@P@@`$fold@б@б@г"#key@@ @@@?0@{.@A@@б@А!a@KE@@ @@б@А!b@ME@A&'@@А!b  ,-@@@@@B% @@@ @@C(@@@.@@D+1 @@б@г5!t@A@А!a3;GH@@@9@@@FB @@б@А!b3HTU@@А!b9NZ[ @@@>>@@GS @@@@@HV@@@0@@IYe @@@h@ [fold f m init] computes [(f kN dN ... (f k1 d1 init)...)], where [k1 ... kN] are the keys of all bindings in [m] (in increasing order), and [d1 ... dN] are the associated data. t u@@@@@@@Q@@m'for_all@б@б@г#key@@ @@@N0@.@A@@б@А!a@YE@O @@гx$bool@@ @@@P@@@@@Q@@@%@@R"( @@б@г!t@А!a*2@@@0@@@T9 @@г$bool @@ @@@UF@@@@@VI@@@,@@WL @@@@ s [for_all f m] checks if all the bindings of the map satisfy the predicate [f]. @since 3.12.0  @@@@@@@ R@@`&exists@б@б@г##key  @@ @@@Z0        @{.@A@@б@А!a@eE@[   @@г$bool # $@@ @@@\@@@@@]@@@%@@^"( @@б@г-!t 8 9@А!a*2 ? @@@@0@@@`9 @@г $bool M N@@ @@@aF@@@@@bI@@@,@@cL Y @@@ \@ x [exists f m] checks if at least one binding of the map satisfies the predicate [f]. @since 3.12.0  h i7>@@@@@@@ S@@`&filter t@H u@N@б@б@г#key @Q @T@@ @@@f0        @{.@A@@б@А!a@rE@g  @X @Z@@г l$bool @^ @b@@ @@@h@@@@@i@@@%@@j"( @@б@г!t @j @k@А!a*2 @g @i@@@0@@@l9 @@г!t @r @s@А!a?G @o @q@@@E@@@nN @@@@@oQ@@@4@@pT @P@@@ @D@ ? [filter f m] returns the map with all the bindings in [m] that satisfy predicate [p]. If every binding in [m] satisfies [f], [m] is returned unchanged (the result of the function is then physically equal to [m]) @since 3.12.0 @before 4.03 Physical equality was not ensured.  tx @@@@@@@ T@&@h*filter_map  @б@б@г#key  @@ @@@s0        @.@A@@б@А!a@E@t   @@г &option  @А!b@E@u" + ,@@@ @@@w)@@@$@@x,@@@2@@y/5@@б@г6!t A B@А!a7? H I@@@=@@@{F @@гK!t V W@А!b7T ] ^@@@=@@@}[ @@@@@~^@@@4@@a j@@@ m@   [filter_map f m] applies the function [f] to every binding of [m], and builds a map from the results. For each binding [(k, v)] in the input map: - if [f k v] is [None] then [k] is not in the result, - if [f k v] is [Some v'] then the binding [(k, v')] is in the output map. For example, the following function on maps whose values are lists {[ filter_map (fun _k li -> match li with [] -> None | _::tl -> Some tl) m ]} drops all bindings of [m] whose value is an empty list, and pops the first element of each value that is non-empty. @since 4.11.0  y z!!@@@@@@@ U@&@u)partition  !! !!@б@б@г#key !! !!@@ @@@0        @.@A@@б@А!a@E@  !! !!@@г }$bool !! !!@@ @@@@@@@@@@@%@@"( @@б@г!t !! !!@А!a*2 !! !!@@@0@@@9 @@ВгР!t !! !!@А!aBJ !! !!@@@H@@@Q @@г栐!t !! !!@А!aX` !! !!@@@^@@@g @@@ @@l"@@@:@@o=@@@R@@r !!@@@ !!@ [partition f m] returns a pair of maps [(m1, m2)], where [m1] contains all the bindings of [m] that satisfy the predicate [f], and [m2] is the map with all the bindings of [m] that do not satisfy [f]. @since 3.12.0  !! ""@@@@@@@ 1V@+@(cardinal! %"" &"#@б@г %!t 0"# 1"#@А!a@E@0 8 7 7 8 8 8 8 8@2@A >"# ?"#@@@ @@@ @@г #int L"#  M"# @@ @@@@@@@@@@@ W"" @  D Return the number of bindings of a map. @since 3.12.0  c## d#T#[@@@@@@@ {W@@,(bindings" o#]#e p#]#m@б@г o!t z#]#r {#]#s@А!a@E@0        @Kf2@A #]#o #]#q@@@ @@@ @@г +$list #]# #]#@Вг #key #]#x #]#{@@ @@@#@@А!a-( #]#~ #]#@@@4@@/@@@&@@@4 #]#w$@@@3@@86'@@@ #]#a*@ p  Return the list of all bindings of the given map. The returned list is sorted in increasing order of keys with respect to the ordering [Ord.compare], where [Ord] is the argument given to {!Stdlib.Map.Make}. @since 3.12.0  ## $$@@@@@@@ X@9@K+min_binding# $$ $$@б@г ؠ!t $$ $$@А!a@E@0        @j2@A $$ $$@@@ @@@ @@Вг #key $$ $$@@ @@@@@А!a# $$ $$@@@*@@%@@@#@@(& $$@@@ $$@ ʐ Return the binding with the smallest key in a given map (with respect to the [Ord.compare] ordering), or raise [Not_found] if the map is empty. @since 3.12.0  &$$ '%v%}@@@@@@@ >Y@@</min_binding_opt$ 2%% 3%%@б@г 2!t =%% >%%@А!a@E@0 E D D E E E E E@[v2@A K%% L%%@@@ @@@ @@г ͠&option Y%% Z%%@Вг #key f%% g%%@@ @@@#@@А!a-( q%% r%%@@@4@@/@@@&@@@4 }%%$@@@3@@86'@@@ %%*@ 3 Return the binding with the smallest key in the given map (with respect to the [Ord.compare] ordering), or [None] if the map is empty. @since 4.05  %% &c&j@@@@@@@ Z@9@K+max_binding% &l&t &l&@б@г !t &l& &l&@А!a@E@0        @j2@A &l& &l&@@@ @@@ @@Вг ᠐#key &l& &l&@@ @@@@@А!a# &l& &l&@@@*@@%@@@#@@(& &l&@@@ &l&p@ { Same as {!min_binding}, but returns the binding with the largest key in the given map. @since 3.12.0  && ''@@@@@@@ [@@</max_binding_opt& ''" ''1@б@г !t ''6 ''7@А!a@E@0        @[v2@A ''3 ''5@@@ @@@ @@г &option ''F ''L@Вг E#key )''< *''?@@ @@@#@@А!a-( 4''B 5''D@@@4@@/@@@&@@@4 @'';$@@@3@@86'@@@ F''*@ } Same as {!min_binding_opt}, but returns the binding with the largest key in the given map. @since 4.05  R'M'Q S''@@@@@@@ j\@9@K&choose' ^'' _''@б@г ^!t i'' j''@А!a@E@0 q p p q q q q q@j2@A w'' x''@@@ @@@ @@Вг #key '' ''@@ @@@@@А!a# '' ''@@@*@@%@@@#@@(& ''@@@ ''@ P Return one binding of the given map, or raise [Not_found] if the map is empty. Which binding is chosen is unspecified, but equal bindings will be chosen for equal maps. @since 3.12.0  '' ((@@@@@@@ ]@@<*choose_opt( (( ((@б@г !t (( ((@А!a@E@0        @[v2@A (( ((@@@ @@@ @@г S&option (( ()@Вг #key (( ((@@ @@@#@@А!a-( (( ((@@@4@@/@@@&@@@4(($@@@3@@86'@@@ ((*@ Return one binding of the given map, or [None] if the map is empty. Which binding is chosen is unspecified, but equal bindings will be chosen for equal maps. @since 4.05 )) ))@@@@@@@-^@9@K%split)! ))" ))@б@г H#key, ))- ))@@ @@@0.--.....@d,@A@@б@г 2!t= ))> ))@А!a@E@I ))J ))@@@ @@@@@Вг O!tZ ))[ ))@А!a/a ))b ))@@@#@@@6 @@г 䠐&optionp ))q )*@А!a3Ew ))x ))@@@9@@@L @@г {!t )*  )* @А!aI[ )* )*@@@O@@@b @@@4 @@h9@@@Q@@kT@@@q@@nt@@@ ))@ R  [split x m] returns a triple [(l, data, r)], where [l] is the map with all the bindings of [m] whose key is strictly less than [x]; [r] is the map with all the bindings of [m] whose key is strictly greater than [x]; [data] is [None] if [m] contains no binding for [x], or [Some v] if [m] binds [v] to [x]. @since 3.12.0  * *++@@@@@@@_@+@$find*++++@б@г ᠐#key++++@@ @@@0@,@A@@б@г ˠ!t++++@А!a@E@++++@@@ @@@@@А!a"++++@@@ @@'@@@-@@*0@@@++ @ p [find x m] returns the current value of [x] in [m], or raises [Not_found] if no binding for [x] exists. +++,5@@@@@@@`@@=(find_opt+,7,?,7,G@б@г 6#key,7,I,7,L@@ @@@0@Vk,@A@@б@г !t+,7,S,,7,T@А!a@E@7,7,P8,7,R@@@ @@@@@г&optionE,7,[F,7,a@А!a,L,7,XM,7,Z@@@ @@@3 @@@@@6@@@<@@9?@@@[,7,;@ [find_opt x m] returns [Some v] if the current value of [x] in [m] is [v], or [None] if no binding for [x] exists. @since 4.05 g,b,fh,,@@@@@@@a@%@L*find_first,s -- t --@б@б@г #key -- --@@ @@@0@g|.@A@@г^$bool -- --!@@ @@@@@@@@@@б@г !t --) --*@А!a@E@' --& --(@@@ @@@.@@Вг ڠ#key --. --1@@ @@@>@@А!a!C --4 --6@@@(@@J@@@#@@M& @@@@@@P -- @@@ --@  [find_first f m], where [f] is a monotonically increasing function, returns the binding of [m] with the lowest key [k] such that [f k], or raises [Not_found] if no such key exists. For example, [find_first (fun k -> Ord.compare k x >= 0) m] will return the first binding [k, v] of [m] where [Ord.compare k x >= 0] (intuitively: [k >= x]), or raise [Not_found] if [x] is greater than any element of [m]. @since 4.05 !-7-;+//@@@@@@@b@@d.find_first_opt--//%-//3@б@б@г#key-//6-//9@@ @@@0@.@A@@гܠ$bool -//=-//A@@ @@@ @@@@@ @@б@г!t-//I -//J@А!a@E@ '+-//F,-//H@@@ @@@ .@@г&option9-//Y:-//_@Вгb#keyF-//OG-//R@@ @@@H@@А!a+MQ-//UR-//W@@@2@@T@@@&@@@Y]-//N$@@@3@@]6'@@@P@@`d-//5+@@@g-//!.@ [find_first_opt f m], where [f] is a monotonically increasing function, returns an option containing the binding of [m] with the lowest key [k] such that [f k], or [None] if no such key exists. @since 4.05 s./`/dt20L0U@@@@@@@c@=@t)find_last.40W0_40W0h@б@б@г#key40W0k40W0n@@ @@@0@.@A@@гj$bool40W0r40W0v@@ @@@@@@@@@@б@г!t40W0~40W0@А!a@!E@'40W0{40W0}@@@ @@@.@@Вг栐#key40W040W0@@ @@@>@@А!a!C40W040W0@@@(@@J@@@#@@M& @@@@@@P40W0j @@@40W0[@ [find_last f m], where [f] is a monotonically decreasing function, returns the binding of [m] with the highest key [k] such that [f k], or raises [Not_found] if no such key exists. @since 4.05 50091k1t@@@@@@@ d@@d-find_last_opt/;1v1~;1v1@б@б@г&#key ;1v1 ;1v1@@ @@@"0        @.@A@@г蠐$bool;1v1;1v1@@ @@@#@@@@@$@@б@г !t+;1v1,;1v1@А!a@/E@%'7;1v18;1v1@@@ @@@'.@@г&optionE;1v1F;1v1@Вгn#keyR;1v1S;1v1@@ @@@(H@@А!a+M];1v1^;1v1@@@2@@)T@@@&@@@+Yi;1v1$@@@3@@,]6'@@@P@@-`p;1v1+@@@s;1v1z.@# [find_last_opt f m], where [f] is a monotonically decreasing function, returns an option containing the binding of [m] with the highest key [k] such that [f k], or [None] if no such key exists. @since 4.05 <11A22@@@@@@@e@=@t#map0C22C22@б@б@А!a@:E@00@*@AC22C22@@А!b@ @@@@@7A@@@4@@8DC22@@@C22@ 1 [map f m] returns a map with same domain as [m], where the associated value [a] of all bindings of [m] has been replaced by the result of the application of [f] to [a]. The bindings are passed to [f] in increasing order with respect to the ordering over the type of the keys. D22H34@@@@@@@f@&@X$mapi1J44"J44&@б@б@г"#keyJ44)J44,@@ @@@=0@s.@A@@б@А!a@IE@> J440J442@@А!b@KE@?$J446%J448@@@ @@@@@@#@@A &@@б@г*!t5J44@6J44A@А!a(0<J44==J44?@@@.@@@C7 @@г?!tJJ44HKJ44I@А!b2EQJ44ERJ44G@@@8@@@EL @@@@@FO@@@4@@GR^J44(@@@aJ44@ Same as {!map}, but the function receives as arguments both the key and the associated value for each binding of the map. mK4J4NnL44@@@@@@@g@&@f8 {1 Maps and Sequences} ~N44N44@@@@@@0}||}}}}}@v#@A&to_seqmP45P45@б@г!tP45P45@А!a@ AE@L P45 P45 @@@ @@@N'@@гz#Seq!tP45P45#@Вг۠#keyP45P45@@ @@@ ;D@@А!a.IP45P45@@@5@@ <P@@@)@@@ >UP45$@@@6@@ ?Y9'@@@P44*@ J Iterate on the whole map, in ascending order of keys @since 4.07 Q5$5(R5a5w@@@@@@@h@9@l*to_rev_seqnT5y5T5y5@б@г!tT5y5T5y5@А!a@ KE@ B0@2@A T5y5T5y5@@@ @@@ D @@г#Seq!tT5y5T5y5@ВгG#key+T5y5,T5y5@@ @@@ E&@@А!a0+6T5y57T5y5@@@7@@ F2@@@)@@@ H7BT5y5$@@@6@@ I;9'@@@HT5y5}*@ K Iterate on the whole map, in descending order of keys @since 4.12 TU55UV55@@@@@@@li@9@N+to_seq_fromo`X56aX56@б@г#keykX56lX56@@ @@@ L0mllmmmmm@g,@A@@б@гq!t|X56}X56@А!a@ WE@ MX56X56@@@ @@@ O@@гa#Seq!tX56-X562@Вг #keyX56#X56&@@ @@@ P;@@А!a.@X56)X56+@@@5@@ QG@@@)@@@ SLX56"$@@@6@@ TP9'@@@V@@ USY*@@@X56-@v [to_seq_from k m] iterates on a subset of the bindings of [m], in ascending order of keys, from key [k] or above. @since 4.07 Y6367[66@@@@@@@j@<@f'add_seqp]66]66@б@г#Seq!t]66]66@Вг#key]66]66@@ @@@ X0@<@A@@А!a@ dE@ Y  ]66 ]66@@@ @@ Z@@@0@@@ \]66+@@б@г!t!]66"]66@А!a")(]66)]66@@@(@@@ ^0 @@г+!t6]667]66@А!a7>=]66>]66@@@=@@@ `E @@@@@ aH@@@7@@ bK3@@@L]66@ B Add the given bindings to the map, in order. @since 4.07 X^77Y_757K@@@@@@@pk@%@^&of_seqqda7M7Uea7M7[@б@г:#Seq!tra7M7isa7M7n@Вг#keya7M7_a7M7b@@ @@@ e0@<@A@@А!a@ nE@ f a7M7ea7M7g@@@ @@ g@@@0@@@ ia7M7^+@@г!ta7M7ua7M7v@А!a 'a7M7ra7M7t@@@&@@@ k. @@@@@ l1@@@a7M7Q@h 9 Build a map from the given bindings @since 4.07 b7w7{c77@@@@@@@l@"@D@A@A@p@\(@@a@M@w@c@@@,@@  }@ i @  @ l @  @ | @  @ o @  @  6@ "@w@c@ @`@L@b@N@@1@@)@@1@@:@&@T@@@f@@0@h@AW0@(@A!B  "d77@@Ґ * Output signature of the functor {!Make}. .e77/e77@@@@@@@1A  @0/../////@;@A@$MakeF>g77?g77@@Т#OrdsGIg77Jg78@Р+OrderedTypeRg78Sg78@0RQQRRRRR@_|vA@W,A@$@@`@L@\@H @@@%@@@  @  @  @  "@  @  @  w@ c /@  @  p@ \ @@J@6@@w@@?@+@7@#@/@@E@ @b@N@b@N@@~m@A^]@@УР䠐!Sg78g78@0@i{@t@yn~@A  @@栐#keyg78g78"@(@8@@@A!t@@@ t@@@@g78g78*@@@@o@@Aг #Ord g78% @@( @@@@uH8@@@A@@@ @@@@@@@A@vH8@A@A@@@@@A@w @@@ ~@@x@ }@@@ }o@@@ |@@ {@a_R@Ny@+@@@ z@5@@@ y)@@@ x@@ w@@ v@ @z@@@@ u@@2@@@ t6@@@ s@@ r@@ q@@ p@@{@(@@@ o@@@@@ n@@@ m@@ l@Q@@@ kU@@@ j@@ i@@ h@@ g@DB5@1|@G@@@ f@d!@@@ e@@ d@@ c@@}@V@@@ b@s@@@ aw@@@ `@@ _@@ ^@@~@@k@@@ ]@@@@ \@tj@@@ [^T@@@ Z@@ Y@@ X@@ W@@@@ V@z@@@ Ud@@@ T@@ S@@ R@@ Q@@@@@@@ P@@͠@@@ O@@ N@@ M@@ L@@@@ K@@@@ JŠ@@@ I@@ H@@ G@@ F@usf@b@@[@]K@@@ E@@ D@@ C@ؠe@@@ B@ޠk@@@ A@@@ @@@ ?@@ >@@ =@@@@@@@@ <@@ ;@@ :@@@@ 9@@@@ 8@@@ 7@@ 6@@ 5@@ 4@@@@@@@ 3@me@@@ 2@@ 1@@ 0@u@@@ /D@@@ .@@ -@@ ,@20#@@@ @@@ +@ @@@ *@@ )@@ (@+@@@ '@  @@ &@@ %@@ $@@@@!@@@ #@@@@ "@@ !@@ @C@@@ s@@@ @@ @@ @a_R@N@@:@@@ @;3@@@ @@ @@ @\C@@@ @@@ @@ @@ @  @ @@S@@@ @  @@@ @@ @@ @u @@@ y @@@ @@ @@ @   @ @@m@@@ @ r j `@@@ @@ @@ @ {@@@  j@@@ @@ @@ @ $ " @ @@@@@ @  @@@ @@ @@ @ @@@  @@@  @@@ @@ @@ @@ @   @ @ @@@  w@@@ @@ @ i g Z@ V@͠ H@@@  :@@@  S@@ @@@ @@ @   @ @ @@@ @@@  @@ @@ @   @ @ @@@  @@@  @@ @@@ @@ @ x v i@ e@ W@@@ @@@  _@@ @@ @ / - @ @ @@@   @@@  @@ @@@ @@ @   @ @. @@@ @@@ ޠ @@ @@ @   @ @? q@@@  c1@@@ ڠ |@@ @@@ @@ @ > < /@ +@<@@@ @Y @@@ ` @@@ Ҡ  @@@ Ӡj "@@@ @@ @@ @@ @   @ @\@@@ @y @@@  @@ @@ @  } p@ l@k@@@ @ R@@@  F V@@@ @@ @@ @ . , @ @@@@@  @@@ @@ @@@@ @@@ @@ @@ @@ @@@@@@@ @@@ @@ @@@@ @@@ @@ @@@ @@ @@ @\ZM@I@@@@@ 9@@@ @@ @ڠ"@@@ @@@ *@@ @@ @@ @@@@@@@ @@@ @@ @@@@ @@@ @@ @@@ @@ @@ @{@w@@pc@@ @u@@@ l@@@ @@ @@ @.,@@@@@@ @@@ @@ @% @@@ )@@@ @@ @@ @@@3@@@ '@@@ @@ @@@ @@ @a_R@N@J@@@@ 21>@@@ M@@ @@@ @@ @  @@I@@@ @f@@@ 4ҠZ@@@ @@ @@@ @@ @@ @@@Gm@@@ |@@ @@@ @@@@ @@@ @@ @@ @A?2@.@d*)@@@ @@ ~@@@ }@@@ |@@ {@@@@@cR0@Q@Ag77@@X Z Functor building an implementation of the map structure given a totally ordered type. h8+8+i8g8@@@@@@@g77@@@@@@ p@@@0@q@~A@A@@@@@@@|{@kj@BA@! @@@@@@@{z@ba@BA@76@$#@@@@@@@@@@ih@LK@32@@@@@@@@@wj\@A@ H************************************************************************$A@@%A@L@ H *BMM+BM@ H OCaml 0C1C@ H 6D7D3@ H Xavier Leroy, projet Cristal, INRIA Rocquencourt  Stdlib.compare y0 y1 | c -> c end module PairsMap = Map.Make(IntPairs) let m = PairsMap.(empty |> add (0,1) "hello" |> add (1,0) "world") ]} This creates a new module [PairsMap], with a new type ['a PairsMap.t] of maps from [int * int] to ['a]. In this example, [m] contains [string] values so its type is [string PairsMap.t]. ~<* The type of the map keys. # * A total ordering function over the keys. This is a two-argument function [f] such that [f e1 e2] is zero if the keys [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}. <* The type of the map keys.  1* The type of maps from type [key] to type ['a]. b1* The empty map. $ &* Test whether a map is empty or not. ݠ \* [mem x m] returns [true] if [m] contains a binding for [x], and [false] otherwise.  * [add key data m] returns a map containing the same bindings as [m], plus a binding of [key] to [data]. If [key] was already bound in [m] to a value that is physically equal to [data], [m] is returned unchanged (the result of the function is then physically equal to [m]). Otherwise, the previous binding of [key] in [m] disappears. @before 4.03 Physical equality was not ensured.  g* [update key f m] returns a map containing the same bindings as [m], except for the binding of [key]. Depending on the value of [y] where [y] is [f (find_opt key m)], the binding of [key] is added, removed or updated. If [y] is [None], the binding is removed if it exists; otherwise, if [y] is [Some z] then [key] is associated to [z] in the resulting map. If [key] was already bound in [m] to a value that is physically equal to [z], [m] is returned unchanged (the result of the function is then physically equal to [m]). @since 4.06.0  v* [singleton x y] returns the one-element map that contains a binding [y] for [x]. @since 3.12.0 0 2* [remove x m] returns a map containing the same bindings as [m], except for [x] which is unbound in the returned map. If [x] was not in [m], [m] is returned unchanged (the result of the function is then physically equal to [m]). @before 4.03 Physical equality was not ensured. Ϡ * [merge f m1 m2] computes a map whose keys are a subset of the keys of [m1] and of [m2]. The presence of each such binding, and the corresponding value, is determined with the function [f]. In terms of the [find_opt] operation, we have [find_opt x (merge f m1 m2) = f x (find_opt x m1) (find_opt x m2)] for any key [x], provided that [f x None None = None]. @since 3.12.0  * [union f m1 m2] computes a map whose keys are a subset of the keys of [m1] and of [m2]. When the same binding is defined in both arguments, the function [f] is used to combine them. This is a special case of [merge]: [union f m1 m2] is equivalent to [merge f' m1 m2], where - [f' _key None None = None] - [f' _key (Some v) None = Some v] - [f' _key None (Some v) = Some v] - [f' key (Some v1) (Some v2) = f key v1 v2] @since 4.03.0 O * Total ordering between maps. The first argument is a total ordering used to compare data associated with equal keys in the two maps. Š * [equal cmp m1 m2] tests whether the maps [m1] and [m2] are equal, that is, contain equal keys and associate them with equal data. [cmp] is the equality predicate used to compare the data associated with the keys. ;  * [iter f m] applies [f] to all bindings in map [m]. [f] receives the key as first argument, and the associated value as second argument. The bindings are passed to [f] in increasing order with respect to the ordering over the type of the keys. Ġ * [fold f m init] computes [(f kN dN ... (f k1 d1 init)...)], where [k1 ... kN] are the keys of all bindings in [m] (in increasing order), and [d1 ... dN] are the associated data. @ t* [for_all f m] checks if all the bindings of the map satisfy the predicate [f]. @since 3.12.0 ɠ y* [exists f m] checks if at least one binding of the map satisfies the predicate [f]. @since 3.12.0 R @* [filter f m] returns the map with all the bindings in [m] that satisfy predicate [p]. If every binding in [m] satisfies [f], [m] is returned unchanged (the result of the function is then physically equal to [m]) @since 3.12.0 @before 4.03 Physical equality was not ensured. Ӡ * [filter_map f m] applies the function [f] to every binding of [m], and builds a map from the results. For each binding [(k, v)] in the input map: - if [f k v] is [None] then [k] is not in the result, - if [f k v] is [Some v'] then the binding [(k, v')] is in the output map. For example, the following function on maps whose values are lists {[ filter_map (fun _k li -> match li with [] -> None | _::tl -> Some tl) m ]} drops all bindings of [m] whose value is an empty list, and pops the first element of each value that is non-empty. @since 4.11.0 G * [partition f m] returns a pair of maps [(m1, m2)], where [m1] contains all the bindings of [m] that satisfy the predicate [f], and [m2] is the map with all the bindings of [m] that do not satisfy [f]. @since 3.12.0  E* Return the number of bindings of a map. @since 3.12.0 c * Return the list of all bindings of the given map. The returned list is sorted in increasing order of keys with respect to the ordering [Ord.compare], where [Ord] is the argument given to {!Stdlib.Map.Make}. @since 3.12.0  * Return the binding with the smallest key in a given map (with respect to the [Ord.compare] ordering), or raise [Not_found] if the map is empty. @since 3.12.0  * Return the binding with the smallest key in the given map (with respect to the [Ord.compare] ordering), or [None] if the map is empty. @since 4.05 @ |* Same as {!min_binding}, but returns the binding with the largest key in the given map. @since 3.12.0  頠 ~* Same as {!min_binding_opt}, but returns the binding with the largest key in the given map. @since 4.05  * Return one binding of the given map, or raise [Not_found] if the map is empty. Which binding is chosen is unspecified, but equal bindings will be chosen for equal maps. @since 3.12.0  , * Return one binding of the given map, or [None] if the map is empty. Which binding is chosen is unspecified, but equal bindings will be chosen for equal maps. @since 4.05  Ơ * [split x m] returns a triple [(l, data, r)], where [l] is the map with all the bindings of [m] whose key is strictly less than [x]; [r] is the map with all the bindings of [m] whose key is strictly greater than [x]; [data] is [None] if [m] contains no binding for [x], or [Some v] if [m] binds [v] to [x]. @since 3.12.0  0 q* [find x m] returns the current value of [x] in [m], or raises [Not_found] if no binding for [x] exists.  ޠ * [find_opt x m] returns [Some v] if the current value of [x] in [m] is [v], or [None] if no binding for [x] exists. @since 4.05  } * [find_first f m], where [f] is a monotonically increasing function, returns the binding of [m] with the lowest key [k] such that [f k], or raises [Not_found] if no such key exists. For example, [find_first (fun k -> Ord.compare k x >= 0) m] will return the first binding [k, v] of [m] where [Ord.compare k x >= 0] (intuitively: [k >= x]), or raise [Not_found] if [x] is greater than any element of [m]. @since 4.05   * [find_first_opt f m], where [f] is a monotonically increasing function, returns an option containing the binding of [m] with the lowest key [k] such that [f k], or [None] if no such key exists. @since 4.05  w * [find_last f m], where [f] is a monotonically decreasing function, returns the binding of [m] with the highest key [k] such that [f k], or raises [Not_found] if no such key exists. @since 4.05  * [find_last_opt f m], where [f] is a monotonically decreasing function, returns an option containing the binding of [m] with the highest key [k] such that [f k], or [None] if no such key exists. @since 4.05  q 2* [map f m] returns a map with same domain as [m], where the associated value [a] of all bindings of [m] has been replaced by the result of the application of [f] to [a]. The bindings are passed to [f] in increasing order with respect to the ordering over the type of the keys.   * Same as {!map}, but the function receives as arguments both the key and the associated value for each binding of the map. 9* {1 Maps and Sequences} { K* Iterate on the whole map, in ascending order of keys @since 4.07  L* Iterate on the whole map, in descending order of keys @since 4.12  * [to_seq_from k m] iterates on a subset of the bindings of [m], in ascending order of keys, from key [k] or above. @since 4.07 0 C* Add the given bindings to the map, in order. @since 4.07  :* Build a map from the given bindings @since 4.07 D +* Output signature of the functor {!Make}. ݠ [* Functor building an implementation of the map structure given a totally ordered type. Z@D)../ocamlc0-strict-sequence(-absname"-w8+a-4-9-41-42-44-45-48-70"-g+-warn-error"+A*-bin-annot)-nostdlib*-principal,-safe-string/-strict-formats"-o/stdlib__Map.cmi"-c 1/home/barsac/ci/builds/workspace/bootstrap/stdlib @0ΖzZBOkCҸc0!  !!!!!@@@8CamlinternalFormatBasics0cEXy,W:(.Stdlib__Either0 }rCT0J){9)K0ҭfȨ؜ׇ0+Stdlib__Seq0yt\eǟ&Q,}@0ҭfȨ؜ׇ0Ao@ O NSR@  @@ a `ts@@  @@@  #2@@@ðnm@ml@ji@32@@@@@ts@DC@@@ ] \@  HG@SR@|{j@@   V U@  ~  @z@@P@