sig
  type ('a, 'b, 'c) work_t
  type ('a, 'b, 'c) gate_t
  type ('a, 'b, 'c) wire_t
  type ('a, 'b, 'c, 'd) guard_t =
      (('a, 'b, 'c) Cf_gadget.gate_t, 'd) Cf_cmonad.t
  type ('a, 'b, 'c, 'd) t = (('a, 'b, 'c) Cf_gadget.work_t, 'd) Cf_cmonad.t
  val eval : ('a, 'b, 'c, unit) Cf_gadget.t -> '-> ('b, 'c) Cf_flow.t
  val start :
    ('a, 'b, 'c, unit) Cf_gadget.t -> '-> ('d, 'b, 'c, unit) Cf_gadget.t
  val guard :
    ('a, 'b, 'c, unit) Cf_gadget.guard_t -> ('a, 'b, 'c, unit) Cf_gadget.t
  val wire : ('a, 'b, 'c, ('d, 'b, 'c) Cf_gadget.wire_t) Cf_gadget.t
  val null : ('a, 'b, 'c) Cf_gadget.wire_t
  val read : ('a, 'b, 'c, 'b) Cf_gadget.t
  val write : '-> ('b, 'c, 'a, unit) Cf_gadget.t
  val load : ('a, 'b, 'c, 'a) Cf_gadget.t
  val store : '-> ('a, 'b, 'c, unit) Cf_gadget.t
  val modify : ('-> 'a) -> ('a, 'b, 'c, 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_t ->
    object
      method check : bool
      method get :
        ('-> ('d, 'b, 'c, unit) Cf_gadget.t) ->
        ('d, 'b, 'c, unit) Cf_gadget.guard_t
      method id : string
    end
  class ['a, 'b, 'c] tx :
    ('a, 'b, 'c) Cf_gadget.wire_t ->
    object
      method check : bool
      method id : string
      method put : '-> ('d, 'b, 'c, unit) Cf_gadget.t
    end
  type ('a, 'b, 'c) simplex_t =
      ('a, 'b, 'c) Cf_gadget.rx * ('a, 'b, 'c) Cf_gadget.tx
  val fsimplex :
    f:(('a, 'b, 'c) Cf_gadget.wire_t ->
       ('a, 'b, 'c) #Cf_gadget.rx * ('a, 'b, 'c) #Cf_gadget.tx) ->
    ('d, 'b, 'c, ('a, 'b, 'c) Cf_gadget.rx * ('a, 'b, 'c) Cf_gadget.tx)
    Cf_gadget.t
  val simplex :
    ('a, 'b, 'c, ('d, 'b, 'c) Cf_gadget.rx * ('d, 'b, 'c) Cf_gadget.tx)
    Cf_gadget.t
  type ('a, 'b, 'c, 'd) duplex_t =
      (('a, 'c, 'd) Cf_gadget.rx * ('b, 'c, 'd) Cf_gadget.tx) *
      (('b, 'c, 'd) Cf_gadget.rx * ('a, 'c, 'd) Cf_gadget.tx)
  val duplex : ('a, 'b, 'c, ('d, 'e, 'b, 'c) Cf_gadget.duplex_t) Cf_gadget.t
  val wrap :
    ('a, 'b, 'c) #Cf_gadget.rx ->
    ('d, 'b, 'c) #Cf_gadget.tx ->
    ('a, 'd) Cf_flow.t -> ('e, 'b, 'c, unit) Cf_gadget.t
end