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