sig
  module type S =
    sig
      type event
      type +'a t
      val empty : 'Zed_input.S.t
      val add :
        Zed_input.S.event list -> '-> 'Zed_input.S.t -> 'Zed_input.S.t
      val remove :
        Zed_input.S.event list -> 'Zed_input.S.t -> 'Zed_input.S.t
      val fold :
        (Zed_input.S.event list -> '-> '-> 'b) ->
        'Zed_input.S.t -> '-> 'b
      val bindings : 'Zed_input.S.t -> (Zed_input.S.event list * 'a) list
      type 'a resolver
      type 'a pack
      val pack : ('-> 'b) -> 'Zed_input.S.t -> 'Zed_input.S.pack
      val resolver : 'Zed_input.S.pack list -> 'Zed_input.S.resolver
      type 'a result =
          Accepted of 'a
        | Continue of 'Zed_input.S.resolver
        | Rejected
      val resolve :
        Zed_input.S.event -> 'Zed_input.S.resolver -> 'Zed_input.S.result
    end
  module Make :
    functor (Event : Map.OrderedType->
      sig
        type event = Event.t
        type +'a t
        val empty : 'a t
        val add : event list -> '-> 'a t -> 'a t
        val remove : event list -> 'a t -> 'a t
        val fold : (event list -> '-> '-> 'b) -> 'a t -> '-> 'b
        val bindings : 'a t -> (event list * 'a) list
        type 'a resolver
        type 'a pack
        val pack : ('-> 'b) -> 'a t -> 'b pack
        val resolver : 'a pack list -> 'a resolver
        type 'a result = Accepted of '| Continue of 'a resolver | Rejected
        val resolve : event -> 'a resolver -> 'a result
      end
end