sig
  type property =
      Later of Property.t
    | Proxy of Property.t * Emitter.t * Property.t list
  module type Info =
    sig
      val name : string
      val dependencies : State.t list
      val size : int
      type key
      val property : Wprop.Info.key -> Wprop.property
    end
  module type Indexed =
    sig
      type key
      val mem : Wprop.Indexed.key -> bool
      val property : Wprop.Indexed.key -> Property.t
      val add_hook : (Wprop.Indexed.key -> Property.t -> unit) -> unit
    end
  module type Indexed2 =
    sig
      type key1
      type key2
      val mem : Wprop.Indexed2.key1 -> Wprop.Indexed2.key2 -> bool
      val property : Wprop.Indexed2.key1 -> Wprop.Indexed2.key2 -> Property.t
      val add_hook :
        (Wprop.Indexed2.key1 -> Wprop.Indexed2.key2 -> Property.t -> unit) ->
        unit
    end
  module Indexed :
    functor (Key : Datatype.S_with_collections)
      (Info : sig
                val name : string
                val dependencies : State.t list
                val size : int
                type key = Key.t
                val property : key -> property
              end)
      ->
      sig
        type key = Key.t
        val mem : key -> bool
        val property : key -> Property.t
        val add_hook : (key -> Property.t -> unit) -> unit
      end
  module Indexed2 :
    functor (Key1 : Datatype.S_with_collections)
      (Key2 : Datatype.S_with_collections)
      (Info : sig
                val name : string
                val dependencies : State.t list
                val size : int
                type key = Key1.t * Key2.t
                val property : key -> property
              end)
      ->
      sig
        type key1 = Key1.t
        type key2 = Key2.t
        val mem : key1 -> key2 -> bool
        val property : key1 -> key2 -> Property.t
        val add_hook : (key1 -> key2 -> Property.t -> unit) -> unit
      end
end