`type 'a return`
`type 'a t`
`type key`
`val create : ?size:int -> unit -> 'a t`
`val create_from : 'a t -> 'a t`
`val empty : 'a return`
`val clear : 'a t -> unit`
`val is_empty : 'a t -> bool`
`val add : key -> 'a -> 'a t -> 'a t`
`val remove : key -> 'a t -> 'a t`
`val mem : key -> 'a t -> bool`
`val find : key -> 'a t -> 'a`
`val find_and_raise : key -> 'a t -> string -> 'a`

`find_and_raise k t s` is equivalent to `find k t` but raises `Invalid_argument s` when `find k t` raises `Not_found`

`val iter : (key -> 'a -> unit) -> 'a t -> unit`
`val map : (key -> 'a -> key * 'a) -> 'a t -> 'a t`
`val fold : (key -> 'a -> 'b -> 'b) -> 'a t -> 'b -> 'b`
`val copy : 'a t -> 'a t`