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 -> 'a JoinFifo.t
  val create_prod_cons : unit -> 'a JoinCom.P.t * 'a JoinCom.C.t
  module S :
    sig
      exception Closed
      type 'a t = {
        put : 'a -> unit;
        get : unit -> 'a;
        close : unit -> unit;
        kill : unit -> unit;
      }
    end
  val create_sync : unit -> 'a JoinFifo.S.t
end