123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154(* This file is free software, part of containers. See file "license" for more details. *)(** {1 Associative containers with Heterogenerous Values} *)type'aiter=('a->unit)->unittype'agen=unit->'aoptionmoduletypeKEY_IMPL=sigtypetexceptionStoreoftvalid:intendmoduleKey=structtype'at=(moduleKEY_IMPLwithtypet='a)let_n=ref0letcreate(typek)()=incr_n;letid=!_ninletmoduleK=structtypet=kletid=idexceptionStoreofkendin(moduleK:KEY_IMPLwithtypet=k)letid(typek)(moduleK:KEY_IMPLwithtypet=k)=K.idletequal:typeab.at->bt->bool=fun(moduleK1)(moduleK2)->K1.id=K2.idendtypepair=Pair:'aKey.t*'a->pairtypeexn_pair=E_pair:'aKey.t*exn->exn_pairletpair_of_e_pair(E_pair(k,e))=letmoduleK=(valk)inmatchewith|K.Storev->Pair(k,v)|_->assertfalsemoduleTbl=structmoduleM=Hashtbl.Make(structtypet=intletequal(i:int)j=i=jlethash(i:int)=Hashtbl.hashiend)typet=exn_pairM.tletcreate?(size=16)()=M.createsizeletmemtk=M.memt(Key.idk)letfind_exn(typea)t(k:aKey.t):a=letmoduleK=(valk)inlet(E_pair(_,v))=M.findtK.idinmatchvwith|K.Storev->v|_->assertfalseletfindtk=trySome(find_exntk)withNot_found->Noneletadd_pair_tp=let(Pair(k,v))=pinletmoduleK=(valk)inletp=E_pair(k,K.Storev)inM.replacetK.idpletaddtkv=add_pair_t(Pair(k,v))letremove(typea)t(k:aKey.t)=letmoduleK=(valk)inM.removetK.idletlengtht=M.lengthtletiterft=M.iter(fun_pair->f(pair_of_e_pairpair))tletto_itertyield=iteryieldtletto_listt=M.fold(fun_pl->pair_of_e_pairp::l)t[]letadd_listtl=List.iter(add_pair_t)lletadd_itertseq=seq(add_pair_t)letcleart=M.cleartletresett=M.resettletof_listl=lett=create()inadd_listtl;tletof_iterseq=lett=create()inadd_itertseq;tendmoduleMap=structmoduleM=Map.Make(structtypet=intletcompare(i:int)j=Stdlib.compareijend)typet=exn_pairM.tletempty=M.emptyletmemkt=M.mem(Key.idk)tletfind_exn(typea)(k:aKey.t)t:a=letmoduleK=(valk)inlet(E_pair(_,e))=M.findK.idtinmatchewith|K.Storev->v|_->assertfalseletfindkt=trySome(find_exnkt)withNot_found->Noneletadd_e_pair_pt=let(E_pair((moduleK),_))=pinM.addK.idptletadd_pair_pt=let(Pair(((moduleK)ask),v))=pinletp=E_pair(k,K.Storev)inM.addK.idptletadd(typea)(k:aKey.t)vt=letmoduleK=(valk)inadd_e_pair_(E_pair(k,K.Storev))tletremove(typea)(k:aKey.t)t=letmoduleK=(valk)inM.removeK.idtletcardinalt=M.cardinaltletlength=cardinalletiterft=M.iter(fun_p->f(pair_of_e_pairp))tletto_itertyield=iteryieldtletto_listt=M.fold(fun_pl->pair_of_e_pairp::l)t[]letadd_listtl=List.fold_rightadd_pair_ltletadd_itertseq=lett=reftinseq(funpair->t:=add_pair_pair!t);!tletof_listl=add_listemptylletof_iterseq=add_iteremptyseqend