sig
  type ('a, 'b) work
  type ('a, 'b) gate
  type ('a, 'b, 'c) wire
  type ('a, 'b, 'c) guard = (('a, 'b) Cf_gadget.gate, 'c) Cf_cmonad.t
  type ('a, 'b, 'c) t = (('a, 'b) Cf_gadget.work, 'c) Cf_cmonad.t
  val eval : ('a, 'b, unit) Cf_gadget.t -> ('a, 'b) Cf_flow.t
  val start : ('a, 'b, unit) Cf_gadget.t -> ('a, 'b, unit) Cf_gadget.t
  val guard : ('a, 'b, unit) Cf_gadget.guard -> ('a, 'b, 'c) Cf_gadget.t
  val abort : ('a, 'b, 'c) Cf_gadget.t
  val wire : ('a, 'b, ('c, 'a, 'b) Cf_gadget.wire) Cf_gadget.t
  val wirepair :
    ('a, 'b, ('c, 'a, 'b) Cf_gadget.wire * ('d, 'a, 'b) Cf_gadget.wire)
    Cf_gadget.t
  val null : ('a, 'b, ('c, 'a, 'b) Cf_gadget.wire) Cf_gadget.t
  val read : ('a, 'b, 'a) Cf_gadget.t
  val write : '-> ('b, 'a, unit) Cf_gadget.t
  class type connector = object method check : bool method id : string end
  class ['a, 'b, 'c] rx :
    ('a, 'b, 'c) Cf_gadget.wire ->
    object
      method check : bool
      method get :
        ('-> ('b, 'c, unit) Cf_gadget.t) -> ('b, 'c, unit) Cf_gadget.guard
      method id : string
    end
  class ['a, 'b, 'c] tx :
    ('a, 'b, 'c) Cf_gadget.wire ->
    object
      method check : bool
      method id : string
      method put : '-> ('b, 'c, unit) Cf_gadget.t
    end
  val connect :
    ('a, 'b, ('c, 'a, 'b) Cf_gadget.wire) Cf_gadget.t ->
    ('a, 'b, ('c, 'a, 'b) Cf_gadget.rx * ('c, 'a, 'b) Cf_gadget.tx)
    Cf_gadget.t
  val simplex :
    ('a, 'b, ('c, 'a, 'b) Cf_gadget.rx * ('c, 'a, 'b) Cf_gadget.tx)
    Cf_gadget.t
  type ('a, 'b, 'c, 'd) pad =
      ('a, 'c, 'd) Cf_gadget.rx * ('b, 'c, 'd) Cf_gadget.tx
  type ('a, 'b, 'c, 'd) fix =
      ('b, 'c, 'd) Cf_gadget.rx * ('a, 'c, 'd) Cf_gadget.tx
  val connectpair :
    ('a, 'b, ('c, 'a, 'b) Cf_gadget.wire * ('d, 'a, 'b) Cf_gadget.wire)
    Cf_gadget.t ->
    ('a, 'b, ('c, 'd, 'a, 'b) Cf_gadget.fix * ('c, 'd, 'a, 'b) Cf_gadget.pad)
    Cf_gadget.t
  val duplex :
    ('a, 'b, ('c, 'd, 'a, 'b) Cf_gadget.fix * ('c, 'd, 'a, 'b) Cf_gadget.pad)
    Cf_gadget.t
  val wrap :
    ('a, 'b, 'c) #Cf_gadget.rx ->
    ('d, 'b, 'c) #Cf_gadget.tx ->
    ('a, 'd) Cf_flow.t -> ('b, 'c, unit) Cf_gadget.t
  class virtual ['a, 'b] next :
    object
      method private virtual guard : ('a, 'b, unit) Cf_gadget.guard
      method next : ('a, 'b, 'c) Cf_gadget.t
    end
  class virtual ['a, 'b] start :
    object
      method private virtual guard : ('a, 'b, unit) Cf_gadget.guard
      method start : ('a, 'b, unit) Cf_gadget.t
    end
  val create :
    (('a, 'b, 'c, 'd) Cf_gadget.pad -> ('c, 'd) #Cf_gadget.start) ->
    ('c, 'd, ('a, 'b, 'c, 'd) Cf_gadget.fix) Cf_gadget.t
  val createM :
    (('a, 'b, 'c, 'd) Cf_gadget.pad ->
     ('c, 'd, ('c, 'd) #Cf_gadget.start) Cf_gadget.t) ->
    ('c, 'd, ('a, 'b, 'c, 'd) Cf_gadget.fix) Cf_gadget.t
end