sig
  module MemoryFootprint :
    sig
      val self : Project.Computation.t
      val select :
        Kind.how ->
        Project.Computation.selection -> Project.Computation.selection
      val depend : Project.Computation.t -> unit
      val name : string
      val mark_as_computed : ?project:Project.project -> unit -> unit
      val is_computed : ?project:Project.project -> unit -> bool
      val do_not_save : unit -> unit
      module Datatype : Project.Datatype.S
      val howto_marshal : (Datatype.t -> 'a) -> ('-> Datatype.t) -> unit
      type data = int
      val set : data -> unit
      val get : unit -> data
      val clear : unit -> unit
    end
  module type Cacheable =
    sig
      type t
      val hash : Binary_cache.Cacheable.t -> int
      val sentinel : Binary_cache.Cacheable.t
      val equal :
        Binary_cache.Cacheable.t -> Binary_cache.Cacheable.t -> bool
    end
  module type Result = sig type t val sentinel : Binary_cache.Result.t end
  module Bool_Result : sig type t = bool val sentinel : t end
  module Make_Symetric :
    functor (H : Cacheable->
      functor (R : Result->
        sig
          val clear : unit -> unit
          val merge : (H.t -> H.t -> R.t) -> H.t -> H.t -> R.t
        end
  module Make_Asymetric :
    functor (H : Cacheable->
      functor (R : Result->
        sig
          val clear : unit -> unit
          val merge : (unit -> R.t) -> H.t -> H.t -> R.t
        end
  module Make_Het :
    functor (H1 : Cacheable->
      functor (H2 : Cacheable->
        functor (R : Result->
          sig
            val clear : unit -> unit
            val merge : (unit -> R.t) -> H1.t -> H2.t -> R.t
          end
end