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