Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file CCMultiMap.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336(* This file is free software, part of containers. See file "license" for more details. *)(** {1 Multimap} *)type'asequence=('a->unit)->unitmoduletypeS=sigtypekeytypevaluetypetvalempty:t(** Empty multimap *)valis_empty:t->bool(** Empty multimap? *)valadd:t->key->value->t(** Add a key/value binding *)valremove:t->key->value->t(** Remove the binding *)valremove_all:t->key->t(** Remove the key from the map *)valmem:t->key->bool(** Is there a binding for this key? *)valfind:t->key->valuelist(** List of values for this key *)valfind_iter:t->key->(value->unit)->unit(** Iterate on bindings for this key *)valcount:t->key->int(** Number of bindings for this key *)valiter:t->(key->value->unit)->unit(** Iterate on all key/value *)valfold:t->'a->('a->key->value->'a)->'a(** Fold on all key/value *)valsize:t->int(** Number of keys *)valunion:t->t->t(** Union of multimaps *)valinter:t->t->t(** Intersection of multimaps *)valdiff:t->t->t(** Difference of maps, ie bindings of the first that are not
in the second *)valequal:t->t->bool(** Same multimap *)valcompare:t->t->int(** Total order on multimaps *)valsubmap:t->t->bool(** [submap m1 m2] is true iff all bindings of [m1] are also in [m2] *)valto_seq:t->(key*value)sequencevalof_seq:?init:t->(key*value)sequence->tvalkeys:t->keysequencevalvalues:t->valuesequence(** Some values may occur several times *)endmoduletypeOrderedType=sigtypetvalcompare:t->t->intendmoduleMake(K:OrderedType)(V:OrderedType)=structtypekey=K.ttypevalue=V.tmoduleM=Map.Make(K)moduleS=Set.Make(V)typet=S.tM.t(** Map of sets *)letempty=M.emptyletis_empty=M.is_emptyletaddmkv=letset=tryM.findkmwithNot_found->S.emptyinM.addk(S.addvset)mletremovemkv=tryletset=M.findkminletset'=S.removevsetinifS.is_emptyset'thenM.removekmelseM.addkset'mwithNot_found->mletremove_allmk=M.removekmletmemmk=M.memkmletfindmk=tryletset=M.findkminS.elementssetwithNot_found->[]letfind_itermkf=tryletset=M.findkminS.iterfsetwithNot_found->()letcountmk=tryletset=M.findkminS.cardinalsetwithNot_found->0letitermf=M.iter(funkset->S.iter(funv->fkv)set)mletfoldmaccf=M.fold(funksetacc->S.fold(funvacc->facckv)setacc)maccletsizem=M.cardinalmletunionm1m2=M.merge(fun_kv1v2->matchv1,v2with|None,None->None|Someset1,Someset2->Some(S.unionset1set2)|Someset,None|None,Someset->Someset)m1m2letinterm1m2=M.merge(fun_kv1v2->matchv1,v2with|None,_|_,None->None|Someset1,Someset2->letset=S.interset1set2inifS.is_emptysetthenNoneelseSomeset)m1m2letdiffm1m2=M.merge(fun_kv1v2->matchv1,v2with|None,_->None|Someset,None->Someset|Someset1,Someset2->letset'=S.diffset1set2inifS.is_emptyset'thenNoneelseSomeset')m1m2letequalm1m2=M.equalS.equalm1m2letcomparem1m2=M.compareS.comparem1m2letsubmapm1m2=M.for_all(funkset1->tryletset2=M.findkm2inS.subsetset1set2withNot_found->false)m1letto_seqmk=iterm(funxy->k(x,y))letof_seq?(init=empty)seq=letm=refinitinseq(fun(k,v)->m:=add!mkv);!mletkeysmk=M.iter(funx_->kx)mletvaluesmk=iterm(fun_v->kv)endmoduletypeBIDIR=sigtypettypelefttyperightvalempty:tvalis_empty:t->boolvaladd:t->left->right->t(** Add a binding (left,right) *)valremove:t->left->right->t(** Remove a specific binding *)valcardinal_left:t->int(** number of distinct left keys *)valcardinal_right:t->int(** number of distinct right keys *)valremove_left:t->left->t(** Remove all bindings for the left key *)valremove_right:t->right->t(** Remove all bindings for the right key *)valmem_left:t->left->bool(** Is the left key present in at least one pair? *)valmem_right:t->right->bool(** Is the right key present in at least one pair? *)valfind_left:t->left->rightsequence(** Find all bindings for this given left-key *)valfind_right:t->right->leftsequence(** Find all bindings for this given right-key *)valfind1_left:t->left->rightoption(** like {!find_left} but returns at most one value *)valfind1_right:t->right->leftoption(** like {!find_right} but returns at most one value *)valfold:('a->left->right->'a)->'a->t->'a(** Fold on pairs *)valpairs:t->(left*right)sequence(** Iterate on pairs *)valadd_pairs:t->(left*right)sequence->t(** Add pairs *)valseq_left:t->leftsequencevalseq_right:t->rightsequenceendlet_fold_seqfaccseq=letacc=refaccinseq(funx->acc:=f!accx);!acclet_head_seqseq=letr=refNoneinbegintryseq(funx->r:=Somex;raiseExit)withExit->();end;!rmoduleMakeBidir(L:OrderedType)(R:OrderedType)=structtypeleft=L.ttyperight=R.tmoduleMapL=Make(L)(R)moduleMapR=Make(R)(L)typet={left:MapL.t;right:MapR.t;}letempty={left=MapL.empty;right=MapR.empty;}letis_emptym=MapL.is_emptym.leftletaddmab={left=MapL.addm.leftab;right=MapR.addm.rightba;}letremovemab={left=MapL.removem.leftab;right=MapR.removem.rightba;}letcardinal_leftm=MapL.sizem.leftletcardinal_rightm=MapR.sizem.rightletfind_leftma=MapL.find_iterm.leftaletfind_rightmb=MapR.find_iterm.rightbletremove_leftma=_fold_seq(funmb->removemab)m(find_leftma)letremove_rightmb=_fold_seq(funma->removemab)m(find_rightmb)letmem_leftma=MapL.memm.leftaletmem_rightmb=MapR.memm.rightbletfind1_leftma=_head_seq(find_leftma)letfind1_rightmb=_head_seq(find_rightmb)letfoldfaccm=MapL.foldm.leftaccfletpairsm=MapL.to_seqm.leftletadd_pairsmseq=_fold_seq(funm(a,b)->addmab)mseqletseq_leftm=MapL.keysm.leftletseq_rightm=MapR.keysm.rightend