sig
  type ('k, 'v) t
  type 'a with_init_args
  type ('a, 'b) memo = ('a, ('b, exn) Core.Std.Result.t) Cache.S.t
  val find : ('k, 'v) Cache.S.t -> 'k -> 'v option
  val add : ('k, 'v) Cache.S.t -> key:'k -> data:'v -> unit
  val remove : ('k, 'a) Cache.S.t -> 'k -> unit
  val clear : ('a, 'b) Cache.S.t -> unit
  val create :
    destruct:('v -> unit) option -> ('k, 'v) Cache.S.t Cache.S.with_init_args
  val call_with_cache : cache:('a, 'b) Cache.S.memo -> ('a -> 'b) -> 'a -> 'b
  val memoize :
    ?destruct:('b -> unit) ->
    ('a -> 'b) -> (('a, 'b) Cache.S.memo * ('a -> 'b)) Cache.S.with_init_args
end