123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187(******************************************************************************)(* *)(* Fix *)(* *)(* François Pottier, Inria Paris *)(* *)(* Copyright Inria. All rights reserved. This file is distributed under the *)(* terms of the GNU Library General Public License version 2, with a *)(* special exception on linking, as described in the file LICENSE. *)(* *)(******************************************************************************)openSigsmoduleCHAR=structtypet=charendmoduleINT=structtypet=intendmoduleSTRING=structtypet=stringendmoduleTrivialOrderedType(T:TYPE)=structincludeTletcompare=compareendmoduleTrivialHashedType(T:TYPE)=structincludeTletequal=(=)lethash=Hashtbl.hashendmoduleInjectOrderedType(U:OrderedType)(I:INJECTIONwithtypeu:=U.t)=structtypet=I.tletcomparexy=U.compare(I.encodex)(I.encodey)endmoduleInjectHashedType(U:HashedType)(I:INJECTIONwithtypeu:=U.t)=structtypet=I.tletequalxy=U.equal(I.encodex)(I.encodey)lethashx=U.hash(I.encodex)endmoduleInjectMinimalImperativeMaps(M:MINIMAL_IMPERATIVE_MAPS)(I:INJECTIONwithtypeu:=M.key)=structtypekey=I.ttype'datat='dataM.tletcreate=M.createletaddxym=M.add(I.encodex)ymletfindxm=M.find(I.encodex)mendmoduleInjectImperativeMaps(M:IMPERATIVE_MAPS)(I:INJECTIONwithtypeu:=M.key)(J:sigvaldecode:M.key->I.tend)=structincludeInjectMinimalImperativeMaps(M)(I)letclear=M.clearletiterfm=M.iter(funxy->f(J.decodex)y)mendmodulePersistentMapsToImperativeMaps(M:PERSISTENT_MAPS)=structtypekey=M.keytype'datat='dataM.trefletcreate()=refM.emptyletcleart=t:=M.emptyletaddkdt=t:=M.addkd!tletfindkt=M.findk!tletiterft=M.iterf!tendmoduleArraysAsImperativeMaps(K:sigvaln:intend)=structopenKtypekey=inttype'datat='dataoptionarrayletcreate()=Array.makenNoneletclearm=Array.fillm0nNoneletaddkeydatam=m.(key)<-Somedataletfindkeym=matchm.(key)with|None->raiseNot_found|Somedata->dataletiterfm=Array.iteri(funkeydata->matchdatawith|None->()|Somedata->fkeydata)mendmoduleHashTablesAsImperativeMaps(H:HashedType)=structincludeHashtbl.Make(H)(* [clear], [iter] are included *)letcreate()=create1023letaddkeydatatable=addtablekeydataletfindkeytable=findtablekeyendmoduleWeakHashTablesAsImperativeMaps(H:HashedType)=structincludeEphemeron.K1.Make(H)(* [iter] is not included because it is not supported by the new ephemeron
API in OCaml 5. *)letcreate()=create1023letaddkeydatatable=addtablekeydataletfindtablekey=findkeytableendmoduleMinimalSemiLattice(P:SEMI_LATTICE)=structtypeproperty=P.propertyletleq_joinp'p=ifP.leqp'pthenpelseP.joinp'pend