123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293moduletypeS=Map_intf.SmoduletypeKey=Map_intf.KeymoduleMake(Key:Key):Swithtypekey=Key.t=structincludeMoreLabels.Map.Make(structtypet=Key.tletcompareab=Ordering.to_int(Key.compareab)end)letfindkeyt=find_opttkeyletmemtk=memktletsettkv=add~key:k~data:vtletupdatetk~f=update~key:k~ftletadd_exntkeyv=updatetkey~f:(function|None->Somev|Some_->Code_error.raise"Map.add_exn: key already exists"["key",Key.to_dynkey]);;letadd(typee)(t:et)keyv=letmoduleM=structexceptionFoundofeendintryResult.Ok(updatetkey~f:(function|None->Somev|Somee->raise_notrace(M.Founde)))with|M.Founde->Errore;;letremovetk=removektletadd_multitkeyx=letl=Option.value(findtkey)~default:[]insettkey(x::l);;letmergeab~f=mergeab~fletunionab~f=unionab~fletunion_allmaps~f=matchmapswith|[]->empty|init::maps->List.fold_leftmaps~init~f:(funaccmap->unionaccmap~f);;letunion_exnab=unionab~f:(funkey__->Code_error.raise"Map.union_exn: a key appears in both maps"["key",Key.to_dynkey]);;letcompareab~compare:f=compareab~cmp:(funab->Ordering.to_int(fab))|>Ordering.of_int;;letequalab~equal:f=equalab~cmp:fletiterit~f=itert~f:(fun~key~data->fkeydata)letitert~f=iterit~f:(fun_x->fx)letiter2ab~f=ignore(mergeab~f:(funkeyab->fkeyab;None):_t);;letfoldit~init~f=foldt~init~f:(fun~key~dataacc->fkeydataacc)letfoldt~init~f=foldit~init~f:(fun_xacc->fxacc)letfor_allit~f=for_allt~fletfor_allt~f=for_allit~f:(fun_x->fx)letexistsit~f=existst~fletexistst~f=existsit~f:(fun_x->fx)letfilterit~f=filtert~fletfiltert~f=filterit~f:(fun_x->fx)letpartitionit~f=partitiont~fletpartitiont~f=partitionit~f:(fun_x->fx)letpartition_mapt~f=foldit~init:(empty,empty)~f:(funix(l,r)->matchfxwith|Either.Lefte->setlie,r|Righte->l,setrie);;letto_list=bindingsletto_list_mapt~f=foldit~init:[]~f:(funkvacc->fkv::acc)|>List.revletof_list=letrecloopacc=function|[]->Result.Okacc|(k,v)::l->(matchfindacckwith|None->loop(setacckv)l|Somev_old->Error(k,v_old,v))infunl->loopemptyl;;letof_list_map=letrecloopfacc=function|[]->Result.Okacc|x::l->letk,v=fxinifmemacckthenErrorkelseloopf(setacckv)linfunl~f->matchloopfemptylwith|Result.Ok_asx->x|Errork->(matchList.filterl~f:(funx->matchKey.compare(fst(fx))kwith|Eq->true|_->false)with|x::y::_->Error(k,x,y)|_->assertfalse);;letof_list_map_exnt~f=matchof_list_mapt~fwith|Result.Okx->x|Error(key,_,_)->Code_error.raise"Map.of_list_map_exn"["key",Key.to_dynkey];;letof_list_exnl=matchof_listlwith|Result.Okx->x|Error(key,_,_)->Code_error.raise"Map.of_list_exn"["key",Key.to_dynkey];;letof_list_reducel~f=List.fold_leftl~init:empty~f:(funacc(key,data)->matchfindacckeywith|None->setacckeydata|Somex->setacckey(fxdata));;letof_list_foldl~init~f=List.fold_leftl~init:empty~f:(funacc(key,data)->letx=Option.value(findacckey)~default:initinsetacckey(fxdata));;letof_list_reduceil~f=List.fold_leftl~init:empty~f:(funacc(key,data)->matchfindacckeywith|None->setacckeydata|Somex->setacckey(fkeyxdata));;letof_list_multil=List.fold_left(List.revl)~init:empty~f:(funacc(key,data)->add_multiacckeydata);;letof_list_unit=letrecloopacc=function|[]->acc|k::l->loop(setacck())linfunl->loopemptyl;;letkeyst=foldit~init:[]~f:(funk_l->k::l)|>List.revletvaluest=foldit~init:[]~f:(fun_vl->v::l)|>List.revletfind_exntkey=matchfind_optkeytwith|Somev->v|None->Code_error.raise"Map.find_exn: failed to find key"["key",Key.to_dynkey;"keys",Dyn.listKey.to_dyn(keyst)];;letmin_binding=min_binding_optletmax_binding=max_binding_optletchoose=choose_optletsplitkt=splittkletmapt~f=mapt~fletmapit~f=mapit~fletfold_mapit~init~f=letacc=refinitinletresult=mapit~f:(funix->letnew_acc,y=fi!accxinacc:=new_acc;y)in!acc,result;;letfilter_mapit~f=mergetempty~f:(funkeydata_always_none->matchdatawith|None->assertfalse|Somedata->fkeydata);;letfilter_mapt~f=filter_mapit~f:(fun_x->fx)letfilter_optt=filter_mapt~f:Fun.idletsuperpose=letf_x_=Somexinfunab->unionab~f;;letis_subsett~of_~f=letnot_subset()=raise_notraceExitinmatchmergetof_~f:(fun_dirtof_->matchtwith|None->None|Somet->(matchof_with|None->not_subset()|Someof_->ifft~of_thenNoneelsenot_subset()))with|(_:_t)->true|exceptionExit->false;;exceptionFoundofKey.tletfind_keyt~f=matchiterit~f:(funkey_->iffkeythenraise_notrace(Foundkey)else())with|()->None|exceptionFounde->Somee;;letto_dynft=Dyn.Map(to_listt|>List.map~f:(fun(k,v)->Key.to_dynk,fv))letto_seq=to_seqmoduleMulti=structtypenonrec'at='alisttletrev_unionm1m2=unionm1m2~f:(fun_l1l2->Some(List.rev_appendl1l2))letconstkx=updatetk~f:(function|None->Some[x]|Somexs->Some(x::xs));;letfindtk=Option.value(findtk)~default:[]letadd_alltk=function|[]->t|entries->updatetk~f:(funv->Some(matchvwith|None->entries|Somex->List.appendxentries));;letfind_elt:typea.at->f:(a->bool)->(key*a)option=funm~f->letexceptionFoundof(key*a)intryletcheck_foundke=iffethenraise_notrace(Found(k,e))initeri~f:(funk->List.iter~f:(check_foundk))m;Nonewith|Foundp->Somep;;letto_flat_listt=foldt~init:[]~f:List.rev_appendletmapt~f=mapt~f:(funl->List.map~fl)letparent_equal=equalletequaltt'~equal=parent_equal~equal:(funll'->Result.value~default:false@@List.for_all2~f:equalll')tt';;letto_dyna_to_dynt=to_dyn(Dyn.lista_to_dyn)tendend