sig
  type 'a sequence = ('-> unit) -> unit
  type 'a printer = Format.formatter -> '-> unit
  type 'a equal = '-> '-> bool
  module type HashedType =
    sig
      type t
      val equal :
        CCPersistentHashtbl.HashedType.t ->
        CCPersistentHashtbl.HashedType.t -> bool
      val hash : CCPersistentHashtbl.HashedType.t -> int
    end
  module type S =
    sig
      type key
      type 'a t
      val empty : unit -> 'CCPersistentHashtbl.S.t
      val create : int -> 'CCPersistentHashtbl.S.t
      val is_empty : 'CCPersistentHashtbl.S.t -> bool
      val find :
        'CCPersistentHashtbl.S.t -> CCPersistentHashtbl.S.key -> 'a
      val get_exn :
        CCPersistentHashtbl.S.key -> 'CCPersistentHashtbl.S.t -> 'a
      val get :
        CCPersistentHashtbl.S.key -> 'CCPersistentHashtbl.S.t -> 'a option
      val mem :
        'CCPersistentHashtbl.S.t -> CCPersistentHashtbl.S.key -> bool
      val length : 'CCPersistentHashtbl.S.t -> int
      val add :
        'CCPersistentHashtbl.S.t ->
        CCPersistentHashtbl.S.key -> '-> 'CCPersistentHashtbl.S.t
      val replace :
        'CCPersistentHashtbl.S.t ->
        CCPersistentHashtbl.S.key -> '-> 'CCPersistentHashtbl.S.t
      val update :
        'CCPersistentHashtbl.S.t ->
        CCPersistentHashtbl.S.key ->
        ('a option -> 'a option) -> 'CCPersistentHashtbl.S.t
      val remove :
        'CCPersistentHashtbl.S.t ->
        CCPersistentHashtbl.S.key -> 'CCPersistentHashtbl.S.t
      val copy : 'CCPersistentHashtbl.S.t -> 'CCPersistentHashtbl.S.t
      val merge :
        f:(CCPersistentHashtbl.S.key ->
           [ `Both of 'a * '| `Left of '| `Right of 'b ] -> 'c option) ->
        'CCPersistentHashtbl.S.t ->
        'CCPersistentHashtbl.S.t -> 'CCPersistentHashtbl.S.t
      val iter :
        'CCPersistentHashtbl.S.t ->
        (CCPersistentHashtbl.S.key -> '-> unit) -> unit
      val fold :
        ('-> CCPersistentHashtbl.S.key -> '-> 'b) ->
        '-> 'CCPersistentHashtbl.S.t -> 'b
      val map :
        (CCPersistentHashtbl.S.key -> '-> 'b) ->
        'CCPersistentHashtbl.S.t -> 'CCPersistentHashtbl.S.t
      val filter :
        (CCPersistentHashtbl.S.key -> '-> bool) ->
        'CCPersistentHashtbl.S.t -> 'CCPersistentHashtbl.S.t
      val filter_map :
        (CCPersistentHashtbl.S.key -> '-> 'b option) ->
        'CCPersistentHashtbl.S.t -> 'CCPersistentHashtbl.S.t
      val for_all :
        (CCPersistentHashtbl.S.key -> '-> bool) ->
        'CCPersistentHashtbl.S.t -> bool
      val exists :
        (CCPersistentHashtbl.S.key -> '-> bool) ->
        'CCPersistentHashtbl.S.t -> bool
      val of_seq :
        (CCPersistentHashtbl.S.key * 'a) CCPersistentHashtbl.sequence ->
        'CCPersistentHashtbl.S.t
      val of_list :
        (CCPersistentHashtbl.S.key * 'a) list -> 'CCPersistentHashtbl.S.t
      val add_seq :
        'CCPersistentHashtbl.S.t ->
        (CCPersistentHashtbl.S.key * 'a) CCPersistentHashtbl.sequence ->
        'CCPersistentHashtbl.S.t
      val add_list :
        'CCPersistentHashtbl.S.t ->
        (CCPersistentHashtbl.S.key * 'a) list -> 'CCPersistentHashtbl.S.t
      val to_seq :
        'CCPersistentHashtbl.S.t ->
        (CCPersistentHashtbl.S.key * 'a) CCPersistentHashtbl.sequence
      val to_list :
        'CCPersistentHashtbl.S.t -> (CCPersistentHashtbl.S.key * 'a) list
      val equal :
        'CCPersistentHashtbl.equal ->
        'CCPersistentHashtbl.S.t CCPersistentHashtbl.equal
      val pp :
        ?sep:string ->
        ?arrow:string ->
        CCPersistentHashtbl.S.key CCPersistentHashtbl.printer ->
        'CCPersistentHashtbl.printer ->
        'CCPersistentHashtbl.S.t CCPersistentHashtbl.printer
      val stats : 'CCPersistentHashtbl.S.t -> Hashtbl.statistics
    end
  module Make :
    functor (H : HashedType->
      sig
        type key = H.t
        type 'a t
        val empty : unit -> 'a t
        val create : int -> 'a t
        val is_empty : 'a t -> bool
        val find : 'a t -> key -> 'a
        val get_exn : key -> 'a t -> 'a
        val get : key -> 'a t -> 'a option
        val mem : 'a t -> key -> bool
        val length : 'a t -> int
        val add : 'a t -> key -> '-> 'a t
        val replace : 'a t -> key -> '-> 'a t
        val update : 'a t -> key -> ('a option -> 'a option) -> 'a t
        val remove : 'a t -> key -> 'a t
        val copy : 'a t -> 'a t
        val merge :
          f:(key ->
             [ `Both of 'a * '| `Left of '| `Right of 'b ] -> 'c option) ->
          'a t -> 'b t -> 'c t
        val iter : 'a t -> (key -> '-> unit) -> unit
        val fold : ('-> key -> '-> 'b) -> '-> 'a t -> 'b
        val map : (key -> '-> 'b) -> 'a t -> 'b t
        val filter : (key -> '-> bool) -> 'a t -> 'a t
        val filter_map : (key -> '-> 'b option) -> 'a t -> 'b t
        val for_all : (key -> '-> bool) -> 'a t -> bool
        val exists : (key -> '-> bool) -> 'a t -> bool
        val of_seq : (key * 'a) sequence -> 'a t
        val of_list : (key * 'a) list -> 'a t
        val add_seq : 'a t -> (key * 'a) sequence -> 'a t
        val add_list : 'a t -> (key * 'a) list -> 'a t
        val to_seq : 'a t -> (key * 'a) sequence
        val to_list : 'a t -> (key * 'a) list
        val equal : 'a equal -> 'a t equal
        val pp :
          ?sep:string ->
          ?arrow:string -> key printer -> 'a printer -> 'a t printer
        val stats : 'a t -> Hashtbl.statistics
      end
end