1234567891011121314151617181920212223242526272829303132333435363738394041424344454647openCoremoduletypeHASHTYPE=sigtypetvalget:t->intvalunget:int->tvalclear:Int.Set.t->unitendmoduleMake(Value:Hashtbl.Key):HASHTYPEwithtypet=Value.t=structmoduleT=Hashtbl.Make(Value)(* TODO(arjun): Since these are allocated contiguously, it would be
better to use a growable array ArrayList<Int> *)(* TODO(jnf): are you suggesting we port Frentic to Java?! *)moduleU=Int.Tabletypet=Value.tlettbl:intT.t=T.create~size:1000()letuntbl:tU.t=U.create~size:1000()letidx=ref0letclear(preserve:Int.Set.t):unit=begin(* SJS: iterate over _copy_ of tbl to avoid side effect hell! *)T.to_alisttbl|>List.filter~f:(fun(_,v)->not(Set.mempreservev))|>List.iter~f:(fun(k,v)->T.removetblk;U.removeuntblv);idx:=1+T.foldtbl~init:0~f:(fun~key~data->maxdata)endletgensym()=letr=!idxinidx:=!idx+1;rletget(v:t)=T.find_or_addtblv~default:(fun()->letn=gensym()inU.add_exnuntblnv;n)letunget(idx:int):t=U.find_exnuntblidxend