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