1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556(* This file is free software, part of containers. See file "license" for more details. *)(** {1 Set of Heterogeneous Values} *)moduleIMap=Map.Make(structtypet=intletcompare:int->int->int=compareend)(*$R
let k1 : int key = newkey () in
let k2 : int key = newkey () in
let k3 : string key = newkey () in
let set =
empty
|> set ~key:k1 1
|> set ~key:k2 2
|> set ~key:k3 "3"
in
assert (get ~key:k1 set = Some 1);
assert (get ~key:k2 set = Some 2);
assert (get ~key:k3 set = Some "3");
()
*)typet=(unit->unit)IMap.tand'akey={id:int;mutableopt:'aoption;};;letnewkey_n_=ref0letnewkey()=letid=!newkey_n_inincrnewkey_n_;{id;opt=None;}letempty=IMap.emptyletget~keyset=key.opt<-None;try(IMap.findkey.idset)();key.optwithNot_found->Noneletget_exn~keyset=matchget~keysetwith|None->raiseNot_found|Somev->vletset~keyvset=IMap.addkey.id(fun()->key.opt<-Somev)setletcardinalset=IMap.cardinalset