sig
  module rec Event :
    sig
      type 'a channel
      val new_channel : unit -> 'Ccell.Event.channel
      type 'a event
      val send : 'Ccell.Event.channel -> '-> unit Ccell.Event.event
      val receive : 'Ccell.Event.channel -> 'Ccell.Event.event
      val always : '-> 'Ccell.Event.event
      val choose : 'Ccell.Event.event list -> 'Ccell.Event.event
      val wrap : 'Ccell.Event.event -> ('-> 'b) -> 'Ccell.Event.event
      val guard : (unit -> 'Ccell.Event.event) -> 'Ccell.Event.event
      val join :
        'Ccell.Event.event Ccell.Event.event -> 'Ccell.Event.event
      val sync : 'Ccell.Event.event -> 'a
      val select : 'Ccell.Event.event list -> 'a
      val poll : 'Ccell.Event.event -> 'a option
      val never : 'Ccell.Event.event
      val return : '-> 'Ccell.Event.event
      val bind :
        'Ccell.Event.event ->
        ('-> 'Ccell.Event.event) -> 'Ccell.Event.event
      val ( >>= ) :
        'Ccell.Event.event ->
        ('-> 'Ccell.Event.event) -> 'Ccell.Event.event
      val ( >> ) :
        'Ccell.Event.event -> 'Ccell.Event.event -> 'Ccell.Event.event
      val fmap : ('-> 'b) -> 'Ccell.Event.event -> 'Ccell.Event.event
      val fmap2 :
        ('-> '-> 'c) ->
        'Ccell.Event.event -> 'Ccell.Event.event -> 'Ccell.Event.event
      val app :
        ('-> 'b) Ccell.Event.event ->
        'Ccell.Event.event -> 'Ccell.Event.event
      val mzero : 'Ccell.Event.event
      val mplus :
        'Ccell.Event.event -> 'Ccell.Event.event -> 'Ccell.Event.event
      val receive_reserve : 'Ccell.Event.channel -> 'Ccell.Ivar.t
      val filter :
        ('-> bool) -> 'Ccell.Event.event -> 'Ccell.Event.event
      val filter_map :
        ('-> 'b option) -> 'Ccell.Event.event -> 'Ccell.Event.event
      val sequence : 'Ccell.Event.event list -> 'a list Ccell.Event.event
      val future : ('-> 'b) -> '-> 'Ccell.Event.event
      module Cell :
        sig
          type 'a t
          val make : unit -> 'Ccell.Event.Cell.t
          val init_make : '-> 'Ccell.Event.Cell.t
          val read : 'Ccell.Event.Cell.t -> 'Ccell.Event.event
          val take : 'Ccell.Event.Cell.t -> 'Ccell.Event.event
          val put : 'Ccell.Event.Cell.t -> '-> unit Ccell.Event.event
        end
    end
  and Ivar :
    sig
      type 'a t
      val make : unit -> 'Ccell.Ivar.t
      val init_make : '-> 'Ccell.Ivar.t
      val read : 'Ccell.Ivar.t -> 'Ccell.Event.event
      val poll : 'Ccell.Ivar.t -> 'a option
      exception Full
      val put : 'Ccell.Ivar.t -> '-> unit
    end
  module Mvar :
    sig
      type 'a t
      val make : unit -> 'Ccell.Mvar.t
      val init_make : '-> 'Ccell.Mvar.t
      val read : 'Ccell.Mvar.t -> 'Ccell.Event.event
      val take : 'Ccell.Mvar.t -> 'Ccell.Event.event
      val put : 'Ccell.Mvar.t -> '-> unit Ccell.Event.event
      val replace : 'Ccell.Mvar.t -> ('-> 'a) -> unit Ccell.Event.event
    end
  module Mbox :
    sig
      type 'a t
      val make : unit -> 'Ccell.Mbox.t
      val push : 'Ccell.Mbox.t -> '-> unit Ccell.Event.event
      val pop : 'Ccell.Mbox.t -> 'Ccell.Event.event
      val pop_reserve : 'Ccell.Mbox.t -> 'Ccell.Ivar.t
      val is_empty : 'Ccell.Mbox.t -> bool
      val length : 'Ccell.Mbox.t -> int
      val pop_all : 'Ccell.Mbox.t -> 'a list Ccell.Event.event
    end
  module Bcast :
    sig
      type 'a t
      type 'a port = 'Ccell.Mbox.t
      val make : unit -> 'Ccell.Bcast.t
      val send : 'Ccell.Bcast.t -> '-> unit
      val receive : 'Ccell.Bcast.t -> 'Ccell.Event.event
      val make_port : 'Ccell.Bcast.t -> 'Ccell.Bcast.port
      val make_strong_port : 'Ccell.Bcast.t -> 'Ccell.Bcast.port
      val receive_port : 'Ccell.Bcast.port -> 'Ccell.Event.event
      val receive_port_all : 'Ccell.Bcast.port -> 'a list Ccell.Event.event
    end
  module MakeRPC :
    sig
      type ('a, 'b, 'c) t =
          < call : '-> 'Ccell.Event.event;
            entry : '-> 'Ccell.Event.event >
      val rpc : ('a * '-> 'a * 'c) -> ('a, 'b, 'c) Ccell.MakeRPC.t
      val server : '-> ('-> 'Ccell.Event.event) list -> unit
    end
  module Timeout :
    sig
      type t
      val make : float -> Ccell.Timeout.t
      val timeout : Ccell.Timeout.t -> float -> '-> 'Ccell.Event.event
      val with_timeout :
        Ccell.Timeout.t ->
        float -> 'Ccell.Event.event -> 'a option Ccell.Event.event
    end
  module Frp :
    sig
      module type Updater =
        sig
          val init : unit -> unit
          val notify_register : unit Ccell.Mbox.t -> unit
          val up_register : (unit -> bool) -> unit
        end
      module DefaultUpdater : Updater
      module EmptyUpdater : Updater
      module type ReactSig =
        sig
          type 'a t
          type 'a event
          val make : '-> 'Ccell.Frp.ReactSig.t * ('-> unit)
          val put :
            'Ccell.Frp.ReactSig.t -> 'Ccell.Frp.ReactSig.t -> unit
          val set : 'Ccell.Frp.ReactSig.t -> '-> unit
          val read : 'Ccell.Frp.ReactSig.t -> 'a
          val return : '-> 'Ccell.Frp.ReactSig.t
          val map :
            ('-> 'b) -> 'Ccell.Frp.ReactSig.t -> 'Ccell.Frp.ReactSig.t
          val map2 :
            ('-> '-> 'c) ->
            'Ccell.Frp.ReactSig.t ->
            'Ccell.Frp.ReactSig.t -> 'Ccell.Frp.ReactSig.t
          val map3 :
            ('-> '-> '-> 'd) ->
            'Ccell.Frp.ReactSig.t ->
            'Ccell.Frp.ReactSig.t ->
            'Ccell.Frp.ReactSig.t -> 'Ccell.Frp.ReactSig.t
          val app :
            ('-> 'b) Ccell.Frp.ReactSig.t ->
            'Ccell.Frp.ReactSig.t -> 'Ccell.Frp.ReactSig.t
          val sequence :
            'Ccell.Frp.ReactSig.t list -> 'a list Ccell.Frp.ReactSig.t
          val changes :
            ?eq:('-> '-> bool) ->
            'Ccell.Frp.ReactSig.t -> 'Ccell.Frp.ReactSig.t
          val history :
            int -> 'Ccell.Frp.ReactSig.t -> 'a list Ccell.Frp.ReactSig.t
          val delay :
            int -> 'Ccell.Frp.ReactSig.t -> 'Ccell.Frp.ReactSig.t
          val delay_while :
            ('-> bool) ->
            'Ccell.Frp.ReactSig.t -> 'Ccell.Frp.ReactSig.t
          val bind :
            'Ccell.Frp.ReactSig.t ->
            ('-> 'Ccell.Frp.ReactSig.t) -> 'Ccell.Frp.ReactSig.t
          val ( >>= ) :
            'Ccell.Frp.ReactSig.t ->
            ('-> 'Ccell.Frp.ReactSig.t) -> 'Ccell.Frp.ReactSig.t
          val join :
            'Ccell.Frp.ReactSig.t Ccell.Frp.ReactSig.t ->
            'Ccell.Frp.ReactSig.t
          val switch :
            'Ccell.Frp.ReactSig.t ->
            'Ccell.Frp.ReactSig.t Ccell.Frp.ReactSig.event ->
            'Ccell.Frp.ReactSig.t
          val reduce :
            '->
            ('-> 'a) Ccell.Frp.ReactSig.event -> 'Ccell.Frp.ReactSig.t
          val fold :
            ('-> '-> 'a) ->
            '-> 'Ccell.Frp.ReactSig.event -> 'Ccell.Frp.ReactSig.t
          val event : 'Ccell.Frp.ReactSig.t -> 'Ccell.Frp.ReactSig.event
        end
      module type FEventSig =
        sig
          type 'a t
          type listen_id
          type 'a react
          val make : unit -> 'Ccell.Frp.FEventSig.t * ('-> unit)
          val listen :
            ('-> unit) ->
            'Ccell.Frp.FEventSig.t -> Ccell.Frp.FEventSig.listen_id
          val weak_listen :
            ('-> unit) ->
            'Ccell.Frp.FEventSig.t -> Ccell.Frp.FEventSig.listen_id
          val clear_listen : 'Ccell.Frp.FEventSig.t -> unit
          val remove_listen :
            'Ccell.Frp.FEventSig.t -> Ccell.Frp.FEventSig.listen_id -> unit
          val return : '-> 'Ccell.Frp.FEventSig.t
          val bind :
            'Ccell.Frp.FEventSig.t ->
            ('-> 'Ccell.Frp.FEventSig.t) -> 'Ccell.Frp.FEventSig.t
          val ( >>= ) :
            'Ccell.Frp.FEventSig.t ->
            ('-> 'Ccell.Frp.FEventSig.t) -> 'Ccell.Frp.FEventSig.t
          val join :
            'Ccell.Frp.FEventSig.t Ccell.Frp.FEventSig.t ->
            'Ccell.Frp.FEventSig.t
          val switch :
            'Ccell.Frp.FEventSig.t ->
            'Ccell.Frp.FEventSig.t Ccell.Frp.FEventSig.t ->
            'Ccell.Frp.FEventSig.t
          val never : unit -> 'Ccell.Frp.FEventSig.t
          val map :
            ('-> 'b) ->
            'Ccell.Frp.FEventSig.t -> 'Ccell.Frp.FEventSig.t
          val map2 :
            ('-> '-> 'c) ->
            'Ccell.Frp.FEventSig.t ->
            'Ccell.Frp.FEventSig.t -> 'Ccell.Frp.FEventSig.t
          val app :
            ('-> 'b) Ccell.Frp.FEventSig.t ->
            'Ccell.Frp.FEventSig.t -> 'Ccell.Frp.FEventSig.t
          val merge :
            'Ccell.Frp.FEventSig.t ->
            'Ccell.Frp.FEventSig.t -> 'Ccell.Frp.FEventSig.t
          val filter :
            ('-> bool) ->
            'Ccell.Frp.FEventSig.t -> 'Ccell.Frp.FEventSig.t
          val filter_map :
            ('-> 'b option) ->
            'Ccell.Frp.FEventSig.t -> 'Ccell.Frp.FEventSig.t
          val changes :
            ?eq:('-> '-> bool) ->
            '-> 'Ccell.Frp.FEventSig.t -> 'Ccell.Frp.FEventSig.t
          val history :
            int -> 'Ccell.Frp.FEventSig.t -> 'a list Ccell.Frp.FEventSig.t
          val reduce :
            '->
            ('-> 'a) Ccell.Frp.FEventSig.t -> 'Ccell.Frp.FEventSig.t
          val fold :
            ('-> '-> 'a) ->
            '-> 'Ccell.Frp.FEventSig.t -> 'Ccell.Frp.FEventSig.t
          val select :
            'Ccell.Frp.FEventSig.t list -> 'Ccell.Frp.FEventSig.t
          val take :
            int -> 'Ccell.Frp.FEventSig.t -> 'Ccell.Frp.FEventSig.t
          val take_while :
            ('-> bool) ->
            'Ccell.Frp.FEventSig.t -> 'Ccell.Frp.FEventSig.t
          val drop :
            int -> 'Ccell.Frp.FEventSig.t -> 'Ccell.Frp.FEventSig.t
          val drop_while :
            ('-> bool) ->
            'Ccell.Frp.FEventSig.t -> 'Ccell.Frp.FEventSig.t
          val zip :
            'Ccell.Frp.FEventSig.t ->
            'Ccell.Frp.FEventSig.t -> ('a * 'b) Ccell.Frp.FEventSig.t
          val sequence :
            'Ccell.Frp.FEventSig.t list -> 'a list Ccell.Frp.FEventSig.t
          val future : ('-> 'b) -> '-> 'Ccell.Frp.FEventSig.t
          val react :
            '-> 'Ccell.Frp.FEventSig.t -> 'Ccell.Frp.FEventSig.react
        end
      module Make :
        functor (U : Updater->
          sig
            module rec TimeVaryReact :
              sig
                type 'a t
                val make : '-> 'a t * ('-> unit)
                val put : 'a t -> 'a t -> unit
                val set : 'a t -> '-> unit
                val read : 'a t -> 'a
                val return : '-> 'a t
                val map : ('-> 'b) -> 'a t -> 'b t
                val map2 : ('-> '-> 'c) -> 'a t -> 'b t -> 'c t
                val map3 :
                  ('-> '-> '-> 'd) -> 'a t -> 'b t -> 'c t -> 'd t
                val app : ('-> 'b) t -> 'a t -> 'b t
                val sequence : 'a t list -> 'a list t
                val changes : ?eq:('-> '-> bool) -> 'a t -> 'a t
                val history : int -> 'a t -> 'a list t
                val delay : int -> 'a t -> 'a t
                val delay_while : ('-> bool) -> 'a t -> 'a t
                val bind : 'a t -> ('-> 'b t) -> 'b t
                val ( >>= ) : 'a t -> ('-> 'b t) -> 'b t
                val join : 'a t t -> 'a t
                val switch : 'a t -> 'a t TimeVaryEvent.t -> 'a t
                val reduce : '-> ('-> 'a) TimeVaryEvent.t -> 'a t
                val fold :
                  ('-> '-> 'a) -> '-> 'TimeVaryEvent.t -> 'a t
                val event : 'a t -> 'TimeVaryEvent.t
              end
            and TimeVaryEvent :
              sig
                type 'a t
                type listen_id
                val make : unit -> 'a t * ('-> unit)
                val listen : ('-> unit) -> 'a t -> listen_id
                val weak_listen : ('-> unit) -> 'a t -> listen_id
                val clear_listen : 'a t -> unit
                val remove_listen : 'a t -> listen_id -> unit
                val return : '-> 'a t
                val bind : 'a t -> ('-> 'b t) -> 'b t
                val ( >>= ) : 'a t -> ('-> 'b t) -> 'b t
                val join : 'a t t -> 'a t
                val switch : 'a t -> 'a t t -> 'a t
                val never : unit -> 'a t
                val map : ('-> 'b) -> 'a t -> 'b t
                val map2 : ('-> '-> 'c) -> 'a t -> 'b t -> 'c t
                val app : ('-> 'b) t -> 'a t -> 'b t
                val merge : 'a t -> 'a t -> 'a t
                val filter : ('-> bool) -> 'a t -> 'a t
                val filter_map : ('-> 'b option) -> 'a t -> 'b t
                val changes : ?eq:('-> '-> bool) -> '-> 'a t -> 'a t
                val history : int -> 'a t -> 'a list t
                val reduce : '-> ('-> 'a) t -> 'a t
                val fold : ('-> '-> 'a) -> '-> 'b t -> 'a t
                val select : 'a t list -> 'a t
                val take : int -> 'a t -> 'a t
                val take_while : ('-> bool) -> 'a t -> 'a t
                val drop : int -> 'a t -> 'a t
                val drop_while : ('-> bool) -> 'a t -> 'a t
                val zip : 'a t -> 'b t -> ('a * 'b) t
                val sequence : 'a t list -> 'a list t
                val future : ('-> 'b) -> '-> 'b t
                val react : '-> 'a t -> 'TimeVaryReact.t
              end
          end
    end
end