123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149moduleInt=Belt_MapInt(** specalized when key type is [int], more efficient
than the generic type
*)moduleString=Belt_MapString(** specalized when key type is [string], more efficient
than the generic type *)moduleDict=Belt_MapDict(** seprate function from data, a more verboe but slightly
more efficient
*)type('key,'id)id=('key,'id)Belt_Id.comparabletype('key,'id)cmp=('key,'id)Belt_Id.cmptype('k,'v,'id)t={cmp:('k,'id)cmp;data:('k,'v,'id)Dict.t}moduleS=structinclude(structlett:cmp:('k,'id)cmp->data:('k,'v,'id)Dict.t->('k,'v,'id)t=fun~cmp~data->{cmp;data}letcmp:('k,'v,'id)t->('k,'id)cmp=funo->o.cmpletdata:('k,'v,'id)t->('k,'v,'id)Dict.t=funo->o.dataend:sigvalt:cmp:('k,'id)cmp->data:('k,'v,'id)Dict.t->('k,'v,'id)tvalcmp:('k,'v,'id)t->('k,'id)cmpvaldata:('k,'v,'id)t->('k,'v,'id)Dict.tend)endletfromArray(typekidx)data~(id:(k,idx)id)=letmoduleM=(valid)inletcmp=M.cmpinS.t~cmp~data:(Dict.fromArray~cmpdata)letremovemx=letcmp,odata=letopenSin(cmpm,datam)inletnewData=Dict.removeodatax~cmpinifnewData==odatathenmelseS.t~cmp~data:newDataletremoveManymx=letcmp,odata=(S.cmpm,S.datam)inletnewData=Dict.removeManyodatax~cmpinS.t~cmp~data:newDataletsetmkeyd=letcmp=S.cmpminS.t~cmp~data:(Dict.set~cmp(S.datam)keyd)letmergeManyme=letcmp=S.cmpminS.t~cmp~data:(Dict.mergeMany~cmp(S.datam)e)letupdateUmkeyf=letcmp=S.cmpminS.t~cmp~data:(Dict.updateU~cmp(S.datam)keyf)letupdatemkeyf=updateUmkey(funa->fa)letsplitmx=letcmp=S.cmpminlet(l,r),b=Dict.split~cmp(S.datam)xin((S.t~cmp~data:l,S.t~cmp~data:r),b)letmergeUs1s2f=letcmp=S.cmps1inS.t~cmp~data:(Dict.mergeU~cmp(S.datas1)(S.datas2)f)letmerges1s2f=mergeUs1s2(funabc->fabc)letmake(typekeyidx)~(id:(key,idx)id)=letmoduleM=(valid)inS.t~cmp:M.cmp~data:Dict.emptyletisEmptymap=Dict.isEmpty(S.datamap)letforEachUmf=Dict.forEachU(S.datam)fletforEachmf=forEachUm(funab->fab)letreduceUmaccf=Dict.reduceU(S.datam)accfletreducemaccf=reduceUmacc(funabc->fabc)leteveryUmf=Dict.everyU(S.datam)fleteverymf=everyUm(funab->fab)letsomeUmf=Dict.someU(S.datam)fletsomemf=someUm(funab->fab)letkeepUmf=S.t~cmp:(S.cmpm)~data:(Dict.keepU(S.datam)f)letkeepmf=keepUm(funab->fab)letpartitionUmp=letcmp=S.cmpminletl,r=Dict.partitionU(S.datam)pin(S.t~cmp~data:l,S.t~cmp~data:r)letpartitionmp=partitionUm(funab->pab)letmapUmf=S.t~cmp:(S.cmpm)~data:(Dict.mapU(S.datam)f)letmapmf=mapUm(funa->fa)letmapWithKeyUmf=S.t~cmp:(S.cmpm)~data:(Dict.mapWithKeyU(S.datam)f)letmapWithKeymf=mapWithKeyUm(funab->fab)letsizemap=Dict.size(S.datamap)lettoListmap=Dict.toList(S.datamap)lettoArraym=Dict.toArray(S.datam)letkeysToArraym=Dict.keysToArray(S.datam)letvaluesToArraym=Dict.valuesToArray(S.datam)letminKeym=Dict.minKey(S.datam)letminKeyUndefinedm=Dict.minKeyUndefined(S.datam)letmaxKeym=Dict.maxKey(S.datam)letmaxKeyUndefinedm=Dict.maxKeyUndefined(S.datam)letminimumm=Dict.minimum(S.datam)letminUndefinedm=Dict.minUndefined(S.datam)letmaximumm=Dict.maximum(S.datam)letmaxUndefinedm=Dict.maxUndefined(S.datam)letgetmapx=Dict.get~cmp:(S.cmpmap)(S.datamap)xletgetUndefinedmapx=Dict.getUndefined~cmp:(S.cmpmap)(S.datamap)xletgetWithDefaultmapxdef=Dict.getWithDefault~cmp:(S.cmpmap)(S.datamap)xdefletgetExnmapx=Dict.getExn~cmp:(S.cmpmap)(S.datamap)xlethasmapx=Dict.has~cmp:(S.cmpmap)(S.datamap)xletcheckInvariantInternalm=Dict.checkInvariantInternal(S.datam)leteqUm1m2veq=Dict.eqU~kcmp:(S.cmpm1)~veq(S.datam1)(S.datam2)leteqm1m2veq=eqUm1m2(funab->veqab)letcmpUm1m2vcmp=Dict.cmpU~kcmp:(S.cmpm1)~vcmp(S.datam1)(S.datam2)letcmpm1m2vcmp=cmpUm1m2(funab->vcmpab)letgetData=S.dataletgetId(typekeyidentity)(m:(key,_,identity)t):(key,identity)id=letmoduleT=structtypenonrecidentity=identitytypenonrect=keyletcmp=S.cmpmendin(moduleT)letpackIdData(typekeyidx)~(id:(key,idx)id)~data=letmoduleM=(valid)inS.t~cmp:M.cmp~dataletfindFirstByUmf=Dict.findFirstByUm.datafletfindFirstBymf=findFirstByUm(funab->fab)