1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950openCommonopenOcollectionclassvirtual['a]oset=object(o:'o)inherit['a]ocollection(* no need virtual, but better to redefine (efficiency) *)methodvirtualunion:'o->'omethodvirtualinter:'o->'omethodvirtualminus:'o->'o(* allow binary methods tricks, generate exception when not good type *)methodtosetb:'aSet_.t=raiseImpossiblemethodtosetpt:SetPt.t=raiseImpossiblemethodtoseti:Seti.seti=raiseImpossiblemethodvirtualtoset:'b.'b(* generic (not safe) tricks *)(* is_intersect, equal, subset *)methodis_subset_of:'o->bool=funo2->((o2#minuso)#cardinal>=0)&&((o#minuso2)#cardinal=|=0)methodis_equal:'o->bool=funo2->((o2#minuso)#cardinal=|=0)&&((o#minuso2)#cardinal=|=0)methodis_singleton:bool=(* can be short circuited *)o#length=|=1methodcardinal:int=(* just to keep naming conventions *)o#length(* dont work:
method big_union: 'b. ('a -> 'b oset) -> 'b oset = fun f -> todo()
*)endlet($??$)exs=xs#memelet($++$)xsys=xs#unionyslet($**$)xsys=xs#interyslet($--$)xsys=xs#minusyslet($<<=$)xsys=xs#is_subset_ofyslet($==$)xsys=xs#is_equalys(* todo: pas beau le seed. I dont put the type otherwise have to
* put explicit :>
*)let(mapo:('a->'b)->'boset->'aoset->'boset)=funfseedxs->xs#fold(funaccx->acc#add(fx))seed