12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970openCommon(*****************************************************************************)(* Collection *)(*****************************************************************************)(*---------------------------------------------------------------------------*)type('a,'b)view=Empty|Consof'a*'bclassvirtual['a]ocollection=object(o:'o)inheritObjet.objetmethodvirtualempty:'omethodvirtualadd:'a->'omethodvirtualiter:('a->unit)->unitmethodvirtualview:('a,'o)view(* no need virtual, but better to redefine for efficiency *)methodvirtualdel:'a->'o(* can do default with: view+iter *)methodvirtualmem:'a->bool(* can do default with: mem(tolist) *)methodvirtualnull:bool(* can do default with: lenght(tolist)= 0 *)methodadd2:'a->unit=funa->o#adda|>ignore;()methoddel2:'a->unit=funa->o#dela|>ignore;()methodclear:unit=o#iter(fune->o#del2e);methodfold:'b.('b->'a->'b)->'b->'b=funfa->leta=refaino#iter(fune->a:=f!ae);!amethodtolist:'alist=List.rev(o#fold(funacce->e::acc)[])methodfromlist:'alist->'o=funxs->xs|>List.fold_left(funoe->o#adde)o#emptymethodlength:int=(* oldsimple: o#tolist +> List.length *)(* opti: *)letcount=ref0ino#iter(fune->incrcount);!countmethodexists:('a->bool)->bool=funf->o#tolist|>List.existsfmethodfilter:('a->bool)->'o=funf->(* iter and call add from empty, or del *)o#tolist|>List.filterf|>o#fromlist(* forall, fold, map *)methodgetone:'a=matcho#viewwithCons(e,tl)->e|Empty->failwith"no head"methodothers:'o=matcho#viewwithCons(e,tl)->tl|Empty->failwith"no tail"end