sig
  module type ItemEq =
    sig
      type t
      val eq : Table.ItemEq.t -> Table.ItemEq.t -> bool
      val to_string : Table.ItemEq.t -> string
    end
  module type Table =
    sig
      module I : ItemEq
      type item
      and 'a table
      val create :
        ('-> '-> bool) * ('-> string) -> 'Table.Table.table
      val mem : 'Table.Table.table -> '-> bool
      val add : 'Table.Table.table -> '-> Table.Table.item -> unit
      val rm : 'Table.Table.table -> '-> unit
      val lookup : 'Table.Table.table -> '-> Table.Table.item
      val rev_lookup : 'Table.Table.table -> Table.Table.item -> 'a list
      val lookup_all : 'Table.Table.table -> '-> Table.Table.item list
      val iter :
        ('-> Table.Table.item -> unit) -> 'Table.Table.table -> unit
      val eq : 'Table.Table.table -> '-> '-> bool
      val to_string : 'Table.Table.table -> '-> string
    end
  module Make :
    functor (Item : ItemEq->
      sig
        module I : ItemEq
        type item = Item.t
        and 'a table
        val create :
          ('-> '-> bool) * ('-> string) -> 'Table.Table.table
        val mem : 'Table.Table.table -> '-> bool
        val add : 'Table.Table.table -> '-> Table.Table.item -> unit
        val rm : 'Table.Table.table -> '-> unit
        val lookup : 'Table.Table.table -> '-> Table.Table.item
        val rev_lookup : 'Table.Table.table -> Table.Table.item -> 'a list
        val lookup_all : 'Table.Table.table -> '-> Table.Table.item list
        val iter :
          ('-> Table.Table.item -> unit) -> 'Table.Table.table -> unit
        val eq : 'Table.Table.table -> '-> '-> bool
        val to_string : 'Table.Table.table -> '-> string
      end
end