123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149moduleStdune_table=Tabletyperesize_policy=|Conservative|Greedytypeorder=|Natural|Fastletnew_size~next~size=function|Conservative->letincrement_size=512in(nextlandlnot(increment_size-1))+(increment_size*2)|Greedy->size*2moduletypeSettings=sigvalinitial_size:intvalresize_policy:resize_policyvalorder:orderendmoduleMake(R:Settings)()=struct(* The mutable tables in this module can be made safe if we stop leaking
information about the representation, e.g. by not exposing [compare]. *)letids=Table.create(moduleString)1024letnext=ref0moduleTable=structtype'at={default_value:'a;mutabledata:'aarray}letcreate~default_value={default_value;data=Array.makeR.initial_sizedefault_value}letresizet=letn=new_size~next:!next~size:(Array.lengtht.data)R.resize_policyinletold_data=t.datainletnew_data=Array.makent.default_valueint.data<-new_data;Array.blit~src:old_data~src_pos:0~dst:new_data~dst_pos:0~len:(Array.lengthold_data)letgettkey=ifkey>=Array.lengtht.datathent.default_valueelset.data.(key)letsett~key~data=ifkey>=Array.lengtht.datathenresizet;t.data.(key)<-dataendletnames=Table.create~default_value:""letmakes=Stdune_table.find_or_addidss~f:(funs->letn=!nextinnext:=n+1;Table.setnames~key:n~data:s;n)letgets=Stdune_table.findidssletto_stringt=Table.getnamestlethasht=String.hash(to_stringt)letall()=List.init!next~f:(funt->t)moduleT=structtypenonrect=intletcompare=matchR.orderwith|Fast->Int.compare|Natural->funxy->String.compare(to_stringx)(to_stringy)letequalxy=comparexy=Ordering.Eqletto_dyn=Dyn.Encoder.intendincludeTmoduleO=Comparable.Make(T)moduleSet=structincludeO.Setletmakel=List.fold_leftl~init:empty~f:(funaccs->addacc(makes))endmoduleMap=Map.Make(T)endmoduleNo_interning(R:Settings)()=structtypet=stringletcompare=String.comparelethash=String.hashletequal=String.equalletmakes=sletto_strings=sletgets=Somesletall()=assertfalseletto_dynt=Dyn.String(to_stringt)moduleSet=structincludeString.Setletmake=of_listendmoduleMap=String.MapmoduleTable=structtype'at={default_value:'a;data:(string,'a)Stdune_table.t}letcreate~default_value={default_value;data=Stdune_table.create(moduleString)R.initial_size}letgettk=matchStdune_table.findt.datakwith|None->t.default_value|Somes->sletsett~key~data=Stdune_table.sett.datakeydataendend