sig
  type ('a, 'phantom) t = ('a, 'phantom) Pipe.t
  type ('a, 'phantom) pipe = ('a, 'phantom) t
  module Writer :
    sig
      type phantom = Pipe.Writer.phantom
      type 'a t = ('a, phantom) pipe
      val invariant : 'a t -> unit
      val sexp_of_t : ('-> Sexplib.Sexp.t) -> 'a t -> Sexplib.Sexp.t
    end
  module Reader :
    sig
      type phantom = Pipe.Reader.phantom
      type 'a t = ('a, phantom) pipe
      val invariant : 'a t -> unit
      val sexp_of_t : ('-> Sexplib.Sexp.t) -> 'a t -> Sexplib.Sexp.t
    end
  val create : unit -> 'Reader.t * 'Writer.t
  val init : ('Writer.t -> unit Deferred.t) -> 'Reader.t
  val of_list : 'a list -> 'Reader.t
  val close : 'Writer.t -> unit
  val close_read : 'Reader.t -> unit
  val is_closed : ('a, 'b) pipe -> bool
  val closed : ('a, 'b) pipe -> unit Deferred.t
  module Flushed_result :
    sig
      type t = [ `Ok | `Reader_closed ]
      val sexp_of_t : t -> Sexplib.Sexp.t
    end
  val upstream_flushed : ('a, 'b) pipe -> Flushed_result.t Deferred.t
  val downstream_flushed : ('a, 'b) pipe -> Flushed_result.t Deferred.t
  module Consumer :
    sig type t = Pipe.Consumer.t val values_sent_downstream : t -> unit end
  val add_consumer :
    'Reader.t ->
    downstream_flushed:(unit -> Flushed_result.t Deferred.t) -> Consumer.t
  val length : ('a, 'b) pipe -> int
  val is_empty : ('a, 'b) pipe -> bool
  val pushback : 'Writer.t -> unit Deferred.t
  val write' : 'Writer.t -> 'Core.Std.Queue.t -> unit Deferred.t
  val write : 'Writer.t -> '-> unit Deferred.t
  val write_without_pushback' : 'Writer.t -> 'Core.Std.Queue.t -> unit
  val write_without_pushback : 'Writer.t -> '-> unit
  val write_when_ready :
    'Writer.t ->
    f:(('-> unit) -> 'b) -> [ `Closed | `Ok of 'b ] Deferred.t
  val read' :
    ?consumer:Consumer.t ->
    'Reader.t -> [ `Eof | `Ok of 'Core.Std.Queue.t ] Deferred.t
  val read :
    ?consumer:Consumer.t -> 'Reader.t -> [ `Eof | `Ok of 'a ] Deferred.t
  val read_at_most :
    ?consumer:Consumer.t ->
    'Reader.t ->
    num_values:int -> [ `Eof | `Ok of 'Core.Std.Queue.t ] Deferred.t
  val read_exactly :
    ?consumer:Consumer.t ->
    'Reader.t ->
    num_values:int ->
    [ `Eof | `Exactly of 'Core.Std.Queue.t | `Fewer of 'Core.Std.Queue.t ]
    Deferred.t
  val read_now' :
    ?consumer:Consumer.t ->
    'Reader.t -> [ `Eof | `Nothing_available | `Ok of 'Core.Std.Queue.t ]
  val read_now :
    ?consumer:Consumer.t ->
    'Reader.t -> [ `Eof | `Nothing_available | `Ok of 'a ]
  val peek : 'Reader.t -> 'a option
  val clear : 'Reader.t -> unit
  val read_all : 'Reader.t -> 'Core.Std.Queue.t Deferred.t
  val values_available : 'Reader.t -> [ `Eof | `Ok ] Deferred.t
  type ('a, 'b, 'c, 'accum) fold =
      ?consumer:Consumer.t ->
      'Reader.t ->
      init:'accum -> f:('accum -> '-> 'c) -> 'accum Deferred.t
  val fold' : ('a, 'Core.Std.Queue.t, 'accum Deferred.t, 'accum) fold
  val fold : ('a, 'a, 'accum, 'accum) fold
  type ('a, 'b, 'c) iter =
      ?consumer:Consumer.t ->
      ?continue_on_error:bool ->
      'Reader.t -> f:('-> 'c) -> unit Deferred.t
  val iter' : ('a, 'Core.Std.Queue.t, unit Deferred.t) iter
  val iter : ('a, 'a, unit Deferred.t) iter
  val iter_without_pushback : ('a, 'a, unit) iter
  val transfer' :
    'Reader.t ->
    'Writer.t ->
    f:('Core.Std.Queue.t -> 'Core.Std.Queue.t Deferred.t) ->
    unit Deferred.t
  val transfer :
    'Reader.t -> 'Writer.t -> f:('-> 'b) -> unit Deferred.t
  val transfer_id : 'Reader.t -> 'Writer.t -> unit Deferred.t
  val map' :
    'Reader.t ->
    f:('Core.Std.Queue.t -> 'Core.Std.Queue.t Deferred.t) -> 'Reader.t
  val map : 'Reader.t -> f:('-> 'b) -> 'Reader.t
  val filter_map' :
    'Reader.t -> f:('-> 'b option Deferred.t) -> 'Reader.t
  val filter_map : 'Reader.t -> f:('-> 'b option) -> 'Reader.t
  val filter : 'Reader.t -> f:('-> bool) -> 'Reader.t
  val interleave : 'Reader.t list -> 'Reader.t
  val concat : 'Reader.t list -> 'Reader.t
  val to_stream_deprecated : 'Reader.t -> 'Async_stream.t
  val of_stream_deprecated : 'Async_stream.t -> 'Reader.t
  val drain : 'Reader.t -> unit Deferred.t
  val drain_and_count : 'Reader.t -> int Deferred.t
  val to_list : 'Reader.t -> 'a list Deferred.t
  val hash : ('a, 'b) pipe -> int
  val equal : ('a, 'b) pipe -> ('a, 'b) pipe -> bool
  val size_budget : ('a, 'b) pipe -> int
  val set_size_budget : ('a, 'b) pipe -> int -> unit
  val show_debug_messages : bool ref
  val check_invariant : bool ref
  val sexp_of_t :
    ('-> Sexplib.Sexp.t) ->
    ('phantom -> Sexplib.Sexp.t) -> ('a, 'phantom) pipe -> Sexplib.Sexp.t
  val sexp_of_pipe :
    ('-> Sexplib.Sexp.t) ->
    ('phantom -> Sexplib.Sexp.t) -> ('a, 'phantom) pipe -> Sexplib.Sexp.t
end