1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556openCommonopenOcollection(* assoc, also called map or dictionnary *)classvirtual['a,'b]oassoc=object(o:'o)inherit['a*'b]ocollectionmethodvirtualassoc:'a->'bmethodvirtualdelkey:'a->'o(* pre: must be in *)methodreplkey:('a*'b)->'o=fun(k,v)->o#add(k,v)(* pre: must not be in *)(* method add: ('a * 'b) -> 'o = *)(*
method keys =
List.map fst (o#tolist)
*)methodvirtualkeys:'alist(* or 'a oset ? *)methodfind:'a->'b=funk->o#assockmethodfind_opt:'a->'boption=funk->tryletres=o#assockinSomereswithNot_found->Nonemethodhaskey:'a->bool=funk->try(ignore(o#assock);true)withNot_found->falsemethodapply:'a->('b->'b)->'o=funkf->letold=o#assockino#replkey(k,fold)(* apply default, assoc_default, take in class parameters a default value *)methodapply_with_default:'a->('b->'b)->(unit->'b)->'o=funkfdefault->letold=tryo#assockwithNot_found->default()ino#replkey(k,fold)methodapply_with_default2=funkfdefault->o#apply_with_defaultkfdefault|>ignoreend