sig
  type 'a result = Value of 'a | Fail of exn
  type cancel
  type +'a behavior
  val return : 'a -> 'a Froc.behavior
  val fail : exn -> 'a Froc.behavior
  val bind :
    ?eq:('a -> 'a -> bool) ->
    'b Froc.behavior -> ('b -> 'a Froc.behavior) -> 'a Froc.behavior
  val ( >>= ) :
    'a Froc.behavior -> ('a -> 'b Froc.behavior) -> 'b Froc.behavior
  val blift :
    ?eq:('a -> 'a -> bool) ->
    'b Froc.behavior -> ('b -> 'a) -> 'a Froc.behavior
  val lift :
    ?eq:('a -> 'a -> bool) ->
    ('b -> 'a) -> 'b Froc.behavior -> 'a Froc.behavior
  val sample : 'a Froc.behavior -> 'a
  val sample_result : 'a Froc.behavior -> 'a Froc.result
  val catch :
    ?eq:('a -> 'a -> bool) ->
    (unit -> 'a Froc.behavior) ->
    (exn -> 'a Froc.behavior) -> 'a Froc.behavior
  val catch_lift :
    ?eq:('a -> 'a -> bool) ->
    (unit -> 'a Froc.behavior) -> (exn -> 'a) -> 'a Froc.behavior
  val try_bind :
    ?eq:('a -> 'a -> bool) ->
    (unit -> 'b Froc.behavior) ->
    ('b -> 'a Froc.behavior) -> (exn -> 'a Froc.behavior) -> 'a Froc.behavior
  val try_bind_lift :
    ?eq:('a -> 'a -> bool) ->
    (unit -> 'b Froc.behavior) ->
    ('b -> 'a) -> (exn -> 'a) -> 'a Froc.behavior
  val join_b :
    ?eq:('a -> 'a -> bool) ->
    'a Froc.behavior Froc.behavior -> 'a Froc.behavior
  val fix_b :
    ?eq:('a -> 'a -> bool) ->
    ('a Froc.behavior -> 'a Froc.behavior) -> 'a Froc.behavior
  val notify_b : ?now:bool -> 'a Froc.behavior -> ('a -> unit) -> unit
  val notify_b_cancel :
    ?now:bool -> 'a Froc.behavior -> ('a -> unit) -> Froc.cancel
  val notify_result_b :
    ?now:bool -> 'a Froc.behavior -> ('a Froc.result -> unit) -> unit
  val notify_result_b_cancel :
    ?now:bool -> 'a Froc.behavior -> ('a Froc.result -> unit) -> Froc.cancel
  val hash_behavior : 'a Froc.behavior -> int
  type +'a event
  type -'a event_sender
  val make_event : unit -> 'a Froc.event * 'a Froc.event_sender
  val never : 'a Froc.event
  val notify_e : 'a Froc.event -> ('a -> unit) -> unit
  val notify_e_cancel : 'a Froc.event -> ('a -> unit) -> Froc.cancel
  val notify_result_e : 'a Froc.event -> ('a Froc.result -> unit) -> unit
  val notify_result_e_cancel :
    'a Froc.event -> ('a Froc.result -> unit) -> Froc.cancel
  val send : 'a Froc.event_sender -> 'a -> unit
  val send_exn : 'a Froc.event_sender -> exn -> unit
  val send_result : 'a Froc.event_sender -> 'a Froc.result -> unit
  val send_deferred : 'a Froc.event_sender -> 'a -> unit
  val send_exn_deferred : 'a Froc.event_sender -> exn -> unit
  val send_result_deferred : 'a Froc.event_sender -> 'a Froc.result -> unit
  val next : 'a Froc.event -> 'a Froc.event
  val merge : 'a Froc.event list -> 'a Froc.event
  val map : ('a -> 'b) -> 'a Froc.event -> 'b Froc.event
  val map2 :
    ('a -> 'b -> 'c) -> 'a Froc.event -> 'b Froc.event -> 'c Froc.event
  val filter : ('a -> bool) -> 'a Froc.event -> 'a Froc.event
  val collect : ('a -> 'b -> 'a) -> 'a -> 'b Froc.event -> 'a Froc.event
  val join_e : 'a Froc.event Froc.event -> 'a Froc.event
  val fix_e : ('a Froc.event -> 'a Froc.event) -> 'a Froc.event
  val hash_event : 'a Froc.event -> int
  val switch :
    ?eq:('a -> 'a -> bool) ->
    'a Froc.behavior -> 'a Froc.behavior Froc.event -> 'a Froc.behavior
  val until :
    ?eq:('a -> 'a -> bool) ->
    'a Froc.behavior -> 'a Froc.behavior Froc.event -> 'a Froc.behavior
  val hold :
    ?eq:('a -> 'a -> bool) -> 'a -> 'a Froc.event -> 'a Froc.behavior
  val hold_result :
    ?eq:('a -> 'a -> bool) ->
    'a Froc.result -> 'a Froc.event -> 'a Froc.behavior
  val changes : 'a Froc.behavior -> 'a Froc.event
  val when_true : bool Froc.behavior -> unit Froc.event
  val count : 'a Froc.event -> int Froc.behavior
  val make_cell : 'a -> 'a Froc.behavior * ('a -> unit)
  val init : unit -> unit
  val no_cancel : Froc.cancel
  val cancel : Froc.cancel -> unit
  val cleanup : (unit -> unit) -> unit
  val memo :
    ?size:int ->
    ?hash:('a -> int) ->
    ?eq:('a -> 'a -> bool) -> unit -> ('a -> 'b) -> 'a -> 'b
  val set_exn_handler : (exn -> unit) -> unit
  val set_debug : (string -> unit) -> unit
  val bind2 :
    ?eq:('a -> 'a -> bool) ->
    'b Froc.behavior ->
    'c Froc.behavior -> ('b -> 'c -> 'a Froc.behavior) -> 'a Froc.behavior
  val blift2 :
    ?eq:('a -> 'a -> bool) ->
    'b Froc.behavior ->
    'c Froc.behavior -> ('b -> 'c -> 'a) -> 'a Froc.behavior
  val lift2 :
    ?eq:('a -> 'a -> bool) ->
    ('b -> 'c -> 'a) ->
    'b Froc.behavior -> 'c Froc.behavior -> 'a Froc.behavior
  val bind3 :
    ?eq:('a -> 'a -> bool) ->
    'b Froc.behavior ->
    'c Froc.behavior ->
    'd Froc.behavior ->
    ('b -> 'c -> 'd -> 'a Froc.behavior) -> 'a Froc.behavior
  val blift3 :
    ?eq:('a -> 'a -> bool) ->
    'b Froc.behavior ->
    'c Froc.behavior ->
    'd Froc.behavior -> ('b -> 'c -> 'd -> 'a) -> 'a Froc.behavior
  val lift3 :
    ?eq:('a -> 'a -> bool) ->
    ('b -> 'c -> 'd -> 'a) ->
    'b Froc.behavior ->
    'c Froc.behavior -> 'd Froc.behavior -> 'a Froc.behavior
  val bind4 :
    ?eq:('a -> 'a -> bool) ->
    'b Froc.behavior ->
    'c Froc.behavior ->
    'd Froc.behavior ->
    'e Froc.behavior ->
    ('b -> 'c -> 'd -> 'e -> 'a Froc.behavior) -> 'a Froc.behavior
  val blift4 :
    ?eq:('a -> 'a -> bool) ->
    'b Froc.behavior ->
    'c Froc.behavior ->
    'd Froc.behavior ->
    'e Froc.behavior -> ('b -> 'c -> 'd -> 'e -> 'a) -> 'a Froc.behavior
  val lift4 :
    ?eq:('a -> 'a -> bool) ->
    ('b -> 'c -> 'd -> 'e -> 'a) ->
    'b Froc.behavior ->
    'c Froc.behavior ->
    'd Froc.behavior -> 'e Froc.behavior -> 'a Froc.behavior
  val bind5 :
    ?eq:('a -> 'a -> bool) ->
    'b Froc.behavior ->
    'c Froc.behavior ->
    'd Froc.behavior ->
    'e Froc.behavior ->
    'f Froc.behavior ->
    ('b -> 'c -> 'd -> 'e -> 'f -> 'a Froc.behavior) -> 'a Froc.behavior
  val blift5 :
    ?eq:('a -> 'a -> bool) ->
    'b Froc.behavior ->
    'c Froc.behavior ->
    'd Froc.behavior ->
    'e Froc.behavior ->
    'f Froc.behavior ->
    ('b -> 'c -> 'd -> 'e -> 'f -> 'a) -> 'a Froc.behavior
  val lift5 :
    ?eq:('a -> 'a -> bool) ->
    ('b -> 'c -> 'd -> 'e -> 'f -> 'a) ->
    'b Froc.behavior ->
    'c Froc.behavior ->
    'd Froc.behavior ->
    'e Froc.behavior -> 'f Froc.behavior -> 'a Froc.behavior
  val bind6 :
    ?eq:('a -> 'a -> bool) ->
    'b Froc.behavior ->
    'c Froc.behavior ->
    'd Froc.behavior ->
    'e Froc.behavior ->
    'f Froc.behavior ->
    'g Froc.behavior ->
    ('b -> 'c -> 'd -> 'e -> 'f -> 'g -> 'a Froc.behavior) ->
    'a Froc.behavior
  val blift6 :
    ?eq:('a -> 'a -> bool) ->
    'b Froc.behavior ->
    'c Froc.behavior ->
    'd Froc.behavior ->
    'e Froc.behavior ->
    'f Froc.behavior ->
    'g Froc.behavior ->
    ('b -> 'c -> 'd -> 'e -> 'f -> 'g -> 'a) -> 'a Froc.behavior
  val lift6 :
    ?eq:('a -> 'a -> bool) ->
    ('b -> 'c -> 'd -> 'e -> 'f -> 'g -> 'a) ->
    'b Froc.behavior ->
    'c Froc.behavior ->
    'd Froc.behavior ->
    'e Froc.behavior ->
    'f Froc.behavior -> 'g Froc.behavior -> 'a Froc.behavior
  val bind7 :
    ?eq:('a -> 'a -> bool) ->
    'b Froc.behavior ->
    'c Froc.behavior ->
    'd Froc.behavior ->
    'e Froc.behavior ->
    'f Froc.behavior ->
    'g Froc.behavior ->
    'h Froc.behavior ->
    ('b -> 'c -> 'd -> 'e -> 'f -> 'g -> 'h -> 'a Froc.behavior) ->
    'a Froc.behavior
  val blift7 :
    ?eq:('a -> 'a -> bool) ->
    'b Froc.behavior ->
    'c Froc.behavior ->
    'd Froc.behavior ->
    'e Froc.behavior ->
    'f Froc.behavior ->
    'g Froc.behavior ->
    'h Froc.behavior ->
    ('b -> 'c -> 'd -> 'e -> 'f -> 'g -> 'h -> 'a) -> 'a Froc.behavior
  val lift7 :
    ?eq:('a -> 'a -> bool) ->
    ('b -> 'c -> 'd -> 'e -> 'f -> 'g -> 'h -> 'a) ->
    'b Froc.behavior ->
    'c Froc.behavior ->
    'd Froc.behavior ->
    'e Froc.behavior ->
    'f Froc.behavior ->
    'g Froc.behavior -> 'h Froc.behavior -> 'a Froc.behavior
  val bindN :
    ?eq:('a -> 'a -> bool) ->
    'b Froc.behavior list ->
    ('b list -> 'a Froc.behavior) -> 'a Froc.behavior
  val bliftN :
    ?eq:('a -> 'a -> bool) ->
    'b Froc.behavior list -> ('b list -> 'a) -> 'a Froc.behavior
  val liftN :
    ?eq:('a -> 'a -> bool) ->
    ('b list -> 'a) -> 'b Froc.behavior list -> 'a Froc.behavior
end