Caml1999I037B 00+Stdlib__Map+OrderedType!t;@@@A@@@@@'map.mliss@@@@@@A@'compare@@@@@@@@@@@@#intA@@@@@@@@v v@@1A@@@@#q$~  @5B@@!S#key;@@@A@@@@@4F # '5F # /@@@@FC@A@!t;!a@<@A@A@I@B@@@EI V ZFI V e@@@@WD@A@%empty!a@=@@@>@WL  XL  @@iE@@#add@7@@@?@@@@!a@D@@A@& @@@B@@C*@@@E@@F@@G@@H@|O  }O  @@F@@+add_to_list@%@@@I@@J@!a@O@@K@J$listK@@@L@@@M@@NU @@@P@@@Q@@R@@S@@T@X  X  @@G@@&update@U@@@U@@V@@&optionL!a@^@@@W@@X  @@@Y@@Z@@[@@@@\@@]@@@_@@`@@a@@b@^^@@H@@)singleton@@@@c@@d@!a@f@@e@@@g@@h@@i@jW[jW{@@I@@&remove@@@@j@@k@ !a@n@@@l@@mʠ@@@o@@p@@q@oo@@.J@@%merge@@@@@r@@s@p!a@}@@@t@@u@}!b@@@@v@@w!c@@@@x@@y@@z@@{@@|@ "@@@~@@@@@@@@@@@@@@@@@@gvY]hx@@yK@@%union@@@@@@@@!a@@@@@@à @@@@@@@@@@@@B@@@@@@J@@@@@N @@@@@@@@@@fjf@@L@@(cardinal@_!a@@@@@@@@@@@@@@M@@(bindings@x!a@@@@@@3@r@@@@@@@@@@@@8<8a@@N@@+min_binding@!a@@@@@@@@@@@@@@@@bfb@@ O@@/min_binding_opt@!a@@@@@@K@@@@@@@@@@@@@JNJ|@@/P@@+max_binding@ܠ!a@@@@@@@@@@@@@@@@;48<4[@@MQ@@/max_binding_opt@!a@@@@@@@@@@@@@@@@@@@^_ @@pR@@&choose@!a@@@@@@@@@@à@@@@@@|}@@S@@*choose_opt@;!a@@@@@@͠@5@@@ɠ@@@@@@@@@@@T@@$find@H@@@@@@e!a@@@@@@@@@@@@@U@@(find_opt@d@@@@@@!a@@@@@@ @@@@@@@@IMIs@@V@@*find_first@@@@@@@$boolE@@@@@@@@!a@@@@@@@@@@䠠@@@@@@@@      D@@W@@.find_first_opt@@@@@@@/@@@@@@@@٠!a@@@@@@k@@@@@@@@@@@@@@@="*".>"*"l@@OX@@)find_last@@@@@@@a@@@@@@@@ !a@@@@@@@@@@@@@@@@@@j#_#ck#_#@@|Y@@-find_last_opt@@@@@@@@@@@@@@@8!a@@@@@@ʠ@2@@@ @@@ @@@ @@ @@ @$y$}$y$@@Z@@$iter@@I@@@@@@!a@@@$unitF@@@@@@@@@@t@@@@@@@@@@@@@%%%& @@[@@$fold@@w@@@@@@!a@#@@@#acc@'@@@@@@ @@!@@"@@@@$@@%@@@&@@(@@)@@*@'%')'3'l@@ \@@#map@@!a@.@@+!b@1@@,@@-@ɠ@@@/@@0͠@@@2@@3@@4@(e(i (e(@@1]@@$mapi@@@@@5@@6@!a@;@@7!b@>@@8@@9@@:@@@@<@@=@@@?@@@@@A@K))L))@@]^@@&filter@@@@@B@@C@!a@K@@Dw@@@E@@F@@G@@H@!@@@I@@J%@@@L@@M@@N@w**x**@@_@@*filter_map@@$@@@O@@P@!a@V@@QϠ!b@Y@@@R@@S@@T@@U@R@@@W@@XV@@@Z@@[@@\@ ,, ,,?@@`@@)partition@@U@@@]@@^@!a@g@@_@@@`@@a@@b@@c@~@@@d@@e@@@@h@@@@f@@i@@j@@k@.../%@@a@@%split@@@@l@@m@!a@r@@@n@@o@ @@@s@@@@@q@@@@p@@t@@u@@v@$0'0+$0'0\@@!b@@(is_empty@Π!a@w@@@x@@y4@@@z@@{@(022!)022;@@:c@@,is_singleton@!a@|@@@}@@~M@@@@@@A32l2pB32l2@@Sd@@#mem@@@@@@@!a@@@@@@m@@@@@@@@a822b823@@se@@%equal@@!a@@@@@@@@@@@@@@@@4@@@@@@<@@@@@@@@@@@@@@@<3j3n<3j3@@f@@'compare@@!a@@@@@@@@@@@@@@@@e@@@@@@m@@@@@@@@@@@@@@@B44B44@@g@@'for_all@@p@@@@@@!a@@@@@@@@@@@@@@@@@@@@@@@@@@F5r5vF5r5@@h@@&exists@@@@@@@@!a@@@@@@@@@@@@@Š@@@@@'@@@@@@@@K66"K66Q@@-i@@'to_list@ڠ!a@@@@@@@@@@Ġ@@@@@@@@@>R66?R67@@Pj@@'of_list@@@@@Ƞ@!a@@@@@@@@@@@@@@aV7]7abV7]7@@sk@@&to_seq@ !a@@@@@@&Stdlib#Seq!t@ @@@Ҡ@@@@@@@@@\888<\888a@@l@@*to_rev_seq@I!a@@@@@@)#Seq!t@F@@@٠@@@@@@@@@`88`88@@m@@+to_seq_from@Y@@@@@@v!a@@@@@@V#Seq!t@s@@@⠠@@@@@@@@@@@d9;9?d9;9p@@n@@'add_seq@t#Seq!t@@@@砠@!a@@@@@@@@@ @@@@@@@@@@@@@ i: : i: :=@@o@@&of_seq@#Seq!t@@@@@!a@@@@@@@@ߠ@@@@@@1m::2m::@@Cp@@@@5A  6p::@Gq@@Ӡ$Make@#OrdP;@@@A!t@@@@@@@Rs;/;XSs;/;h@@@@ds@A@;@@A@A@@@@@@A@ @@@@@@ @ @*@@@@@@ @@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@7 @@@@@@@@?@@@@@@@@@@@@@@@@A@@@@@@@@@@@@@@@@@@@@@g @@@@@k@@@@@@@@@@@@@i@@@@@@@@@@@@@@@@@@@@}@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@۠@@@@@@@נ@@@@@@Ӡ@@@@@@@@@@@@@Š@@@@@@͠@@@@@Ѡ@@@@@@@@@@@@@@@@@@@@@@@@@@Ǡ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@栠@@@@@@@@@@@@7@@@@@@@2@@@@ @@@@@@@@M@@@@@@@K@@@@@@@@@@@@@@@g@@@@@@@b@@@@ @@@@@@@@}@@@@@@@{@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@ @@@@@ @@@ @@ @@@@ @@@@@@@@@@~@}@@@@@@@Π|@@@@@@@@@@@y@v@u@@@@@@@t@@@@@@q@@@@@@@@p@m@l@@@@@ @@!k@@@"@@#@@$@h@'@@@%@@&@@@@(@ @@)@@*@@+@e@b@a@@ @@@,@@-`@@@.@@/@@0@%_@3@@@1@@2\@#@@@4@@@5@@@6@@7@@8@[@X@W@@5@@@9@@:V@@@;@@<@@=@MU@@@@@>@@?@H@@@A@ @@B@@C@@D@R@O@N@@Y@@@E@@FM@@@G@@H@@I@qL@L@@@J@@KI@o@@@M@@@N@@@O@@P@@Q@H@E@D@@@@@R@@S@C@Y@@T@@@@U@@V@@W@@X@ @@@Z@@[=@@@\@@]@@^@<@9@8@@@@@_@@`@7@g@@a@4@k@@b@@c@@d@@e@@f@  @@@h@@i@ @@j @@l@@m@@n@1@.@-@@,@r@@o)@u@@p@@q@ܠ @@@s@@t @@@v@@w@@x@&@#@"@@@@@y@@z@!@@@{@@@|@@}@@~@ @@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@  @@@@@$@@@@@@@@@@@@&@@@@@@ @@@  @@@@@@@@@@@E @@@@@I @@@@@@@@@@@@K@@@@@@@@@@@@@@@@@@@h @@@@@@p@@@@v@@@@@@@@@@@@@t@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@Ѡ@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@%@@@@@@@@@@@@@@@@@@@B @@@@@@@@@@@@@@@@@G@@@@@@@@@@@@@@@@@@@d @@@@@@@@@@@@@@@@s@@@@@@@q@@@@@@ @@@ @@ @@@@@@@@ @@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@à@@@@@@@@@@@@@@@@@@ @@@@@@@!@@"@@%@@@#@@$@@@@&@@@'@@@(@@)@@*@~@{@z@yx@@@@+@w@1@@,@@@-@@.@ @@@/@@0 @@@2@@3@@4@t@q@p@on@!@@@5@m@9@@6@@@7@@86@@@:@@;@j@g@@@ s;/;/I@ t@@@@^L+Stdlib__Map0*4ɇ2&Stdlib0t0VoS%{<F:8CamlinternalFormatBasics0|.e1R$|o@@@Caml1999T037#C+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;@@#intA@@@@@;@A@$charB;@@$charA@@@@@A@A@&stringQ;@@&stringA@@@@@G@@@%bytesC;@@%bytesA@@@@@M@@@%floatD;@@%floatA@@@@@S@@@$boolE;@@%falsec@@]@$trued@@c@@@A@@@@@d@A@$unitF;@@"()e@@n@@@A@@@@@o@A@ #exnG;@@@A@@@@@s@@@#effH;@@O@A@A@@@@@@|@@@,continuationI;@@Q@@P@B,continuationA@nY@@@@@@@@@%arrayJ;@@R@A%arrayA@@@@@@@@@ $listK;@@S@A"[]f@@@"::g@@@T@@@ @@A@Y@@@@@@@@&optionL;@@V@A$Noneh@@@$Somei@@@@@A@Y@@@@@@@@)nativeintM;@@)nativeintA@@@@@@@@%int32N;@@%int32A@@@@@@@@%int64O;@@%int64A@@@@@@@@&lazy_tP;@@X@A&lazy_tA@Y@@@@@@@@ 5extension_constructorR;@@5extension_constructorA@@@@@@@@*floatarrayS;@@*floatarrayA@@@@@@@@&iarrayT;@@Y@A&iarrayA@Y@@@@@@@@ *atomic_locU;@@Z@A*atomic_locA@@@@@@ @@@ .Assert_failure`#@@@@@J@@@@@@@@[@@A!=ocaml.warn_on_literal_pattern%@&@0Division_by_zero]#@@@A+ . .@+End_of_file\#$@@@A366@'FailureY#,@'@@A<??@0Invalid_argumentX#5@0@@AE$H#H@-Match_failureV#>@@=@9@;@@a@@AV5Y4Y@)Not_foundZ#O@@@A^=a<a@-Out_of_memoryW#W@@@AfEiDi@.Stack_overflow^#_@@@AnMqLq@.Sys_blocked_io_#g@@@AvUyTy@)Sys_error[#o@j@@A^]@:Undefined_recursive_modulea#x@@w@s@u@@h@@Aon@:Continuation_already_takenb#@@@Awv@&Stdlib@A+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@b  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  }  @@@@@@@7A@@"@r2@@@@@@G@A@_"@@3.--.....@La$@A310011111@/@A6r7~  @@H ) Input signature of the functor {!Make}. E  F  @@@@@@@Hq@F@!SERA  SA  @kq@Бlk/ {1:maps Maps} hD  iD  !@@@@@@3gffggggg@fA@d@@Ð:9@99@@@9@9@6@AA+#keyCF # ,F # /@@;@@A@@@@@F # '@ې; The type of the map keys. G 0 4G 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  @b0 The empty map. M  M  @@@@@@@7E@@'@r2@@@@@@(#add5O  6O  @б@г#key@O  AO  @@ @@@3BAABBBBB@AZ8@A@@б@А!a@E@ SO  TO  @@б@г!t^O  _O  @А!aeO  fO  @@@@@@& @@гĠ!tsO  tO  @А!a,4zO  {O  @@@2@@@; @@@@@ @@@!@@@=@@ @@E8@@@M@@ @@JP@@@O  @㐠  [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. P  V s @@@@@@@F@@/@@@@@@@i+add_to_listX  X  @б@г;#keyX  X  @@ @@@3@8@A@@б@А!a@E@ X  X  @@б@г0!tX  X  @гZ$listX  X  @А!a!)X  X  @@@'@@@0 @@@@@@5 @@гT!tX  X  @г~$list X  X  @А!aEMX  X  @@@K@@@T @@@@@@Y @@@-@@ @@^5!@@@[@@ @@cV&@@@k@@ @@hn+@@@1X  .@ [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  ?\@@@@@@@WG@@>@R@@@@@@&updateU^V^@б@гڠ#key`^a^@@ @@@3baabbbbb@8@A@@б@б@гǠ&options^t^@А!a@E@^^@@@ @@@ @@г᠐&option^^@А!a.^^@@@ @@@5 @@@@@ @@:!@@б@г!t^^@А!a6J^^@@@<@@@Q @@г!t^^@А!aK_^^@@@Q@@@f @@@@@ @@k!@@@:@@ @@p^@@@y@@ @@v|@@@^ @/ ` [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@@0@?@@@@@@)singletonjW_jWh@б@г#key jWjjWm@@ @@@3@8@A@@б@А!a@E@  jWq!jWs@@гz!t)jWz*jW{@А!a0jWw1jWy@@@@@@$ @@@!@@ @@)@@@1@@ @@.4@@@CjW[@ n [singleton x y] returns the one-element map that contains a binding [y] for [x]. @since 3.12 Pk|Qm@@@@@@@iI@@*@d@@@@@@M&removegoho@б@г점#keyroso@@ @@@3tssttttt@f{8@A@@б@гԠ!too@А!a@E@o o@@@ @@@@@г!too@А!a,oo@@@ @@@3 @@@@@ @@8!@@@@@@ @@=C@@@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@@*@ؐ@@@@@@\%mergevYavYf@б@б@гb#keywhowhr@@ @@@3@w:@A@@б@гM&optionwhywh@А!a@E@whvwhx@@@ @@@@@б@гi&optionwhwh@А!b@E@3!wh"wh@@@ @@@:@@г&option/wh0wh@А!c@E@M;wh<wh@@@ @@@T@@@#@@ @@Y&@@@D@@ @@^G@@@f@@ @@ci!@@б@г!tZx[x@А!aasaxbx@@@g@@@z @@б@г !tqxrx@А!b\xxyx@@@b@@@ @@гנ!txx@А!cWxx@@@]@@@ @@@@@ @@!@@@:@@ @@=@@@V@@ @@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 yNd@@@@@@@K@@0@ǐ@@@@@@%unionfnfs@б@б@гQ#keyfvfy@@ @@@3@:@A@@б@А!a@E@ f}f@@б@А!a ff@@гO&optionff@А!a%ff@@@#@@@, @@@)@@ @@1@@@.@@ @@6)@@@>@@ @@;A@@б@гr!t!f"f@А!aCK(f)f@@@I@@@R @@б@г!t8f9f@А!aZb?f@f@@@`@@@i @@г!tMfNf@А!aowTfUf@@@u@@@~ @@@@@ @@!@@@:@@  @@ =@@@V@@  @@ jfu@@@mfj @  [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 z{@@@@@@@L@@0@@@@@@@(cardinal@б@г!t@А!a@E@3@>@A@@@ @@@ @@г#int@@ @@@@@@@@@@ @@@ @ = Return the number of bindings of a map. @since 3.12 @@@@@@@M@@@&搠@@@@@@:󐠠7 {1:bindings Bindings} 6@@@@@@3@Lg1@A(bindings 8@8H@б@гX!t8M8N@А!a@!E@ 8J8L@@@ @@@'@@г$list!8]"8a@В@г#key/8S08V@@ @@@B@@@А!a-H;8Y<8[@@@@@6@@Q@@@* @@@VI8R(@@@9@@ @@\<-@@@Q8<0@ 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 ^bf_J`@@@@@@@wN@@@@r@@@@@@{+min_binding!ubjvbu@б@гѠ!tbzb{@А!a@*E@"3@>@Abwby@@@ @@@$ @@В@г#keybb@@ @@@%@@@А!a% bb@@@@@.@@&)@@@)@@' @@(.,b@@@bf@ 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 2H@@@@@@@O@@@ސ@@@@@@N/min_binding_opt"JRJa@б@г=!tJfJg@А!a@5E@+3@m>@AJcJe@@@ @@@- @@г\&option Jv J|@В@г#key Jl Jo@@ @@@.$@@@А!a/* "Jr #Jt@@@@@8@@/3@@@* @@@18 0Jk(@@@9@@2 @@3><-@@@ 8JN0@ 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  E} F2@@@@@@@ ^P@@@@ Y@@@@@@]+max_binding# \4< ]4G@б@г!t g4L h4M@А!a@>E@63 o n n o o o o o@|>@A u4I v4K@@@ @@@8 @@В@г#key 4R 4U@@ @@@9@@@А!a%  4X 4Z@@@@@.@@:)@@@)@@; @@<., 4[@@@ 48@ t Same as {!min_binding}, but returns the binding with the largest key in the given map. @since 3.12  \` @@@@@@@ Q@@@ Ő@@@@@@N/max_binding_opt$  @б@г$!t  @А!a@IE@?3        @m>@A  @@@ @@@A @@г C&option   @В@гw#key  @@ @@@B$@@@А!a/*  @@@@@8@@C3@@@* @@@E8 (@@@9@@F @@G><-@@@ 0@p x Same as {!min_binding_opt}, but returns the binding with the largest key in the given map. @since 4.05  , -y@@@@@@@ ER@@@@ @@@@@@@]&choose% C D@б@г!t N O@А!a@RE@J3 V U U V V V V V@|>@A \ ]@@@ @@@L @@В@г蠐#key n o@@ @@@M@@@А!a%  z {@@@@@.@@N)@@@)@@O @@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   u@@@@@@@ S@@@ @@@@@@N*choose_opt&  @б@г !t  @А!a@]E@S3        @m>@A  @@@ @@@U @@г *&option  @В@г^#key  @@ @@@V$@@@А!a/*  @@@@@8@@W3@@@* @@@Y8 (@@@9@@Z @@[><-@@@ 0@ W 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@@@@ g '@@@@@@] 5 49 {1:searching Searching}  1 2@@@@@@3 0 / / 0 0 0 0 0@o1@A$find' = >@б@г #key H I@@ @@@^@@б@г!t W X@А!a@gE@_/ c d@@@ @@@a6@@А!a: n o@@@@@b@@cA@@@/@@d @@eF2 @@@ |@ ͐ q [find x m] returns the current value of [x] in [m], or raises [Not_found] if no binding for [x] exists.    G@@@@@@@ U@@@  @@@@@@e(find_opt( IQ IY@б@г %#key I[ I^@@ @@@h3        @~y8@A@@б@г !t Ie If@А!a@sE@i Ib Id@@@ @@@k@@г *&option Im Is@А!a, Ij Il@@@ @@@m3 @@@@@n @@o8!@@@@@@p @@q=C@@@ IM@ A [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@@*@ Q @@@@@@\*find_first)      !@б@б@г #key !  $ "  '@@ @@@t3 # " " # # # # #@w:@A@@г 堐$bool 0  + 1  /@@ @@@u@@@@@v@@w @@б@г !t D  7 E  8@А!a@E@x) P  4 Q  6@@@ @@@z0@@В@г ܠ#key b  < c  ?@@ @@@{A@@@А!a#G n  B o  D@@@@@,@@|P@@@)@@} @@~U, @@@J@@ @@Z   #@@@   @ Ր  [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 ""(@@@@@@@ W@@&@  @@@@@@z.find_first_opt* "*"2 "*"@@б@б@г /#key "*"C "*"F@@ @@@3        @:@A@@г y$bool "*"J "*"N@@ @@@@@@@@@@ @@б@г )!t "*"V "*"W@А!a@E@) "*"S "*"U@@@ @@@0@@г F&option "*"f "*"l@В@г z#key "*"\ "*"_@@ @@@K@@@А!a-Q "*"b "*"d@@@@@6@@Z@@@* @@@_ "*"[(@@@9@@ @@e<-@@@Z@@ @@j %"*"B3@@@ ("*".6@ y [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  5"m"q 6#G#]@@@@@@@ NX@@F@  I@@@@@@)find_last+ L#_#g M#_#p@б@б@г Ӡ#key Y#_#s Z#_#v@@ @@@3 [ Z Z [ [ [ [ [@:@A@@г $bool h#_#z i#_#~@@ @@@@@@@@@@ @@б@г ͠!t |#_# }#_#@А!a@E@) #_# #_#@@@ @@@0@@В@г #key #_# #_#@@ @@@A@@@А!a#G #_# #_#@@@@@,@@P@@@)@@ @@U, @@@J@@ @@Z #_#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  ## $a$w@@@@@@@ Y@@&@  ݐ@@@@@@z-find_last_opt, $y$ $y$@б@б@г g#key $y$ $y$@@ @@@3        @:@A@@г $bool $y$ $y$@@ @@@@@@@@@@ @@б@г a!t$y$$y$@А!a@E@)$y$$y$@@@ @@@0@@г ~&option*$y$+$y$@В@г #key8$y$9$y$@@ @@@K@@@А!a-QD$y$E$y$@@@@@6@@Z@@@* @@@_R$y$(@@@9@@ @@e<-@@@Z@@ @@j]$y$3@@@`$y$}6@ [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 m$$n%%@@@@@@@Z@@F@ @@@@@@; {1:traversing Traversing} %%%%@@@@@@3@1@A$iter-%%%%@б@б@г #key%%%%@@ @@@@@б@А!a@E@'%%%%@@гb$unit%%%%@@ @@@6@@@@@@@; @@@'@@ @@@*@@б@г (!t%&%&@А!a.P%&%&@@@4@@@W @@г$unit%&%& @@ @@@d@@@@@@@i @@@2@@ @@n%%@@@%%@ P  [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@б@б@г #key0'3':1'3'=@@ @@@321122222@:@A@@б@А!a@E@ C'3'AD'3'C@@б@А#acc@E@P'3'GQ'3'K@@А#acc  V'3'OW'3'S@@@@@@@' @@@$@@ @@, @@@4@@ @@17@@б@г !tp'3'[q'3'\@А!a9Aw'3'Xx'3'Z@@@?@@@H @@б@А#acc9N'3'`'3'd@@А#acc?T'3'h'3'l@@@F@@F@@[ @@@@@ @@` @@@8@@ @@e'3'9@@@'%')@  [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@@@@@@@\@@$@ @@@@@@̐? {1:transforming Transforming} (;(?(;(c@@@@@@3@1@A#map/(e(m(e(p@б@б@А!a@E@(e(s(e(u@@А!b@E@#(e(y(e({@@@@@ @@*@@б@г P!t(e((e(@А!a':(e((e(@@@-@@@A @@г e!t(e((e(@А!b1O(e((e(@@@7@@@V @@@@@ @@[!@@@:@@ @@`,(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. <((=))@@@@@@@U]@@+@P@@@@@@$mapi0S))T))@б@б@г ڠ#key`))a))@@ @@@3baabbbbb@:@A@@б@А!a@E@ s))t))@@А!b@E@~))))@@@@@ @@@@@'@@ @@$* @@б@г 䠐!t))))@А!a,4))))@@@2@@@; @@г !t))))@А!b6I))))@@@<@@@P @@@@@ @@U!@@@:@@ @@Z))@@@))@ Same as {!map}, but the function receives as arguments both the key and the associated value for each binding of the map. )**E*@@@@@@@^@@+@$䐠@@@@@@z&filter1****@б@б@гn#key****@@ @@@3@:@A@@б@А!a@ E@ ****@@гŠ$bool****@@ @@@@@@@@@@ ! @@@)@@  @@ &,@@б@гz!t)*****@А!a.60**1**@@@4@@@ = @@г!t>**?**@А!aCKE**F**@@@I@@@ R @@@@@  @@ W!@@@:@@  @@ \V**@@@Y**@ 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. f**g+,@@@@@@@_@@+@z@@@@@@|*filter_map2} ,, ~ ,,@б@б@г#key ,, ,,@@ @@@ 3@:@A@@б@А!a@ E@   ,, ,,!@@г&option ,,( ,,.@А!b@ !E@ " ,,% ,,'@@@ @@@ )@@@&@@  @@ .!@@@6@@  @@ 39@@б@г!t ,,6 ,,7@А!a;C ,,3 ,,5@@@A@@@ J @@г2!t ,,> ,,?@А!b;X ,,; ,,=@@@A@@@ _ @@@@@  @@ d!@@@:@@  @@ i ,,@@@ ,,@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   ,@,D ..@@@@@@@"`@@+@]@@@@@@)partition3 ..!..@б@б@г#key-.....@@ @@@ "3/../////@:@A@@б@А!a@ 5E@ # @./A./@@г$boolI./ J./ @@ @@@ $@@@@@ %@@ &! @@@)@@ ' @@ (&,@@б@г!tb./c./@А!a.6i./j./@@@4@@@ *= @@В@г̠!t{./|./@А!aGO././@@@M@@@ ,V @@@г㠐!t./$./%@А!a^f./!./#@@@d@@@ .m @@@@ @ @@ /t%@@@@@@ 0 @@ 1yC@@@\@@ 2 @@ 3~..@@@.."@ [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@@2@Ր@@@@@@%split4$0'0/$0'04@б@г]#key$0'06$0'09@@ @@@ 63@8@A@@б@гE!t$0'0@$0'0A@А!a@ FE@ 7$0'0=$0'0?@@@ @@@ 9@@В@гc!t$0'0H$0'0I@А!a0$0'0E$0'0G@@@$@@@ ;7 @@@г}&option)$0'0O*$0'0U@А!a5G0$0'0L1$0'0N@@@;@@@ =N @@@г!t@$0'0[A$0'0\@А!aL^G$0'0XH$0'0Z@@@R@@@ ?e @@@@7@"@ @@ @n>@@@Y@@ A @@ Bs\@@@{@@ C @@ Dx~ @@@c$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 p%0]0aq,11@@@@@@@b@@3@@@@@@@ + {1:predicates Predicates and comparisons} .11.12@@@@@@3@1@A(is_empty5022%022-@б@г!t02220223@А!a@ NE@ G 022/0221@@@ @@@ I'@@гt$bool0227022;@@ @@@ J4@@@@@ K@@ L9 @@@022! @ % Test whether a map is empty or not. 12<2@12<2j@@@@@@@c@@@-퐠@@@@@@X,is_singleton632l2t32l2@б@гL!t32l232l2@А!a@ VE@ O3@wr>@A 32l2 32l2@@@ @@@ Q @@г̠$bool32l232l2@@ @@@ R@@@@@ S@@ T @@@$32l2p @u H Test whether a map has exactly one element or not. @since 5.5 14222622@@@@@@@Jd@@@E@@@@@@:#mem7H822I822@б@г͠#keyS822T822@@ @@@ W3UTTUUUUU@Sn8@A@@б@г!td822e822@А!a@ aE@ Xp822q822@@@ @@@ Z@@г3$bool~822823@@ @@@ [+@@@@@ \@@ ]0 @@@8@@ ^ @@ _5;@@@822@ᐠ \ [mem x m] returns [true] if [m] contains a binding for [x], and [false] otherwise. 933:3G3h@@@@@@@e@@"@@@@@@@T%equal8<3j3r<3j3w@б@б@А!a@ tE@ b3@k6@A<3j3z<3j3|@@б@А!a <3j3<3j3@@г$bool<3j3<3j3@@ @@@ c@@@#@@ d@@ e @@@(@@ f @@ g#!@@б@г@!t<3j3<3j3@А!a83<3j3<3j3@@@>@@@ i: @@б@гW!t<3j3<3j3@А!aOJ <3j3<3j3@@@U@@@ kQ @@гР$bool<3j3<3j3@@ @@@ l^@@@@@ m@@ nc @@@2@@ o @@ ph5@@@N@@ q @@ rm0<3j3y@@@3<3j3n@ [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. @=33A@4o4@@@@@@@Yf@@(@T@@@@@@'compare9WB44XB44@б@б@А!a@ E@ u3baabbbbb@6@AhB44iB44@@б@А!a pB44qB44@@гL#intyB44zB44@@ @@@ v@@@#@@ w@@ x @@@(@@ y @@ z#!@@б@г㠐!tB44B44@А!a83B44B44@@@>@@@ |: @@б@г!tB44B44@А!aOJB44B44@@@U@@@ ~Q @@г#intB44B44@@ @@@ ^@@@@@ @@ c @@@2@@  @@ h5@@@N@@  @@ mB44@@@B44@' Total ordering between maps. The first argument is a total ordering used to compare data associated with equal keys in the two maps. C44D5%5p@@@@@@@g@@(@7@@@@@@'for_all:F5r5zF5r5@б@б@г#keyF5r5F5r5@@ @@@ 3      @:@A@@б@А!a@ E@  F5r5F5r5@@гؠ$bool#F5r5$F5r5@@ @@@ @@@@@ @@ ! @@@)@@  @@ &,@@б@г!t<F5r5=F5r5@А!a.6CF5r5DF5r5@@@4@@@ = @@г$boolQF5r5RF5r5@@ @@@ J@@@@@ @@ O @@@2@@  @@ TaF5r5@@@dF5r5v@ l [for_all f m] checks if all the bindings of the map satisfy the predicate [f]. @since 3.12 qG55rI66@@@@@@@h@@#@@@@@@@t&exists;K66&K66,@б@б@г#keyK66/K662@@ @@@ 3@:@A@@б@А!a@ E@  K666K668@@гf$boolK66<K66@@@ @@@ @@@@@ @@ ! @@@)@@  @@ &,@@б@г!tK66HK66I@А!a.6K66EK66G@@@4@@@ = @@г$boolK66MK66Q@@ @@@ J@@@@@ @@ O @@@2@@  @@ TK66.@@@K66"@C q [exists f m] checks if at least one binding of the map satisfies the predicate [f]. @since 3.12 L6R6VN66@@@@@@@i@@#@S@@@@@@t! ; {1:converting Converting} P66P66@@@@@@3@1@A'to_list<)R66*R67@б@г!t4R67 5R67 @А!a@ E@  @R67AR67@@@ @@@ '@@г$listNR67OR67@В@г֠#key\R67]R67@@ @@@ B@@@А!a-HhR67iR67@@@@@6@@ Q@@@* @@@ VvR67(@@@9@@  @@ \<-@@@~R660@ϐ 4 [to_list m] is {!bindings}[ m]. @since 5.1 S77"T7F7[@@@@@@@j@@@@@@@@@@{'of_list=V7]7eV7]7l@б@г$listV7]7zV7]7~@В@г5#keyV7]7pV7]7s@@ @@@ 3@F@A@@@А!a@ E@  V7]7vV7]7x@@@@@@@ @@@1 @@@ V7]7o/@@г5!tV7]7V7]7@А!a"*V7]7V7]7@@@(@@@ 1 @@@@@  @@ 6@@@V7]7a@J [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 W77Z8!86@@@@@@@k@@%@Z@@@@@@U&to_seq}\888@\888F@б@гy!t(\888L)\888M@А!a@CE@ 30//00000@t>@A6\888I7\888K@@@ @@@  @@г#Seq!tH\888\I\888_@ L\888`M\888a@@В@гՠ#key[\888R\\888U@@ @@@<-@@@А!a83g\888Xh\888Z@@@@@A@@=<@@@3 @@@?Au\888Q)@@@B@@@ @@AGE.@@@}\888<1@ΐ J Iterate on the whole map, in ascending order of keys @since 4.07 ]8b8f^88@@@@@@@l@@A@@@@@@@f*to_rev_seq~`88`88@б@г!t`88`88@А!a@NE@D3@>@A`88`88@@@ @@@F @@г6#Seq!t`88`88@ `88`88@@В@гY#key`88`88@@ @@@G-@@@А!a83`88`88@@@@@A@@H<@@@3 @@@JA`88)@@@B@@K @@LGE.@@@`881@R K Iterate on the whole map, in descending order of keys @since 4.12 a88b9#99@@@@@@@'m@@A@b"@@@@@@f+to_seq_from%d9;9C&d9;9N@б@г#key0d9;9Q1d9;9T@@ @@@O321122222@8@A@@б@г!tAd9;9[Bd9;9\@А!a@\E@PMd9;9XNd9;9Z@@@ @@@R@@г#Seq!t_d9;9k`d9;9n@ cd9;9odd9;9p@@В@г점#keyrd9;9asd9;9d@@ @@@SB@@@А!a6H~d9;9gd9;9i@@@@@?@@TQ@@@3 @@@VVd9;9`)@@@B@@W @@X\E.@@@d@@Y @@Zag3@@@d9;9?6@ꐠ [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 e9q9ug9: @@@@@@@n@@F@@@@@@@'add_seqi: :i: :@б@г6#Seq!ti: :(i: :+@ i: :,i: :-@@В@гY#keyi: :i: :!@@ @@@]3@O@A@@@А!a@kE@^ i: :$i: :&@@@@@@@_@@@: @@@ai: :0@@б@г[!t i: :4 i: :5@А!a$,i: :1i: :3@@@*@@@c3 @@гp!ti: :< i: :=@А!a9A&i: :9'i: :;@@@?@@@eH @@@@@f @@gM!@@@;@@h @@iR7@@@9i: :@ B Add the given bindings to the map, in order. @since 4.07 Fj:>:BGk:s:@@@@@@@_o@@*@Z@@@@@@q&of_seq]m::^m::@б@г#Seq!tlm::mm::@ pm::qm::@@В@г#keym::m::@@ @@@l3@O@A@@@А!a@vE@m m::m::@@@@@@@n@@@: @@@pm::0@@г!tm::m::@А!a"*m::m::@@@(@@@r1 @@@@@s @@t6@@@m::@ 9 Build a map from the given bindings @since 4.07 n::o::@@@@@@@p@@%@ސ@@@@@@U@YSA@2A@@Q@1@ @@4@G@'@b,@@8@@U@5@r@R@@e@@a @  M@ - @ x @  q@ > @  P@ 0 @  @e@E@Q@1@@q@O@/@7@@4@@0@@z@z@@321122222@|@A_354455555@@A:B  ;p::@@L * Output signature of the functor {!Make}. Iq::Jq:;-@@@@@@@LA  @3JIIJJJJJ@@A@$MakeFYs;/;6Zs;/;:@rt@@Т#OrdGes;/;<fs;/;?@РԠ+OrderedTypens;/;Bos;/;M@3nmmnnnnn@%A@A@m@M@Q@1@C@#@@@@?@@\@<@y@Y@@c"@@@|@\ @  H@  @  @  @ _ @  Y@ 9 @  @U@"@@x.@@m@`@@@J@*@O@/@7@@y@@"@@@@@@@Aon@@УР!Ss;/;Qs;/;R@3@z@@r@@A  @@q#keys;/;]s;/;`@+y@;@@@A!t@@@~@@@@s;/;Xs;/;h@@@@s@@@Aг #Ords;/;cs;/;f@s;/;g@@@/@@@@H;@@@A! @@@@@@@@@@A@{H;s@A@A@PO@@ge@@WA@? 2@@@@#!@@"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@4@@@@@@@@<g@@@@@@@@@@~@@}@B@2@#@?@@@|@@{@@@@@z@@y@@@x@@w@@v@c@@@u@@tg@@@s@@r@@q@@p@@@f@@@o@@n@@@mz@@@l@@k@@j@jhZ@K@y@@@i@@h@5@@@g@@f9@@@e@@d@@c@  @@@@@@b@@a@@@@`@@_@Р@@@^@@]@@@\@@[@@Z@@Y@@X@@@@W@@V@Ġ@@@U@@TȠ@@@S@@R@@Q@@P@USE@6@@@@@O@@N@)@@M@-@@L0@@@K@@J@@I@@H@@G@8@@@F@@E@@@@@D@@CD@@@B@@A@@@@@?@@@@@@>@@=@@@<@@;@trd@B@6@@@:@@9*@@@@8@C@@7@@@6@@5@@@+@@@4@@3@&@@@2@@@1@@0@@@@@@@/@@.q@>@@@-@@@,@@@+@@*@HF8@)@Y@@@)@@(@T@@@'@'@@&@@%@@@n@@@$@@#@l@@@"@@@!@@@ @@@@p@d@@@@@@@@@@n@@@@@86(@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@sqc@T@@@@ @@ @Ϡ>@@@ @@ 2B@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@z@@@@@@@@c@@@@@W@@@@@p@@@@@@@@@@(&@ @@ @@@@@@@@@@@@@7@@@@@@2@@@蠠@@@@@@@@@@@C@@@@@@@@@@@@@Zu@@@@@i@X@@@ݠ@@@@@@@@@@@:8*@@@j@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@>0@@@ @@@@@@@@@@@@à @@@@@@@@@@@@@@@@@@@@@@@@@@ޠ@@@@@@@@@@@@@RPB@3@@@@@@@@&@@@@@@@@@@@@0@@@@@4@@@@@@@@   @ @@@@@@@@ @@  @@@@@@@@@@# @@@@@' @@@@@@@@ ^ \ N@ ?@@*@@@@@@ 2@@ *@@@@@@@@@@E <@@@@@@M D@@@@S J@@@@@@@@@@   @ @R@@@@@@f @@@@@@n @@@@  @@@@z @@@@@~@@}@@|@ J H :@ @ @@@{@@z @@@y@@x@   @ @ @@@w@@v @@@u@@t@   @ @@@@s@@r@ r@@@q@@p f@@@o@@n@@m@ Q O A@ 2@@ /@@l@ 3@@k !@@@j@@i@@h@@g@ɠ =@@@f@@e@Ѡ E@@@d@@c @@@b@@a@@`@@_@   @ @@ @@^@ @@] @@@\@@[@@Z@@Y@ @@@X@@W@ @@@V@@U r@@@T@@S@@R@@Q@ W U G@ 8@@@@@P@@O@ +@@N #@@@M@@L@@K@@J@ 5@@@I@@H @@@G@@F@@E@   @ @@@@@D@@C@ @@B @@@A@@@@@?@@>@9 @@@=@@< @@@;@@:@@9@ } { m@ K@H ?@@@8@@7 3@F@@@6@ L@@5@@@4@@3@  @@@[@@@2@@@1@@@0@@/n@@@.@@-@@@z}@@@,@@+!on@z@@@*@@@)@@@(@@'@?=/@ @@@@&@@%<@@@@$@#@@#@@@"@@!@@@@@@ @@@@@@@@^@@@@@@@@@@@@@@@`^P@A@u?>@@@@@"@@@@@@@@*@@@@@.@@@@@@@@@@@@@@@@@ @@@ @@ @@@ @@ @zxj@@MQ0@@ 3!6!5!5!6!6!6!6!6@@A!;s;/;;5@@!L Z Functor building an implementation of the map structure given a totally ordered type. !It;i;i!Ju;;@@@@@@@!Ls;/;/F@G@@ @ @@"@@@@@@@@@3!`!_!_!`!`!`!`!`@@ POA@HGA@DC@=<@#"@@@@@@UT@HG@10@@@@@@@@@lk@GF@&%@@@@@@nm@ML@#"@@@@@@@ih@JI@32@@@@@@@m{k@A@ H************************************************************************!A@@!A@L@ H !BMM!BM@ H OCaml !C!C@ H !D!D3@ H Xavier Leroy, projet Cristal, INRIA Rocquencourt !E44!E4@ H !F!F@ H Copyright 1996 Institut National de Recherche en Informatique et !G!G@ H en Automatique. !H!Hg@ H !Ihh!Ih@ H All rights reserved. This file is distributed under the terms of "J"J@ H the GNU Lesser General Public License version 2.1, with the "K"KN@ H special exception on linking described in the file LICENSE. " LOO" LO@ H "M"M@ H************************************************************************"N"N5@ NOTE: If this file is map.mli, do not edit it directly! Instead, edit templates/map.template.mli and run tools/sync_stdlib_docs "P77"Q{@ * 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.  i * 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.  1* The type of maps from type [key] to type ['a]. e1* 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.  * [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 W 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.  * [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} d * 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 7 * 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 V:* {1:searching Searching} ; 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 u * [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 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  * [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 <* {1:traversing Traversing}  * [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. x * [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. Q * 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 ؠ * [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. ɠ I* Test whether a map has exactly one element or not. @since 5.5 t ]* [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.  k * 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  @ 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  6 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"ߐ" Z/home/teraram/ci/builds/workspace/parallel-build/flambda/true/label/ocaml-manycores/stdlib @@0V9N?YFQK|3""""""""@"@@8CamlinternalFormatBasics0|.e1R$|o&Stdlib0t0VoS%{<F:.Stdlib__Either0HD ?|>#0*4ɇ2Ұ@ ڐ Y2 v $@  @@!! @ Q А$@@@ @ː(@)2ǰ @@P@@