sig
  module P :
    sig
      type 'a t = {
        get : 'a option Join.chan Join.chan;
        kill : unit Join.chan;
      }
      val empty : unit -> 'JoinCom.P.t
      val map : ('-> 'b) -> 'JoinCom.P.t -> 'JoinCom.P.t
      val when_none : unit Join.chan -> 'JoinCom.P.t -> 'JoinCom.P.t
      val of_list : 'a list -> 'JoinCom.P.t
      val to_list : ('JoinCom.P.t * 'a list Join.chan) Join.chan
      val of_text : Pervasives.in_channel -> string JoinCom.P.t
      val to_text :
        (string JoinCom.P.t * Pervasives.out_channel * unit Join.chan)
        Join.chan
      val to_text_close :
        (string JoinCom.P.t * Pervasives.out_channel) Join.chan
    end
  module C :
    sig
      type 'a t = {
        put : ('a * bool Join.chan) Join.chan;
        close : unit -> unit;
      }
    end
  val connect : ('JoinCom.P.t * 'JoinCom.C.t * unit Join.chan) Join.chan
end