1234567891011121314151617181920212223242526272829303132333435363738openCommonopenOassoc(* !!take care!!: this class does side effect, not a pure oassoc *)class['a,'b]oassochxs=leth=Common.hash_of_listxsinobject(o)inherit['a,'b]oassocvaldata=hmethodempty={<data=Hashtbl.create101>}methodadd(k,v)=(Hashtbl.replacedatakv;o)(* not add cos add make iter sux *)(* redefine replkey to be more efficient than default. With hash, don't need
to delkey before add, replace do both action directly.
*)methodreplkey(k,v)=(Hashtbl.replacedatakv;o)methoditerf=Hashtbl.iter(Common2.curryf)datamethodview=raiseTodomethoddel(k,v)=(Hashtbl.removedatak;o)methodmeme=raiseTodomethodnull=(try(Hashtbl.iter(funkv->raiseCommon2.ReturnExn)data;false)withCommon2.ReturnExn->true)methodassock=tryHashtbl.finddatakwithNot_found->(Common2.log3("pb assoc with k = "^(Dumper.dumpk));raiseNot_found)methoddelkeyk=(Hashtbl.removedatak;o)methodkeys=List.mapfst(o#tolist)end