functor
  (Config : sig
              type message
              type request
              module Make :
                functor
                  (ToChannel : sig
                                 type to_chan
                                 type send_req = request
                                 val send_request :
                                   to_chan -> send_req -> unit
                               end->
                  sig
                    val start : ToChannel.to_chan -> unit
                    val retrieve_message :
                      ToChannel.to_chan -> request -> message
                  end
            end->
  functor (Types : sig type d_t type c_t end->
    sig
      type group_dsc =
          Channel_factory.MakeTransportChanTypes(DescriptorTypes).group_dsc
      type seq_dsc =
          Channel_factory.MakeTransportChanTypes(DescriptorTypes).seq_dsc
      type viewmgr_dsc =
          Channel_factory.MakeTransportChanTypes(DescriptorTypes).viewmgr_dsc
      type transport_dsc =
          Channel_factory.MakeTransportChanTypes(DescriptorTypes).transport_dsc
      type msg = Config.message
      type req = Config.request
      type s_t = unit
      type d_t = Types.d_t
      type c_t = Types.c_t
      type dsc = s_t * d_t * c_t
      val init : '-> '-> unit lazy_t
      module type ToBoundedChannelSig =
        sig
          type to_chan = dsc
          type send_req = req
          val send_request : to_chan -> send_req -> unit
        end
      module Make :
        functor (ToChannel : ToBoundedChannelSig->
          sig
            type src = dsc
            type m = msg
            type req = ToChannel.send_req
            val start : ToChannel.to_chan -> unit
            val retrieve_message :
              ToChannel.to_chan -> Config.request -> Config.message
          end
    end