Caml1999I0376 )(+Stdlib__Map+OrderedType{!t;@@@A@@@@@'map.mliss@@@@@@A@'compare@@@@@@@@#intA@@@@@@@@vv@@-A@@@@q ~  @1B@@!S|#key;@@@A@@@@@0F # '1F # /@@@@BC@A@!t;!a@@A@A@I@B@@@AI V ZBI V e@@@@SD@A@%empty!a@@@@@SL  TL  @@eE@@#add@5@@@@!a@@  @@@$ @@@@@@@@@@rO  sO  @@F@@+add_to_list@@@@@!a@@>$listK@@@@@@I @@@@@@@@@@@@@X  X  @@G@@&update@I@@@@@&optionL!a@@@@  @@@@@@v@@@z@@@@@@@@@@^^@@H@@)singleton@u@@@@!a@@@@@@@@@jW[jW{@@I@@&remove@@@@@!a@@@@@@@@@@@@oo@@J@@%merge@@@@@@`!a@@@@@k!b@@@@t!c@@@@@@@@@@@@@@@@@@@@@@@@@@@@;vY]<x@@MK@@%union@@@@@@!a@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@hfjif@@zL@@(cardinal@)!a@@@@f@@@@@@@@M@@(bindings@@!a@@@@@<@@@@@@@@@@@@8<8a@@N@@+min_binding@a!a@@@@@Y@@@@@@@@@bfb@@O@@/min_binding_opt@}!a@@@@!@y@@@@@@@@@ @@ @JNJ|@@P@@+max_binding@!a@ @@@ @@@@ @@@@@@484[@@ Q@@/max_binding_opt@!a@@@@^@@@@@@@@@@@@@ @@,R@@&choose@۠!a@@@@@@@@@@@@@@67@@HS@@*choose_opt@!a@@@@@@@@@@@@@@@@ @WX@@iT@@$find@@@@!@!a@#@@@"@@$@@%@op@@U@@(find_opt@@@@&@5!a@(@@@'٠ @@@)@@*@@+@IMIs@@V@@*find_first@@;@@@,$boolE@@@-@@.@Z!a@0@@@/@R@@@1@@@2@@3@@4@    D@@W@@.find_first_opt@@d@@@5)@@@6@@7@!a@9@@@8%@}@@@:@@@;@@@<@@=@@>@"*"."*"l@@X@@)find_last@@@@@?U@@@@@@A@!a@C@@@B@@@@D@@@E@@F@@G@#_#c #_#@@Y@@-find_last_opt@@@@@H|@@@I@@J@Ԡ!a@L@@@Kx@@@@M@@@N@@@O@@P@@Q@4$y$}5$y$@@FZ@@$iter@@@@@R@!a@V$unitF@@@S@@T@@U@@@@W @@@X@@Y@@Z@Z%%[%& @@l[@@$fold@@ @@@[@!a@_@#acc@a@@\@@]@@^@.@@@`@  @@b@@c@@d@~'%')'3'l@@\@@#map@@!a@f!b@h@@e@K @@@gO @@@i@@j@@k@(e(i(e(@@]@@$mapi@@L@@@l@!a@o!b@q@@m@@n@o @@@ps @@@r@@s@@t@))))@@^@@&filter@@p@@@u@!a@z;@@@v@@w@@x@ @@@y@@@{@@|@@}@****@@_@@*filter_map@@@@@~@!a@M!b@@@@@@@@@@@@@@@@@@@@ ,, ,,?@@ `@@)partition@@@@@@!a@@@@@@@@@ @@@@@@@@@@@@@@@@@@<..=./%@@Na@@%split@@@@@!a@@@@@ @@@@@@@@@@@@@@@@@@i$0'0+j$0'0\@@{b@@(is_empty@*!a@@@@@@@@@@022!022;@@c@@#mem@-@@@@F!a@@@@@@@@@@@@32l2p32l2@@d@@%equal@@!a@@@@@@@@@@k@@@@q@@@#@@@@@@@@@@722723-@@e@@'compare@@!a@@@@@@@@@@@@@@@@@@@@@@@@@@@=4(4,=4(4a@@f@@'for_all@@@@@@!a@d@@@@@@@@ @@@n@@@@@@@@A45A450@@ g@@&exists@@@@@@!a@@@@@@@@@ @@@@@@@@@@@2F553F55@@Dh@@'to_list@!a@@@@@@@@Π@@@@@@@@@SM6~6TM6~6@@ei@@'of_list@Ӡ@@@@Ҡ@!a@@@@@@&@@@@@@tQ66uQ67@@j@@&to_seq@5!a@@@@&Stdlib#Seq!t@7@@@ڠ@@@@@@@@@W77W77@@k@@*to_rev_seq@\!a@@@@'#Seq!t@[@@@ࠠ@@@@@@@@@[8A8E[8A8n@@l@@+to_seq_from@l@@@@!a@@@@P#Seq!t@@@@砠@@@@@@@@@@@_88_88@@m@@'add_seq@l#Seq!t@@@@젠@!a@@@@@@@ @@@Ġ@@@@@@@@d99d99@@$n@@&of_seq@#Seq!t@@@@@!a@@@@@@@@@@@@6h::7h::>@@Ho@@@@:A  ;k::@Lp@@Ӡ$Make}@#Ord~U!;@@@A!t@@@i@@@@Wn::Xn::@@@@ir@A@';&@j@A@A@#"@@!@@@A@ @k@@@l@@@@(@@@m@@o@@@@n @@@p@@q@@r@@s@@@ @@@@t@ @w@+  @@@u@@@v3@@@x@@@y@@z@@{@@|@@@@5@@@}@@@@@@~@@@@@@S @@@W@@@@@@@@@@@@@U@@@@@g@@@@@@@@@@@e@@@@v@@@@{@@@@@@@@@@@@{@@@@@@@@@@@@@ܠ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Р@@@@@@@@@@à @@@@ɠ@@@͠@@@@@@@@@@@@@נ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@)@@@@@&@@@Š@ @@@@@@@@=@@@@@=@@@ʠ@@@@@@@@@@@@U@@@@@R@@@Р@ @@@@@@@@i@@@@@i@@@ՠ@@@@@@@@@@@@u@@@@@@@@@@@@@@@~@@@@@}@@@@z@@@@@@@@y@v@u@@@@@t@@@@@@q@@@@@@@@頠@ @@@@@@@n@k@j@@@@@i@@@@@@͠h@@@@e@@@@@@@@@@@@@@@d@a@`@@@@@_@@@@@@^@@@@@@@@@ @@@@@@@[@X@W@@@@@V@@@@@@ U@@@@R@ @@@@@@@@@@@@@ @Q@N@M@@@@@ @L@I@@@ @@ @@ @2 @@@F@@@@@@@@E@B@A@@5@@@@@@@=@@@@@@@@L @@@@  @@@@@@@:@7@6@@5@2@ @@@^@@@b @@@!@@"@@#@/@,@+@@b@@@$@*@''@)@@%@@&@w@@@({ @@@*@@+@@,@$@!@ @@{@@@-@@2@@@.@@/@@0@ @@@1 @@@3@@4@@5@@@@@@@@6@@:@<@@@7@@8@@9@ @@@; @@@=@@>@@?@@ @ @@@@@@@ @F@@@A@@B@@C@ʠ @@@D@Ҡ@@@G@ؠ@@@E@@H@@I@@J@@@@@@@K@@O@@@L@ @@@P@@@@N@@@@M@@Q@@R@@S@@@@@T@@@U@@@V@@W@@@@@@@X@@Y@@@Z@@@[@@\@@]@@@@@@b@@@@^@@_@@`@1 @@@a@7@@@c@@@d@@e@@f@@g@@@@@@l@@@@h@@i@@j@N @@@k@T@@@m@@@n@@o@@p@@q@@@@@W@@@r@@v@@@s@@t@@u@n @@@w@@@x@@y@@z@@@@@q@@@{@@@@@|@@}@@~@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Š@@@@@@@@@@@@@@@@@@@@ߠ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*@@@. @@@@@@@@@@@@5@@@@@@@@@@H@@@@@@|@y@@@ n::[@ s@@@@^L+Stdlib__Map0L5xE|O0~,J-+Stdlib__Seq0nwzG&amg.Stdlib__Either0Vy`u~c à&Stdlib0Lku]8_٠8CamlinternalFormatBasics0%FU(Q/Tu@@@Caml1999T037!6C+Stdlib__Map*ocaml.text&_none_@@A  Association tables over ordered types. This module implements applicative association tables, also known as finite maps or dictionaries, given a total ordering function over the keys. All operations over maps are purely applicative (no side-effects). The implementation uses balanced binary trees, and therefore searching and insertion take time logarithmic in the size of the map. 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 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@@@@@@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+OrderedTypeBqq@B@БA+!tAss@@;@@@A@@@@@s@)ocaml.doc; The type of the map keys. tt@@@@@@@@@@@@@A@@@@@@@@3@@A#@'comparevv@б@г7!tvv@@ @@@3@B<@A@@б@гH!tvv@@ @@@@@г#intvv@@ @@@@@@@@!@@@'@@$* @@@v@^  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@@@n@@@@@@C@A@["@@3@H]$@A3@@Ar~  @@) ) Input signature of the functor {!Make}. &  '  @@@@@@@)q@'@!SE3A  4A  @Lp@БML/ {1:maps Maps} ID  JD  !@@@@@@3HGGHHHHH@GA@d@@:9@99@@@9@9@6@AA+#keyCgF # ,hF # /@@;@@A@@@@@kF # '@א; The type of the map keys. xG 0 4yG 0 T@@@@@@@@@C@@@A@@@@@@@@;@A+!tDI V dI V e@А!a@3@Q:4;@@@A@A@G@B@@@I V Z@ 0 The type of maps from type [key] to type ['a]. J f jJ f @@@@@@@@@D@@AI V aI V c@@@@@;$@A)A@I@B@@@@@ @@A@(͐@@@@@@@3@-@A%9@%emptyL  L  @гK!tL  L  @А!a@E@3@L\/@AL  L  @@@ @@@ @@@L  @^0 The empty map. M  M  @@@@@@@E@@'@n@@@@@@(#addO  O  @б@г#key!O  "O  @@ @@@3#""#####@AZ8@A@@б@А!a@E@ 4O  5O  @@б@г!t?O  @O  @А!aFO  GO  @@@@@@& @@гĠ!tTO  UO  @А!a,4[O  \O  @@@2@@@; @@@@@>@@@9@@A4@@@G@@DJ@@@mO  @ِ  [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. zP  {V s @@@@@@@F@@)@@@@@@@c+add_to_listX  X  @б@г5#keyX  X  @@ @@@3@|8@A@@б@А!a@E@ X  X  @@б@г*!tX  X  @г@$listX  X  @А!a!)X  X  @@@'@@@0 @@@@@@5 @@гN!tX  X  @гd$listX  X  @А!aEMX  X  @@@K@@@T @@@@@@Y @@@+@@\3@@@W@@_R"@@@e@@bh%@@@X  (@r [add_to_list key data m] is [m] with [key] mapped to [l] such that [l] is [data :: Map.find key m] if [key] was bound in [m] and [[data]] otherwise. @since 5.1 Y  \@@@@@@@,G@@8@'@@@@@@&update*^+^@б@гΠ#key5^6^@@ @@@376677777@8@A@@б@б@г&optionH^I^@А!a@E@T^U^@@@ @@@ @@г&optionb^c^@А!a.i^j^@@@ @@@5 @@@@@8@@б@г점!t|^}^@А!a4H^^@@@:@@@O @@г!t^^@А!aI]^^@@@O@@@d @@@@@g@@@4@@j^@@@q@@nt@@@^@ ` [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 _h?U@@@@@@@H@@*@'̐@@@@@@)singletonjW_jWh@б@гs#keyjWjjWm@@ @@@3@8@A@@б@А!a@E@ jWqjWs@@гf!tjWzjW{@А!ajWwjWy@@@@@@$ @@@@@'@@@-@@*0@@@ jW[@x n [singleton x y] returns the one-element map that contains a binding [y] for [x]. @since 3.12 k|m@@@@@@@2I@@&@-@@@@@@I&remove0o1o@б@гԠ#key;o<o@@ @@@3=<<=====@bw8@A@@б@г!tLoMo@А!a@E@Xo Yo@@@ @@@@@г֠!tfogo@А!a,mono@@@ @@@3 @@@@@6@@@<@@9?@@@|o@萠 5 [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. ptW@@@@@@@J@@&@@@@@@@X%mergevYavYf@б@б@гF#keywhowhr@@ @@@3@s:@A@@б@г&optionwhywh@А!a@E@whvwhx@@@ @@@@@б@г9&optionwhwh@А!b@E@3whwh@@@ @@@:@@гS&optionwhwh@А!c@E@Mwhwh@@@ @@@T@@@!@@W$@@@@@@ZC@@@`@@]c@@б@г!txx@А!a[m x!x@@@a@@@t @@б@г!t0x1x@А!bV7x8x@@@\@@@ @@г!tExFx@А!cQLxMx@@@W@@@ @@@@@@@@6@@9@@@N@@\whn@@@_vY]@ː  [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 lymNd@@@@@@@K@@*@@@@@@@%unionfnfs@б@б@г)#keyfvfy@@ @@@3@:@A@@б@А!a@E@ f}f@@б@А!a ff@@г&optionff@А!a%ff@@@#@@@, @@@'@@ /@@@*@@ 2%@@@8@@ 5;@@б@гD!tff@А!a=Eff@@@C@@@ L @@б@г[!tff@А!aT\ff@@@Z@@@c @@гp!tff@А!aiqff@@@o@@@x @@@@@{@@@6@@~9@@@N@@fu@@@fj@  [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 '(@@@@@@@@L@@*@;@@@@@@(cardinal>?@б@г!tIJ@А!a@E@3QPPQQQQQ@>@AWX@@@ @@@ @@г8#intef@@ @@@@@@@@@@@p @ܐ = Return the number of bindings of a map. @since 3.12 }~@@@@@@@M@@@@@@@@@87 {1:bindings Bindings} 6@@@@@@3@Je1@A(bindings 8@8H@б@г"!t8M8N@А!a@'E@ 8J8L@@@ @@@ '@@гH$list8]8a@В@гs#key8S8V@@ @@@!B@@@А!a-H8Y8[@@@@@6@@"Q@@@* @@@$V8R(@@@7@@%Z:+@@@8<.@f 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 {!Map.Make}. @since 3.12 bfJ`@@@@@@@ N@@>@v@@@@@@y+min_binding!bjbu@б@г!t)bz*b{@А!a@/E@(310011111@>@A7bw8by@@@ @@@* @@В@г⠐#keyIbJb@@ @@@+@@@А!a% UbVb@@@@@.@@,)@@@' @@-,*ab@@@dbf@А 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 qr2H@@@@@@@O@@@@@@@@@L/min_binding_opt"JRJa@б@г!tJfJg@А!a@9E@03@k>@AJcJe@@@ @@@2 @@г&optionJvJ|@В@гV#keyJlJo@@ @@@3$@@@А!a/*JrJt@@@@@8@@43@@@* @@@68Jk(@@@7@@7<:+@@@JN.@I 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 }2@@@@@@@ P@@>@Y@@@@@@[+max_binding# 4< 4G@б@г|!t 4L 4M@А!a@AE@:3        @z>@A 4I 4K@@@ @@@< @@В@гŠ#key ,4R -4U@@ @@@=@@@А!a%  84X 94Z@@@@@.@@>)@@@' @@?,* D4[@@@ G48@ t Same as {!min_binding}, but returns the binding with the largest key in the given map. @since 3.12  T\` U@@@@@@@ mQ@@@ h@@@@@@L/max_binding_opt$ k l@б@г栐!t v w@А!a@KE@B3 ~ } } ~ ~ ~ ~ ~@k>@A  @@@ @@@D @@г&option   @В@г9#key  @@ @@@E$@@@А!a/*  @@@@@8@@F3@@@* @@@H8 (@@@7@@I<:+@@@ .@, x Same as {!min_binding_opt}, but returns the binding with the largest key in the given map. @since 4.05   y@@@@@@@ R@@>@< ᐠ@@@@@@[&choose%  @б@г_!t  @А!a@SE@L3        @z>@A  @@@ @@@N @@В@г#key  @@ @@@O@@@А!a%   @@@@@.@@P)@@@' @@Q,* '@@@ *@ 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  7 8u@@@@@@@ PS@@@ K@@@@@@L*choose_opt& N O@б@гɠ!t Y Z@А!a@]E@T3 a ` ` a a a a a@k>@A g h@@@ @@@V @@г Ԡ&option u v@В@г#key  @@ @@@W$@@@А!a/*  @@@@@8@@X3@@@* @@@Z8 (@@@7@@[<:+@@@ .@  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   q@@@@@@@ T@@>@  Đ@@@@@@[  ѐ9 {1:searching Searching}   @@@@@@3        @m1@A$find'  @б@г~#key  @@ @@@^@@б@гd!t  @А!a@eE@_/  @@@ @@@a6@@А!a:  @@@ @@b?@@@+@@cB.@@@  @ q [find x m] returns the current value of [x] in [m], or raises [Not_found] if no binding for [x] exists.  " # G@@@@@@@ ;U@@@  6@@@@@@a(find_opt( 9IQ :IY@б@гݠ#key DI[ EI^@@ @@@f3 F E E F F F F F@zu8@A@@б@гŠ!t UIe VIf@А!a@oE@g aIb bId@@@ @@@i@@г Π&option oIm pIs@А!a, vIj wIl@@@ @@@k3 @@@@@l6@@@<@@m9?@@@ IM@ 񐠠 [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  tx  @@@@@@@ V@@&@  @@@@@@X*find_first)      !@б@б@г O#key   $   '@@ @@@p3        @s:@A@@г $bool   +   /@@ @@@q@@@@@r@@б@г G!t   7   8@А!a@{E@s'   4   6@@@ @@@u.@@В@г #key   <   ?@@ @@@v?@@@А!a#E   B   D@@@@@,@@wN@@@' @@xQ* @@@D@@yT   #@@@   @   [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   E I !""(@@@@@@@ 9W@@"@  4@@@@@@t.find_first_opt* 7"*"2 8"*"@@б@б@г ݠ#key D"*"C E"*"F@@ @@@|3 F E E F F F F F@:@A@@г $bool S"*"J T"*"N@@ @@@}@@@@@~@@б@г ՠ!t e"*"V f"*"W@А!a@E@' q"*"S r"*"U@@@ @@@.@@г ޠ&option "*"f "*"l@В@г &#key "*"\ "*"_@@ @@@I@@@А!a-O "*"b "*"d@@@@@6@@X@@@* @@@] "*"[(@@@7@@a:+@@@T@@d "*"B/@@@ "*".2@  [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  "m"q #G#]@@@@@@@ X@@B@ - Ґ@@@@@@)find_last+ #_#g #_#p@б@б@г {#key #_#s #_#v@@ @@@3        @:@A@@г $bool #_#z #_#~@@ @@@@@@@@@@б@г s!t #_# #_#@А!a@E@' #_# #_#@@@ @@@.@@В@г #key !#_# "#_#@@ @@@?@@@А!a#E -#_# .#_#@@@@@,@@N@@@' @@Q* @@@D@@T <#_#r@@@ ?#_#c@ [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  L## M$a$w@@@@@@@ eY@@"@  `@@@@@@t-find_last_opt, c$y$ d$y$@б@б@г #key p$y$ q$y$@@ @@@3 r q q r r r r r@:@A@@г =$bool $y$ $y$@@ @@@@@@@@@@б@г !t $y$ $y$@А!a@E@' $y$ $y$@@@ @@@.@@г &option $y$ $y$@В@г R#key $y$ $y$@@ @@@I@@@А!a-O $y$ $y$@@@@@6@@X@@@* @@@] $y$(@@@7@@a:+@@@T@@d $y$/@@@ $y$}2@ I [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  $$ %%@@@@@@@Z@@B@ Y @@@@@@  ; {1:traversing Traversing} %% %%@@@@@@3@1@A$iter-%%%%@б@б@г #key!%%"%%@@ @@@@@б@А!a@E@'2%%3%%@@г 蠐$unit;%%<%%@@ @@@6@@@@@9@@@#@@<& @@б@г !tP%&Q%&@А!a*LW%&X%&@@@0@@@S @@г$unite%&f%& @@ @@@`@@@@@c@@@,@@fq%% @@@t%%@  [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.'%'-'%'1@б@б@г >#key'3':'3'=@@ @@@3@:@A@@б@А!a@E@ '3'A'3'C@@б@А#acc@E@'3'G'3'K@@А#acc  '3'O'3'S@@@@@% @@@ @@(@@@.@@+1 @@б@г O!t'3'['3'\@А!a3;'3'X'3'Z@@@9@@@B @@б@А#acc3H'3'`'3'd@@А#acc9N'3'h'3'l@@@>>@@S @@@@@V@@@0@@Y'3'9 @@@'%')@ s [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. 'm'q'(9@@@@@@@-\@@@ (@@@@@@y65? {1:transforming Transforming} 2(;(?3(;(c@@@@@@310011111@1@A#map/>(e(m?(e(p@б@б@А!a@E@M(e(sN(e(u@@А!b@E@#X(e(yY(e({@@@ @@(@@б@г ֠!tf(e(g(e(@А!a%8m(e(n(e(@@@+@@@? @@г 렐!t{(e(|(e(@А!b/M(e((e(@@@5@@@T @@@@@W@@@4@@Z(e(r@@@(e(i@ 5 [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. (())@@@@@@@]@@'@@@@@@@z$mapi0))))@б@б@г \#key))))@@ @@@3@:@A@@б@А!a@E@ ))))@@А!b@E@))))@@@ @@@@@#@@ &@@б@г b!t))))@А!a(0))))@@@.@@@7 @@г w!t))))@А!b2E))))@@@8@@@L @@@@@O@@@4@@R))@@@))@ Same as {!map}, but the function receives as arguments both the key and the associated value for each binding of the map. +)*,*E*@@@@@@@D^@@'@?@@@@@@r&filter1B**C**@б@б@г 蠐#keyO**P**@@ @@@3QPPQQQQQ@:@A@@б@А!a@E@ b**c**@@г)$boolk**l**@@ @@@@@@@@@@@%@@"( @@б@г !t****@А!a*2****@@@0@@@9 @@г!t****@А!a?G****@@@E@@@N @@@@@Q@@@4@@T**@@@**@ 9 [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 @before 4.03 Physical equality was not ensured. **+,@@@@@@@_@@'@(͐@@@@@@t*filter_map2 ,,  ,,@б@б@гv#key ,, ,,@@ @@@3@:@A@@б@А!a@E@  ,, ,,!@@гX&option ,,( ,,.@А!b@E@" ,,% ,,'@@@ @@@)@@@$@@,@@@2@@/5@@б@г!t ,,6 ,,7@А!a7?" ,,3# ,,5@@@=@@@F @@г!t0 ,,>1 ,,?@А!b7T7 ,,;8 ,,=@@@=@@@[ @@@@@^@@@4@@aD ,,@@@G ,,@  [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 T ,@,DU..@@@@@@@m`@@'@h@@@@@@)partition3k..l..@б@б@г#keyx..y..@@ @@@3zyyzzzzz@:@A@@б@А!a@E@ ././@@гR$bool./ ./ @@ @@@@@@@@@@@%@@"( @@б@г!t././@А!a*2././@@@0@@@9 @@В@г2!t././@А!aCK././@@@I@@@R @@@гI!t./$./%@А!aZb./!./#@@@`@@@i @@@@ @ @@p%@@@> @@sA@@@V@@v..@@@..@c [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 /&/*"00%@@@@@@@a@@.@s@@@@@@%split4$0'0/$0'04@б@г#key&$0'06'$0'09@@ @@@ 3(''(((((@8@A@@б@г!t7$0'0@8$0'0A@А!a@E@ C$0'0=D$0'0?@@@ @@@ @@В@гŠ!tU$0'0HV$0'0I@А!a0\$0'0E]$0'0G@@@$@@@7 @@@гˠ&optionl$0'0Om$0'0U@А!a5Gs$0'0Lt$0'0N@@@;@@@N @@@г!t$0'0[$0'0\@А!aL^$0'0X$0'0Z@@@R@@@e @@@@7@"@ @@n>@@@W @@qZ@@@w@@tz@@@$0'0+@  [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]0a,11@@@@@@@b@@/@Ð@@@@@@А + {1:predicates Predicates and comparisons} .11.12@@@@@@3@1@A(is_empty5022%022-@б@гT!t02220223@А!a@E@ 022/0221@@@ @@@'@@г$bool0227022;@@ @@@4@@@@@7@@@ 022! @u % Test whether a map is empty or not. 12<2@12<2j@@@@@@@/c@@@*@@@@@@V#mem6-32l2t.32l2w@б@гѠ#key832l2y932l2|@@ @@@3:99:::::@oj8@A@@б@г!tI32l2J32l2@А!a@'E@ U32l2V32l2@@@ @@@"@@г!$boolc32l2d32l2@@ @@@#+@@@@@$.@@@4@@%17 @@@q32l2p@ݐ \ [mem x m] returns [true] if [m] contains a binding for [x], and [false] otherwise. ~422522@@@@@@@d@@@@@@@@@P%equal7722723@б@б@А!a@5E@(3@g|6@A723723@@б@А!a 723 723 @@гu$bool723723@@ @@@)@@@!@@*@@@$@@+ @@б@гZ@@@@@?]@@@.@@@`1 @@@F@@Ac=4(49@@@=4(4,@ Total ordering between maps. The first argument is a total ordering used to compare data associated with equal keys in the two maps. >4b4f?44@@@@@@@f@@"@Đ@@@@@@'for_all9A45A45 @б@б@гm#keyA45A45@@ @@@D3@:@A@@б@А!a@OE@E A45A45@@г$boolA45A45@@ @@@F@@@@@G@@@%@@H"( @@б@гu!tA45'A45(@А!a*2 A45$ A45&@@@0@@@J9 @@гؠ$boolA45,A450@@ @@@KF@@@@@LI@@@,@@ML&A45  @@@)A45@ l [for_all f m] checks if all the bindings of the map satisfy the predicate [f]. @since 3.12 6B51557D55@@@@@@@Og@@@J@@@@@@l&exists:MF55NF55@б@б@г#keyZF55[F55@@ @@@P3\[[\\\\\@:@A@@б@А!a@[E@Q mF55nF55@@г4$boolvF55wF55@@ @@@R@@@@@S@@@%@@T"( @@б@г!tF55F55@А!a*2F55F55@@@0@@@V9 @@г^$boolF55F55@@ @@@WF@@@@@XI@@@,@@YLF55 @@@F55@ q [exists f m] checks if at least one binding of the map satisfies the predicate [f]. @since 3.12 G55I6@6V@@@@@@@h@@@+А@@@@@@lݐ; {1:converting Converting} K6X6\K6X6|@@@@@@3@~1@A'to_list;M6~6M6~6@б@гa!tM6~6M6~6@А!a@eE@\ M6~6M6~6@@@ @@@^'@@г$list M6~6 M6~6@В@г#keyM6~6M6~6@@ @@@_B@@@А!a-H%M6~6&M6~6@@@@@6@@`Q@@@* @@@bV3M6~6(@@@7@@cZ:+@@@9M6~6.@ 4 [to_list m] is {!bindings}[ m]. @since 5.1 FN66GO66@@@@@@@_i@@>@Z@@@@@@y'of_list<]Q66^Q66@б@г䠐$listhQ67iQ67@В@г#keyvQ66wQ66@@ @@@f3xwwxxxxx@F@A@@@А!a@oE@g Q67Q67@@@@@@@h@@@1 @@@jQ66/@@г!tQ67Q67@А!a"*Q67 Q67@@@(@@@l1 @@@@@m4@@@Q66@ [of_list bs] adds the bindings of [bs] to the empty map, in list order (if a key is bound twice in [bs] the last one takes over). @since 5.1 R77U77@@@@@@@j@@#@.Ӑ@@@@@@S&to_seq|W77W77@б@гQ!tW77W77@А!a@ E@p3@r>@AW77W77@@@ @@@r @@г#Seq!tW77W77@ W77W77@@В@г#keyW77W77@@ @@@ -@@@А!a83 W77!W77@@@@@A@@ <@@@3 @@@ A.W77)@@@@@@ EC,@@@4W77/@ J Iterate on the whole map, in ascending order of keys @since 4.07 AX77BY8)8?@@@@@@@Zk@@?@U@@@@@@d*to_rev_seq}X[8A8IY[8A8S@б@гӠ!tc[8A8Yd[8A8Z@А!a@ E@ 3kjjkkkkk@>@Aq[8A8Vr[8A8X@@@ @@@  @@г#Seq!t[8A8i[8A8l@ [8A8m[8A8n@@В@г/#key[8A8_[8A8b@@ @@@ -@@@А!a83[8A8e[8A8g@@@@@A@@ <@@@3 @@@ A[8A8^)@@@@@@ EC,@@@[8A8E/@" K Iterate on the whole map, in descending order of keys @since 4.12 \8o8s]88@@@@@@@l@@?@2א@@@@@@d+to_seq_from~_88_88@б@г~#key_88_88@@ @@@ 3@}8@A@@б@гf!t_88_88@А!a@ E@ _88_88@@@ @@@ @@г#Seq!t_88_88@ _88_88@@В@г#key'_88(_88@@ @@@ B@@@А!a6H3_884_88@@@@@?@@ Q@@@3 @@@ VA_88)@@@@@@ ZC,@@@`@@ ]c/@@@J_882@ [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 W`88Xb9}9@@@@@@@pm@@B@k@@@@@@|'add_seqnd99od99@б@г#Seq!t}d99~d99@ d99d99@@В@г)#keyd99d99@@ @@@ 3@O@A@@@А!a@ E@  d99d99@@@@@@@ @@@: @@@ d990@@б@г+!td99d99@А!a$,d99d99@@@*@@@ 3 @@г@!td99d99@А!a9Ad99d99@@@?@@@ H @@@@@ K@@@7@@ N3@@@d99@R B Add the given bindings to the map, in order. @since 4.07 e99f9:@@@@@@@ n@@&@b@@@@@@m&of_seq h:: h::#@б@г#Seq!th::1h::4@ h::5h::6@@В@гŠ#key,h::'-h::*@@ @@@ 3.--.....@O@A@@@А!a@ E@  ?h::-@h::/@@@@@@@ @@@: @@@ Mh::&0@@гŠ!tUh::=Vh::>@А!a"*\h:::]h::<@@@(@@@ 1 @@@@@ 4@@@hh::@Ԑ 9 Build a map from the given bindings @since 4.07 ui:?:Cvj:k:@@@@@@@o@@#@@@@@@@S@#A@A@@z!@@j@@h@9@@`,@@<@@]@=@~@^@@w)@  @ } @  u@ U @  D@ $ @  *@  @  @{@[@$@@Y@9@+@ @#@@{$@@$@@r@x@@3@z@A]3@@AB  k::@@P * Output signature of the functor {!Make}. l::l::@@@@@@@A  @3@@A@$MakeFn::n::@s@@Т#OrdGn::n::@Р+OrderedTypen::n::@3@A@jA@W5@@%@@b#@@@@@?@@`@@@@a@@o2@@8@ @ | @  t@ A @  N@  @  ;@  @  @h@H@Z@:@]@=@B@"@6@@?@@-@ @s@@䐠@@@@@@N@Aml@@УРZ!Sn::n::@3@x@@q@@A  @@7#keyn::n::@+?@;@@@A!t@@@ @@@@n::n::@@@@r@@@Aг #Ordn::n::@n::@@@/@@@@`H;@@@A! @@@ @@@@@@@A@AH;9@A@A@@@-+@@A@ @@@ @@@ @@@ @@@@@ @@@ @@ @@ @@ @t@e@@@@ @R@(CZ@@@ @@@ 0'b@@@ @@@ @@ @@ @@ @@@3@@@ @@٠@@@ à@@@ @@ @O@@@ S@@@ @@ @@ @@ @r@c@R@@@ @PbS@@@ @@ @@ @0. @@a@@@ @q@@@ u@@@ @@ @@ @@@@v@@@ @@@@ @@@@ xn@@@ @@ @@ @@ @@@@ @@@@ ~@@@ @@ @@ @@ @ @@@@@@ @@۠@@@ @@ @@ @@ @@@@ @@@@ à@@@ @@ @@ @@ @s@d@͠V@@@ H@@@ @@ @:8*@@ڠ@@@ @@@@ @@@ @@@ @@ @@@@@@ @@@@ @@@ @@ @pn`@Q@C@@@ 5@@@@ @P@@ @@@ @@ @ @@@@@ @@@@ @@@ @@ @@@.@@@ |@.@@@ @@@ @@@ @@ @USE@6@E(@@@ @B@@@ @2@@ @@ @@@X@@@ à@X@@@ @@@ @@@ @@ @@j@d@@@ @tR@@@ S@@ @@ @97)@@s@@@ @@@@ @@@ @@ @@ @@@@@@@ @@@ @@ @@@@ @@@@ @@@ @@ @@ @ki[@L@@@@@ <@@@ @@ @%@@@ @@@@ @2@@ @@@ @@ @@ @@@@@@@ @@@ @@ @٠@@@ @@@@ @@@ @@ @@ @}{m@^@@@@@ ~N@@@ }@@ |@7@@@ {+@@@@ z@D@@ y@@@ x@@ w@@ v@@@@@@@ u@@@@ t@@ s@@ r@@@@ q@@@ p@@ o@@ n@r@c@@@@@ m@P@EE@@ l@@ k@@ j@1W@@@ i@MM@@ h@@ g@@ f@ @ @@  @@ e@A @@@ dE @@@ c@@ b@@ a@   }@ n@@F@@@ `@ [ P@@ _@@ ^@X `@@@ ]\ Y@@@ \@@ [@@ Z@   @ @@]@@@ Y@  @@@ X@@ W@@ V@r @@@ Uv @@@ T@@ S@@ R@   @ @@w@@@ Q@ r j `@@@ P@@ O@@ N@ {@@@ M j@@@ L@@ K@@ J@ $ " @ @@@@@ I@  @@@ H@@ G@@ F@ @@@ E@ @@@ C@ @@@ D@@ B@@ A@@ @@   @ y@@@@ ?@Ġ _@@@ >@̠ g@@@ ;@ B m@@@ <@ؠ s@@@ =@@ :@@ 9@@ 8@   @ @ @@@ 7 @@@ 6@@ 5@   @ @@@@ 4@ }@@@ 3 q@@@ 2@@ 1@@ 0@ ` ^ P@ A@@ :@ < *@@@ /@@ .@@ -@  D@@@ ,@ J@@@ + @@@ *@@ )@@ (@@ '@   @ @@ @  @@@ &@@ %@@ $@& @@@ #@, @@@ " {@@@ !@@ @@ @@ @ f d V@ G@@0@@@ @ 4 ,@@@ @@ @@ @E <@@@  @@@ @@ @@ @@@@I@@@ @@@@ @@ @@ @^@@@ @@@ @@ @@ @|@Z@kL@@@ @@k@@@ @Y@@ @@@ @@ @ @@@~@@@ @@@ @@@ @@@ @@ @@@@@@ |{@@@@ @@@ @@@ @@ @NL>@/@!@@@ @@@@ @0@@ @@@ @@ @@@@@@ @Р@@@ 9@@@@ @@@ @@@ @@ @@ @om_@P@NLK@@@@ @/@@ @@@ @5@@@ 9@@@ @@ @@ @@@mΠ@@@@ 렠@@@ @@@ @@@ @@ @y@@`dC@@33@@An::H@@a Z Functor building an implementation of the map structure given a totally ordered type. o::p;/;R@@@@@@@n::Y@Z@@@0@@"~@@@@@@@@@3@"@cbA@[ZA@WV@PO@<;@! @@@@@@@|{@kj@VU@ED@0/@@  @@@@@@xw@a`@LK@<;@'&@@@@@@@~}@dc@ML@65@! @  @@@@@@kyz@A@ H************************************************************************A@@A@L@ H BMMBM@ H OCaml CC@ H DD3@ H Xavier Leroy, projet Cristal, INRIA Rocquencourt E44E4@ H FF@ H Copyright 1996 Institut National de Recherche en Informatique et 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 map.mli, do not edit it directly! Instead, edit templates/map.template.mli and run tools/sync_stdlib_docs P77Q{@ * Association tables over ordered types. This module implements applicative association tables, also known as finite maps or dictionaries, given a total ordering function over the keys. All operations over maps are purely applicative (no side-effects). The implementation uses balanced binary trees, and therefore searching and insertion take time logarithmic in the size of the map. 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 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}. 0* {1:maps Maps} <* The type of the map keys. s 1* The type of maps from type [key] to type ['a]. <1* The empty map.  * [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. z * [add_to_list key data m] is [m] with [key] mapped to [l] such that [l] is [data :: Map.find key m] if [key] was bound in [m] and [[data]] otherwise. @since 5.1 䠠 a* [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 B o* [singleton x y] returns the one-element map that contains a binding [y] for [x]. @since 3.12 䠠 6* [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. w * [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  * [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 ߠ >* Return the number of bindings of a map. @since 3.12 8* {1:bindings Bindings} q * 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 {!Map.Make}. @since 3.12  * 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  * 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 + u* Same as {!min_binding}, but returns the binding with the largest key in the given map. @since 3.12 Ġ y* Same as {!min_binding_opt}, but returns the binding with the largest key in the given map. @since 4.05 N * 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 砠 * 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 q:* {1:searching Searching} V r* [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 r * [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 L<* {1:traversing Traversing} 1 * [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. + * {1:transforming Transforming}  6* [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.  :* [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 @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  * [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 M * [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  ,* {1:predicates Predicates and comparisons}  &* Test whether a map is empty or not.  D ]* [mem x m] returns [true] if [m] contains a binding for [x], and [false] otherwise.  ߠ * [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.  I * Total ordering between maps. The first argument is a total ordering used to compare data associated with equal keys in the two maps.  m* [for_all f m] checks if all the bindings of the map satisfy the predicate [f]. @since 3.12  0 r* [exists f m] checks if at least one binding of the map satisfies the predicate [f]. @since 3.12  <* {1:converting Converting}  5* [to_list m] is {!bindings}[ m]. @since 5.1  ) * [of_list bs] adds the bindings of [bs] to the empty map, in list order (if a key is bound twice in [bs] the last one takes over). @since 5.1  K* Iterate on the whole map, in ascending order of keys @since 4.07  4 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 $ C* Add the given bindings to the map, in order. @since 4.07  :* Build a map from the given bindings @since 4.07  +* Output signature of the functor {!Make}.  [* Functor building an implementation of the map 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__Map.cmi"-c  D/builds/workspace/precheck/flambda/false/label/ocaml-linux-32/stdlib @@0t+il3        @ @@8CamlinternalFormatBasics0%FU(Q/Tu&Stdlib0Lku]8_٠.Stdlib__Either0Vy`u~c à Đ0L5xE|O0~,J-+Stdlib__Seq0nwzG&amg@0L5xE|O0~,J-As@ А_@ɐV@7AI@  X,@@@  z  F@  @o@@@`y@*@ږ  ِA@Pi@ ' 7@ n @ o@ҐQk@@M\41@ D r@@@@ ɐ <:@  @d@@ߐ:@y\@@P@@