functor (Strat : Strategy->
  functor (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