# Module type Ephemeron.S

    module type S = sig .. end

The output signature of the functors `Ephemeron.K1.Make` and `Ephemeron.K2.Make`. These hash tables are weak in the keys. If all the keys of a binding are alive the binding is kept, but if one of the keys of the binding is dead then the binding is removed.

Propose the same interface as usual hash table. However since the bindings are weak, even if `mem h k` is true, a subsequent `find h k` may raise `Not_found` because the garbage collector can run between the two.

Moreover, the table shouldn't be modified during a call to `iter`. Use `filter_map_inplace` in this case.

    type key

    type 'a t

    val create : int -> 'a t

    val clear : 'a t -> unit

    val reset : 'a t -> unit

    val copy : 'a t -> 'a t

    val add : 'a t -> key -> 'a -> unit

    val remove : 'a t -> key -> unit

    val find : 'a t -> key -> 'a

    val find_opt : 'a t -> key -> 'a option

    val find_all : 'a t -> key -> 'a list

    val replace : 'a t -> key -> 'a -> unit

    val mem : 'a t -> key -> bool

    val iter : (key -> 'a -> unit) -> 'a t -> unit

    val filter_map_inplace : (key -> 'a -> 'a option) -> 'a t -> unit

    val fold : (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b

    val length : 'a t -> int

    val stats : 'a t -> Hashtbl.statistics

    val to_seq : 'a t -> (key * 'a) Seq.t

    val to_seq_keys : 'a t -> key Seq.t

    val to_seq_values : 'a t -> 'a Seq.t

    val add_seq : 'a t -> (key * 'a) Seq.t -> unit

    val replace_seq : 'a t -> (key * 'a) Seq.t -> unit

    val of_seq : (key * 'a) Seq.t -> 'a t

    val clean : 'a t -> unit

remove all dead bindings. Done automatically during automatic resizing.

    val stats_alive : 'a t -> Hashtbl.statistics

same as `Hashtbl.SeededS.stats` but only count the alive bindings