1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162openCommonopenOset(* !!take care!!: this class does side effect, not a pure oassoc *)class['a]osethxs=object(o)inherit['a]osetvaldata=Hashtbl.create100(* if put [] then no segfault, if [11] then segfault *)methodtoset=Obj.magicdatamethodempty={<data=Hashtbl.create100>}methodaddk=Hashtbl.adddataktrue;omethoditerf=Hashtbl.iter(funkv->fk)datamethodview=raiseTodomethoddelk=Hashtbl.removedatak;omethodmemk=try(ignore(Hashtbl.finddatak);true)withNot_found->falsemethodnull=try(Hashtbl.iter(funkv->raiseCommon2.ReturnExn)data;false)withCommon2.ReturnExn->true(* TODO method length *)methodunions=letv=Hashtbl.create100ino#iter(funk->Hashtbl.addvktrue);s#iter(funk->Hashtbl.addvktrue);{<data=v>}methodinters=letv=Hashtbl.create100ino#iter(funk->ifs#memkthenHashtbl.addvktrue);{<data=v>}methodminuss=letv=Hashtbl.create100ino#iter(funk->ifnot(s#memk)thenHashtbl.addvktrue);{<data=v>}(* override default *)methodgetone=letx=refNoneintry(Hashtbl.iter(funk_->x:=Somek;raiseCommon2.ReturnExn)data;raiseNot_found)withCommon2.ReturnExn->Common2.some!xend