sig
  type feedback =
      [ `Fiber_exn of exn * Stdlib.Printexc.raw_backtrace
      | `Fiber_fail of string
      | `Miss_tool of B00.Tool.t * string
      | `Op_cache_error of B00.Op.t * string
      | `Op_complete of B00.Op.t * [ `Did_not_write of B0_std.Fpath.t list ] ]
  val pp_feedback : B00.Memo.feedback B0_std.Fmt.t
  type t
  val create :
    ?clock:B0_std.Time.counter ->
    ?cpu_clock:B0_std.Time.cpu_counter ->
    feedback:(B00.Memo.feedback -> unit) ->
    cwd:B0_std.Fpath.t ->
    B00.Env.t -> B00.Guard.t -> B00.Op_cache.t -> B00.Exec.t -> B00.Memo.t
  val memo :
    ?hash_fun:(module B0_std.Hash.T->
    ?env:B0_std.Os.Env.t ->
    ?cwd:B0_std.Fpath.t ->
    ?cachedir:B0_std.Fpath.t ->
    ?max_spawn:int ->
    ?feedback:([ `Exec_submit of B0_std.Os.Cmd.pid option * B00.Op.t
               | `Fiber_exn of exn * Stdlib.Printexc.raw_backtrace
               | `Fiber_fail of string
               | `File_cache_need_copy of B0_std.Fpath.t
               | `Miss_tool of B00.Tool.t * string
               | `Op_cache_error of B00.Op.t * string
               | `Op_complete of
                   B00.Op.t * [ `Did_not_write of B0_std.Fpath.t list ] ] ->
               unit) ->
    unit -> (B00.Memo.t, string) Stdlib.result
  val clock : B00.Memo.t -> B0_std.Time.counter
  val cpu_clock : B00.Memo.t -> B0_std.Time.cpu_counter
  val env : B00.Memo.t -> B00.Env.t
  val op_cache : B00.Memo.t -> B00.Op_cache.t
  val guard : B00.Memo.t -> B00.Guard.t
  val exec : B00.Memo.t -> B00.Exec.t
  val hash_fun : B00.Memo.t -> (module B0_std.Hash.T)
  val stir : block:bool -> B00.Memo.t -> unit
  val finish : B00.Memo.t -> (unit, B0_std.Fpath.Set.t) Stdlib.result
  val ops : B00.Memo.t -> B00.Op.t list
  type 'a fiber = ('-> unit) -> unit
  val fail : ('b, Stdlib.Format.formatter, unit, 'a) Stdlib.format4 -> 'b
  val fail_error : ('a, string) Stdlib.result -> 'a
  val file_ready : B00.Memo.t -> B0_std.Fpath.t -> unit
  val wait_files : B00.Memo.t -> B0_std.Fpath.t list -> unit B00.Memo.fiber
  val read : B00.Memo.t -> B0_std.Fpath.t -> string B00.Memo.fiber
  val write :
    B00.Memo.t ->
    ?salt:string ->
    ?reads:B0_std.Fpath.t list ->
    ?mode:int ->
    B0_std.Fpath.t -> (unit -> (string, string) Stdlib.result) -> unit
  val mkdir : B00.Memo.t -> B0_std.Fpath.t -> unit B00.Memo.fiber
  type tool
  type cmd
  val tool : B00.Memo.t -> B00.Tool.t -> B0_std.Cmd.t -> B00.Memo.cmd
  val spawn :
    B00.Memo.t ->
    ?reads:B0_std.Fpath.t list ->
    ?writes:B0_std.Fpath.t list ->
    ?env:B0_std.Os.Env.t ->
    ?cwd:B0_std.Fpath.t ->
    ?stdin:B0_std.Fpath.t ->
    ?stdout:B00.Op.Spawn.stdo ->
    ?stderr:B00.Op.Spawn.stdo ->
    ?success_exits:B00.Op.Spawn.success_exits ->
    ?k:(int -> unit) -> B00.Memo.cmd -> unit
  module Fut :
    sig
      type 'a set
      val set : 'B00.Memo.Fut.set -> '-> unit
      type memo = B00.Memo.t
      type 'a t
      val create :
        B00.Memo.Fut.memo -> 'B00.Memo.Fut.t * 'B00.Memo.Fut.set
      val value : 'B00.Memo.Fut.t -> 'a option
      val wait : 'B00.Memo.Fut.t -> 'B00.Memo.fiber
    end
end