sig
  module type Fold = Fold_map.Fold
  module type Fold_map =
    sig
      type in_value
      type out_value
      type 'a t
      val empty : 'Fold_table.Fold_map.t
      val singleton :
        '-> Fold_table.Fold_map.in_value -> 'Fold_table.Fold_map.t
      val is_empty : 'Fold_table.Fold_map.t -> bool
      val cardinal : 'Fold_table.Fold_map.t -> int
      val add :
        key:'->
        data:Fold_table.Fold_map.in_value ->
        'Fold_table.Fold_map.t -> 'Fold_table.Fold_map.t
      val find :
        'Fold_table.Fold_map.t -> '-> Fold_table.Fold_map.out_value
      val remove : 'Fold_table.Fold_map.t -> '-> 'Fold_table.Fold_map.t
      val set :
        key:'->
        data:Fold_table.Fold_map.out_value ->
        'Fold_table.Fold_map.t -> 'Fold_table.Fold_map.t
      val mem : 'Fold_table.Fold_map.t -> '-> bool
      val iter :
        f:(key:'-> data:Fold_table.Fold_map.out_value -> unit) ->
        'Fold_table.Fold_map.t -> unit
      val fold :
        f:(key:'-> data:Fold_table.Fold_map.out_value -> '-> 'b) ->
        'Fold_table.Fold_map.t -> init:'-> 'b
      val filter :
        f:(key:'-> data:Fold_table.Fold_map.out_value -> bool) ->
        'Fold_table.Fold_map.t -> 'Fold_table.Fold_map.t
      val keys : 'Fold_table.Fold_map.t -> 'a list
      val data :
        'Fold_table.Fold_map.t -> Fold_table.Fold_map.out_value list
      val to_alist :
        'Fold_table.Fold_map.t -> ('a * Fold_table.Fold_map.out_value) list
      val for_all :
        f:(Fold_table.Fold_map.out_value -> bool) ->
        'Fold_table.Fold_map.t -> bool
      val exists :
        f:(Fold_table.Fold_map.out_value -> bool) ->
        'Fold_table.Fold_map.t -> bool
    end
  module Make :
    functor (Fold : Fold->
      sig
        type in_value = Fold.data
        type out_value = Fold.t
        type 'a t
        val empty : 'a t
        val singleton : '-> in_value -> 'a t
        val is_empty : 'a t -> bool
        val cardinal : 'a t -> int
        val add : key:'-> data:in_value -> 'a t -> 'a t
        val find : 'a t -> '-> out_value
        val remove : 'a t -> '-> 'a t
        val set : key:'-> data:out_value -> 'a t -> 'a t
        val mem : 'a t -> '-> bool
        val iter : f:(key:'-> data:out_value -> unit) -> 'a t -> unit
        val fold :
          f:(key:'-> data:out_value -> '-> 'b) -> 'a t -> init:'-> 'b
        val filter : f:(key:'-> data:out_value -> bool) -> 'a t -> 'a t
        val keys : 'a t -> 'a list
        val data : 'a t -> out_value list
        val to_alist : 'a t -> ('a * out_value) list
        val for_all : f:(out_value -> bool) -> 'a t -> bool
        val exists : f:(out_value -> bool) -> 'a t -> bool
      end
end