sig
  type 'a channel
  val new_channel : unit -> 'Event.channel
  type +'a event
  val send : 'Event.channel -> '-> unit Event.event
  val receive : 'Event.channel -> 'Event.event
  val always : '-> 'Event.event
  val choose : 'Event.event list -> 'Event.event
  val wrap : 'Event.event -> ('-> 'b) -> 'Event.event
  val wrap_abort : 'Event.event -> (unit -> unit) -> 'Event.event
  val guard : (unit -> 'Event.event) -> 'Event.event
  val sync : 'Event.event -> 'a
  val select : 'Event.event list -> 'a
  val poll : 'Event.event -> 'a option
  val with_nack : (unit Event.event -> 'Event.event) -> 'Event.event
  module Cell :
    sig
      type 'a t
      val make : unit -> 'Event.Cell.t
      val init_make : '-> 'Event.Cell.t
      val read : 'Event.Cell.t -> 'Event.event
      val take : 'Event.Cell.t -> 'Event.event
      val put : 'Event.Cell.t -> '-> unit Event.event
      val replace : 'Event.Cell.t -> ('-> 'a) -> unit Event.event
    end
end