sig
type key = symbol * symbol
type 'a t
val empty : 'a t
val is_empty : 'a t -> bool
val cardinal : 'a t -> int
val add : 'a t -> key -> 'a -> 'a t
val find : 'a t -> key -> 'a
val remove : 'a t -> key -> 'a t
val mem : 'a t -> key -> bool
val find_key : 'a t -> key -> key option
val iter : (key -> 'a -> unit) -> 'a t -> unit
val map : ('a -> 'b) -> 'a t -> 'b t
val mapi : (key -> 'a -> 'b) -> 'a t -> 'b t
val fold : ('a -> key -> 'b -> 'a) -> 'a -> 'b t -> 'a
val fold_map : ('a -> key -> 'b -> 'a * 'c) -> 'a -> 'b t -> 'a * 'c t
val forall2 : ('a -> 'b -> bool) -> 'a t -> 'b t -> bool
val forall : (key -> 'a -> bool) -> 'a t -> bool
val exists : (key -> 'a -> bool) -> 'a t -> bool
val find_iter : (key -> 'a -> 'b option) -> 'a t -> 'b option
val isect_mem : 'a t -> (key -> bool) -> 'a t
val choose : 'a t -> key * 'a
val filter_add : 'a t -> key -> ('a option -> 'a) -> 'a t
val filter_remove : 'a t -> key -> ('a -> 'a option) -> 'a t
val replace : 'a t -> key -> ('a -> 'a) -> 'a t
val keys : 'a t -> key list
val data : 'a t -> 'a list
val add_list : 'a t -> (key * 'a) list -> 'a t
val equal : ('a -> 'a -> bool) -> 'a t -> 'a t -> bool
val union : (key -> 'a -> 'a -> 'a) -> 'a t -> 'a t -> 'a t
end