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