Caml1999I0312X %]%*+Stdlib__Map+OrderedType]!ta8@@@A@@@@@'map.mliss@@@@@A@'compareb@@@@@@@@#intA@@@@@@@@vv@@,A@@@q ~  @0B@!S^#keyc8@@@A@@@@@/C  0C  @@@@@CA@!td8!a@@A@A@I@B@@@?F ; ?@F ; J@@@@PDA@%emptye!a@@@@@QI  RI  @@bE@(is_emptyf@!a@@@@$boolE@@@@@@jL  kL  @@{F@#memg@L@@@@3!a@@@@@@@@@@@@O  O  $@@G@#addh@@@@@!a@@U @@@Y @@@@@@@@@@S  S  @@H@&updatei@;@@@@@&optionJ!a@@@@  @@@@@@@@@@@@@@@@@@@\dh\d@@I@)singletonj@g@@@@!a@@@@@@@@@ii9@@J@&removek@@@@@!a@@@@@@@@@@@@oo@@K@%mergel@@@@@@`!a@@@@@k!b@@@@t!c@@@@@@@@@@@@@@@@@@@@@@@@@@@@DvExb@@UL@%unionm@@@@@@!a@@ @@@@@@@@@@@@@@!@@@%@@@@@ @@ @@ @q48r4y@@M@'comparen@@!a@@o@@@ @@ @@@B@@@@H@@@@@@@@@@@@@@@N@%equalo@@!a@@G@@@@@@@@i@@@@o@@@W@@@@@@@@@@X\X@@O@$iterp@@W@@@ @!a@$$unitF@@@!@@"@@#@@@@% @@@&@@'@@(@@@P@$foldq@@}@@@)@!a@-@!b@/@@*@@+@@,@@@@.@  @@0@@1@@2@   @@Q@'for_allr@@@@@3@!a@7@@@4@@5@@6@ݠ @@@8@@@9@@:@@;@-. @@>R@&existss@@@@@<@!a@@@@@=@@>@@?@ @@@A@@@B@@C@@D@QR@@bS@&filtert@@@@@E@!a@J@@@F@@G@@H@% @@@I)@@@K@@L@@M@u@Dv@s@@T@*filter_mapu@@ @@@N@!a@RԠ!b@T@@@O@@P@@Q@N@@@SR@@@U@@V@@W@@@U@)partitionv@@6@@@X@!a@^P@@@Y@@Z@@[@r @@@\y@@@_~@@@]@@`@@a@@b@!!!!@@V@(cardinalw@!a@c@@@d@@@e@@f@"""# @@W@(bindingsx@!a@h@@@g$listI@@@i@@j@@@k@@l@#]#a#]#@@X@+min_bindingy@Š!a@n@@@m@@@o @@p@@q@$$$$@@-Y@/min_binding_optz@ߠ!a@s@@@rx@@@t@@u@@@v@@w@;%%<%%@@LZ@+max_binding{@!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__Map0kZ,ҷ'V+Stdlib__Seq05"g1<)b.Stdlib__Either0&]XF&Stdlib0yӶ~*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@ɰ@б!SsEA  A  @БA(#keyCC  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@8E@+0@*@AXhXj@@б@А!a  Xn Xp@@г㠐$boolXtXx@@ @@@,@@@!@@-@@@$@@. @@б@г!t)X*X@А!a4/0X}1X@@@:@@@06 @@б@г5!t@XAX@А!aKFGXHX@@@Q@@@2M @@г$$boolUXVX@@ @@@3Z@@@@@4]@@@.@@5`1 @@@F@@6cdXg@@@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@@ @@@90@.@A@@б@А!a@DE@: @@г$unit@@ @@@;@@@@@<@@@%@@="( @@б@г!t@А!a*2@@@0@@@?9 @@г+$unit@@ @@@@F@@@@@AI@@@,@@BL @@@@  [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@@ @@@E0@{.@A@@б@А!a@QE@F @@б@А!b@SE@G&'@@А!b  ,-@@@@@H% @@@ @@I(@@@.@@J+1 @@б@г5!t@A@А!a3;GH@@@9@@@LB @@б@А!b3HTU@@А!b9NZ[ @@@>>@@MS @@@@@NV@@@0@@OYe @@@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@@ @@@T0@.@A@@б@А!a@_E@U @@гx$bool@@ @@@V@@@@@W@@@%@@X"( @@б@г!t@А!a*2@@@0@@@Z9 @@г$bool @@ @@@[F@@@@@\I@@@,@@]L @@@@ s [for_all f m] checks if all the bindings of the map satisfy the predicate [f]. @since 3.12.0  @@@@@@@ R@@`&exists@б@б@г##key  @@ @@@`0        @{.@A@@б@А!a@kE@a   @@г$bool # $@@ @@@b@@@@@c@@@%@@d"( @@б@г-!t 8 9@А!a*2 ? @@@@0@@@f9 @@г $bool M N@@ @@@gF@@@@@hI@@@,@@iL 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@@ @@@l0        @{.@A@@б@А!a@xE@m  @X @Z@@г l$bool @^ @b@@ @@@n@@@@@o@@@%@@p"( @@б@г!t @j @k@А!a*2 @g @i@@@0@@@r9 @@г!t @r @s@А!a?G @o @q@@@E@@@tN @@@@@uQ@@@4@@vT @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  @@ @@@y0        @.@A@@б@А!a@E@z   @@г &option  @А!b@E@{" + ,@@@ @@@})@@@$@@~,@@@2@@/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_opt0;1v1~;1v1@б@б@г&#key ;1v1 ;1v1@@ @@@(0        @.@A@@г蠐$bool;1v1;1v1@@ @@@)@@@@@*@@б@г !t+;1v1,;1v1@А!a@5E@+'7;1v18;1v1@@@ @@@-.@@г&optionE;1v1F;1v1@Вгn#keyR;1v1S;1v1@@ @@@.H@@А!a+M];1v1^;1v1@@@2@@/T@@@&@@@1Yi;1v1$@@@3@@2]6'@@@P@@3`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#map1C22C22@б@б@А!a@@E@60@*@AC22C22@@А!b@BE@7 C22C22@@@ @@8@@б@г!tC22C22@А!a'"C22C22@@@-@@@:) @@г!tC22C22@А!b/7C22C22@@@5@@@<> @@@@@=A@@@4@@>DC22@@@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$mapi2J44"J44&@б@б@г"#keyJ44)J44,@@ @@@C0@s.@A@@б@А!a@OE@D J440J442@@А!b@QE@E$J446%J448@@@ @@F@@@#@@G &@@б@г*!t5J44@6J44A@А!a(0<J44==J44?@@@.@@@I7 @@г?!tJJ44HKJ44I@А!b2EQJ44ERJ44G@@@8@@@KL @@@@@LO@@@4@@MR^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_seqnP45P45@б@г!tP45P45@А!a@ GE@R P45 P45 @@@ @@@T'@@гz#Seq!tP45P45#@Вг۠#keyP45P45@@ @@@ AD@@А!a.IP45P45@@@5@@ BP@@@)@@@ DUP45$@@@6@@ EY9'@@@P44*@ J Iterate on the whole map, in ascending order of keys @since 4.07 Q5$5(R5a5w@@@@@@@h@9@l*to_rev_seqoT5y5T5y5@б@г!tT5y5T5y5@А!a@ QE@ H0@2@A T5y5T5y5@@@ @@@ J @@г#Seq!tT5y5T5y5@ВгG#key+T5y5,T5y5@@ @@@ K&@@А!a0+6T5y57T5y5@@@7@@ L2@@@)@@@ N7BT5y5$@@@6@@ O;9'@@@HT5y5}*@ K Iterate on the whole map, in descending order of keys @since 4.12 TU55UV55@@@@@@@li@9@N+to_seq_fromp`X56aX56@б@г#keykX56lX56@@ @@@ R0mllmmmmm@g,@A@@б@гq!t|X56}X56@А!a@ ]E@ SX56X56@@@ @@@ U@@гa#Seq!tX56-X562@Вг #keyX56#X56&@@ @@@ V;@@А!a.@X56)X56+@@@5@@ WG@@@)@@@ YLX56"$@@@6@@ ZP9'@@@V@@ [SY*@@@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_seqq]66]66@б@г#Seq!t]66]66@Вг#key]66]66@@ @@@ ^0@<@A@@А!a@ jE@ _  ]66 ]66@@@ @@ `@@@0@@@ b]66+@@б@г!t!]66"]66@А!a")(]66)]66@@@(@@@ d0 @@г+!t6]667]66@А!a7>=]66>]66@@@=@@@ fE @@@@@ gH@@@7@@ hK3@@@L]66@ B Add the given bindings to the map, in order. @since 4.07 X^77Y_757K@@@@@@@pk@%@^&of_seqrda7M7Uea7M7[@б@г:#Seq!tra7M7isa7M7n@Вг#keya7M7_a7M7b@@ @@@ k0@<@A@@А!a@ tE@ l a7M7ea7M7g@@@ @@ m@@@0@@@ oa7M7^+@@г!ta7M7ua7M7v@А!a 'a7M7ra7M7t@@@&@@@ q. @@@@@ r1@@@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@@Т#OrdtGIg77Jg78@Р+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@@@ z@@@@g78g78*@@@@o@@Aг #Ord g78% @@( @@@@vH8@@@A@@@ @@@@@@@A@wH8@A@A@@@@@A@x @@@ @@y@ }@@@ o@@@ @@ @a_R@Nz@+@@@ @5@@@ )@@@ ~@@ }@@ |@ @{@@@@ {@@2@@@ z6@@@ y@@ x@@ w@@ v@@|@(@@@ u@@@@@ t@@@ s@@ r@Q@@@ qU@@@ p@@ o@@ n@@ m@DB5@1}@G@@@ l@d!@@@ k@@ j@@ i@@~@V@@@ h@s@@@ gw@@@ f@@ e@@ d@@@@k@@@ c@@@@ b@tj@@@ a^T@@@ `@@ _@@ ^@@ ]@@@@ \@z@@@ [d@@@ Z@@ Y@@ X@@ W@@@@@@@ V@@͠@@@ U@@ T@@ S@@ R@@@@ Q@@@@ PŠ@@@ O@@ N@@ M@@ L@usf@b@@[@]K@@@ K@@ J@@ I@ؠe@@@ H@ޠk@@@ G@@@ F@@ E@@ D@@ C@@@@@@@@ B@@ A@@ @@@@@ ?@@@@ >@@@ =@@ <@@ ;@@ :@@@@@@@ 9@me@@@ 8@@ 7@@ 6@u@@@ 5D@@@ 4@@ 3@@ 2@20#@@@ @@@ 1@ @@@ 0@@ /@@ .@+@@@ -@  @@ ,@@ +@@ *@@@@!@@@ )@@@@ (@@ '@@ &@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 :/home/barsac/ci/builds/workspace/step-by-step-build/stdlib @0ΖzZBOkCҸc0!  !!!!!@@@8CamlinternalFormatBasics0cEXy