sig
  type 'a t = {
    put : ('a * bool Join.chan) Join.chan;
    get : 'a option Join.chan Join.chan;
    close : unit -> unit;
    kill : unit Join.chan;
  }
  val create : unit -> 'JoinFifo.t
  val create_prod_cons : unit -> 'JoinCom.P.t * 'JoinCom.C.t
  module S :
    sig
      exception Closed
      type 'a t = {
        put : '-> unit;
        get : unit -> 'a;
        close : unit -> unit;
        kill : unit -> unit;
      }
    end
  val create_sync : unit -> 'JoinFifo.S.t
end