1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556(**
* Copyright (c) 2015, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*)moduletypeS=MyMap_sig.SmoduleMake(Ord:Map.OrderedType):Swithtypekey=Ord.t=structincludeMap.Make(Ord)letgetxt=trySome(findxt)withNot_found->Noneletfind_unsafe=findletunion?combinexy=letcombine=matchcombinewith|None->(fun_fst_->Somefst)|Somef->finunioncombinexyletcomparexy=comparePervasives.comparexyletequalxy=comparexy=0letkeysm=fold(funk_acc->k::acc)m[]letvaluesm=fold(fun_vacc->v::acc)m[]letelementsm=fold(funkvacc->(k,v)::acc)m[]letmap_envfenvm=fold(funxy(env,acc)->letenv,y=fenvyinenv,addxyacc)m(env,empty)letchoosex=trySome(choosex)withNot_found->Noneletfrom_keyskeysf=List.fold_leftbeginfunacckey->addkey(fkey)accendemptykeysletadd?combinekeynew_valuemap=matchcombinewith|None->addkeynew_valuemap|Somecombine->beginmatchgetkeymapwith|None->addkeynew_valuemap|Someold_value->addkey(combineold_valuenew_value)mapendend