123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133(*
* zed_input.ml
* ------------
* Copyright : (c) 2011, Jeremie Dimino <jeremie@dimino.org>
* Licence : BSD3
*
* This file is a part of Zed, an editor engine.
*)moduletypeS=sigtypeeventtype+'atvalempty:'atvaladd:eventlist->'a->'at->'atvalremove:eventlist->'at->'atvalfold:(eventlist->'a->'b->'b)->'at->'b->'bvalbindings:'at->(eventlist*'a)listtype'aresolvertype'apackvalpack:('a->'b)->'at->'bpackvalresolver:'apacklist->'aresolvertype'aresult=|Acceptedof'a|Continueof'aresolver|Rejectedvalresolve:event->'aresolver->'aresultendmoduleMake(Event:Map.OrderedType)=structtypeevent=Event.tmoduleEvent_map=Map.Make(Event)type'at='anodeEvent_map.tand'anode=|Setof'at|Valof'aletempty=Event_map.emptyletrecaddeventsvalueset=matcheventswith|[]->invalid_arg"Zed_input.Make.add"|[event]->Event_map.addevent(Valvalue)set|event::events->matchtrySome(Event_map.findeventset)withNot_found->Nonewith|None|Some(Val_)->Event_map.addevent(Set(addeventsvalueempty))set|Some(Sets)->Event_map.addevent(Set(addeventsvalues))setletrecremoveeventsset=matcheventswith|[]->invalid_arg"Zed_input.Make.remove"|[event]->Event_map.removeeventset|event::events->matchtrySome(Event_map.findeventset)withNot_found->Nonewith|None|Some(Val_)->set|Some(Sets)->lets=removeeventssinifEvent_map.is_emptysthenEvent_map.removeeventsetelseEvent_map.addevent(Sets)setletfoldfsetacc=letrecloopprefixsetacc=Event_map.fold(funeventnodeacc->matchnodewith|Valv->f(List.rev(event::prefix))vacc|Sets->loop(event::prefix)sacc)setaccinloop[]setaccletbindingsset=List.rev(fold(funeventsactionl->(events,action)::l)set[])moduletypePack=sigtypeatypebvalset:atvalmap:a->bendtype'apack=(modulePackwithtypeb='a)type'aresolver='apacklistletpack(typeu)(typev)mapset=letmodulePack=structtypea=utypeb=vletset=setletmap=mapendin(modulePack:Packwithtypeb=v)letresolverl=ltype'aresult=|Acceptedof'a|Continueof'aresolver|Rejectedletrecresolve_rec:'a.event->'apacklist->'apacklist->'aresult=fun(typeu)eventaccpacks->matchpackswith|[]->ifacc=[]thenRejectedelseContinue(List.revacc)|p::packs->letmodulePack=(valp:Packwithtypeb=u)inmatchtrySome(Event_map.findeventPack.set)withNot_found->Nonewith|Some(Setset)->resolve_recevent(packPack.mapset::acc)packs|Some(Valv)->Accepted(Pack.mapv)|None->resolve_receventaccpacksletresolveeventsets=resolve_recevent[]setsend