sig
  module type EQ =
    sig type t val equal : LogtkCache.EQ.t -> LogtkCache.EQ.t -> bool end
  module type HASH =
    sig type t val equal : t -> t -> bool val hash : t -> int end
  module type S =
    sig
      type 'a t
      type key
      val create : int -> 'LogtkCache.S.t
      val clear : 'LogtkCache.S.t -> unit
      val with_cache :
        'LogtkCache.S.t ->
        (LogtkCache.S.key -> 'a) -> LogtkCache.S.key -> 'a
      val with_cache_rec :
        'LogtkCache.S.t ->
        ((LogtkCache.S.key -> 'a) -> LogtkCache.S.key -> 'a) ->
        LogtkCache.S.key -> 'a
    end
  module type S2 =
    sig
      type 'a t
      type key1
      type key2
      val create : int -> 'LogtkCache.S2.t
      val clear : 'LogtkCache.S2.t -> unit
      val with_cache :
        'LogtkCache.S2.t ->
        (LogtkCache.S2.key1 -> LogtkCache.S2.key2 -> 'a) ->
        LogtkCache.S2.key1 -> LogtkCache.S2.key2 -> 'a
      type 'a func = LogtkCache.S2.key1 -> LogtkCache.S2.key2 -> 'a
      val with_cache_rec :
        'LogtkCache.S2.t ->
        ('LogtkCache.S2.func -> 'LogtkCache.S2.func) ->
        'LogtkCache.S2.func
    end
  module Dummy :
    functor (X : sig type t end->
      sig
        type 'a t
        type key = X.t
        val create : int -> 'a t
        val clear : 'a t -> unit
        val with_cache : 'a t -> (key -> 'a) -> key -> 'a
        val with_cache_rec : 'a t -> ((key -> 'a) -> key -> 'a) -> key -> 'a
      end
  module Dummy2 :
    functor (X : sig type t end) (Y : sig type t end->
      sig
        type 'a t
        type key1 = X.t
        type key2 = Y.t
        val create : int -> 'a t
        val clear : 'a t -> unit
        val with_cache : 'a t -> (key1 -> key2 -> 'a) -> key1 -> key2 -> 'a
        type 'a func = key1 -> key2 -> 'a
        val with_cache_rec : 'a t -> ('a func -> 'a func) -> 'a func
      end
  module Linear :
    functor (X : EQ->
      sig
        type 'a t
        type key = X.t
        val create : int -> 'a t
        val clear : 'a t -> unit
        val with_cache : 'a t -> (key -> 'a) -> key -> 'a
        val with_cache_rec : 'a t -> ((key -> 'a) -> key -> 'a) -> key -> 'a
      end
  module Linear2 :
    functor (X : EQ) (Y : EQ->
      sig
        type 'a t
        type key1 = X.t
        type key2 = Y.t
        val create : int -> 'a t
        val clear : 'a t -> unit
        val with_cache : 'a t -> (key1 -> key2 -> 'a) -> key1 -> key2 -> 'a
        type 'a func = key1 -> key2 -> 'a
        val with_cache_rec : 'a t -> ('a func -> 'a func) -> 'a func
      end
  module Replacing :
    functor (X : HASH->
      sig
        type 'a t
        type key = X.t
        val create : int -> 'a t
        val clear : 'a t -> unit
        val with_cache : 'a t -> (key -> 'a) -> key -> 'a
        val with_cache_rec : 'a t -> ((key -> 'a) -> key -> 'a) -> key -> 'a
      end
  module Replacing2 :
    functor (X : HASH) (Y : HASH->
      sig
        type 'a t
        type key1 = X.t
        type key2 = Y.t
        val create : int -> 'a t
        val clear : 'a t -> unit
        val with_cache : 'a t -> (key1 -> key2 -> 'a) -> key1 -> key2 -> 'a
        type 'a func = key1 -> key2 -> 'a
        val with_cache_rec : 'a t -> ('a func -> 'a func) -> 'a func
      end
  module LRU :
    functor (X : HASH->
      sig
        type 'a t
        type key = X.t
        val create : int -> 'a t
        val clear : 'a t -> unit
        val with_cache : 'a t -> (key -> 'a) -> key -> 'a
        val with_cache_rec : 'a t -> ((key -> 'a) -> key -> 'a) -> key -> 'a
      end
end