summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStéphane Glondu <glondu@debian.org>2015-10-29 10:08:38 +0100
committerStéphane Glondu <glondu@debian.org>2015-10-29 10:08:38 +0100
commit011c6fa1a76e4da5b2bff3f2c32ba47b1fd1408f (patch)
treeb48339790deb38a29d561708a0591d27c99c62e1
Import react_1.2.0.orig.tar.bz2
[dgit import orig react_1.2.0.orig.tar.bz2]
-rw-r--r--.ocamlinit2
-rw-r--r--CHANGES.md78
-rw-r--r--README.md53
-rw-r--r--TODO.md52
-rw-r--r--_tags11
-rw-r--r--doc/React.E.Option.html40
-rw-r--r--doc/React.E.html332
-rw-r--r--doc/React.S.Bool.html51
-rw-r--r--doc/React.S.Compare.html33
-rw-r--r--doc/React.S.EqType.html29
-rw-r--r--doc/React.S.Float.html65
-rw-r--r--doc/React.S.Int.html44
-rw-r--r--doc/React.S.Make.html65
-rw-r--r--doc/React.S.Option.html54
-rw-r--r--doc/React.S.Pair.html27
-rw-r--r--doc/React.S.S.html49
-rw-r--r--doc/React.S.Special.Sb.html49
-rw-r--r--doc/React.S.Special.Sf.html49
-rw-r--r--doc/React.S.Special.Si.html51
-rw-r--r--doc/React.S.Special.html40
-rw-r--r--doc/React.S.html347
-rw-r--r--doc/React.Step.html55
-rw-r--r--doc/React.html469
-rw-r--r--doc/api.odocl1
-rw-r--r--doc/index.html29
-rw-r--r--doc/index_attributes.html19
-rw-r--r--doc/index_class_types.html19
-rw-r--r--doc/index_classes.html19
-rw-r--r--doc/index_exceptions.html19
-rw-r--r--doc/index_methods.html19
-rw-r--r--doc/index_module_types.html31
-rw-r--r--doc/index_modules.html91
-rw-r--r--doc/index_types.html57
-rw-r--r--doc/index_values.html587
-rw-r--r--doc/style.css98
-rw-r--r--doc/type_React.E.Option.html16
-rw-r--r--doc/type_React.E.html68
-rw-r--r--doc/type_React.S.Bool.html22
-rw-r--r--doc/type_React.S.Compare.html22
-rw-r--r--doc/type_React.S.EqType.html15
-rw-r--r--doc/type_React.S.Float.html55
-rw-r--r--doc/type_React.S.Int.html33
-rw-r--r--doc/type_React.S.Make.html47
-rw-r--r--doc/type_React.S.Option.html19
-rw-r--r--doc/type_React.S.Pair.html20
-rw-r--r--doc/type_React.S.S.html87
-rw-r--r--doc/type_React.S.Special.Sb.html46
-rw-r--r--doc/type_React.S.Special.Sf.html46
-rw-r--r--doc/type_React.S.Special.Si.html46
-rw-r--r--doc/type_React.S.Special.html124
-rw-r--r--doc/type_React.S.html459
-rw-r--r--doc/type_React.Step.html16
-rw-r--r--doc/type_React.html586
-rw-r--r--opam17
-rw-r--r--pkg/META22
-rwxr-xr-xpkg/build.ml16
-rw-r--r--pkg/config.ml11
-rwxr-xr-xpkg/git.ml14
-rw-r--r--pkg/topkg-ext.ml272
-rw-r--r--pkg/topkg.ml303
-rw-r--r--src/react.ml1706
-rw-r--r--src/react.mli1131
-rw-r--r--src/react_top.ml48
-rw-r--r--test/breakout.ml481
-rw-r--r--test/clock.ml18
-rw-r--r--test/js_test.html22
-rw-r--r--test/js_test.ml49
-rw-r--r--test/test.ml1523
-rw-r--r--test/tests.itarget3
69 files changed, 10397 insertions, 0 deletions
diff --git a/.ocamlinit b/.ocamlinit
new file mode 100644
index 0000000..39e2d55
--- /dev/null
+++ b/.ocamlinit
@@ -0,0 +1,2 @@
+#directory "_build/src"
+#load "react.cmo" \ No newline at end of file
diff --git a/CHANGES.md b/CHANGES.md
new file mode 100644
index 0000000..8142313
--- /dev/null
+++ b/CHANGES.md
@@ -0,0 +1,78 @@
+
+v1.2.0 2014-08-24 Cambridge (UK)
+--------------------------------
+
+- Fix bug in dynamic creation of S.{diff,changes} (#8).
+- Fix bug in dynamic creation of S.switch (#7).
+- Add support for toplevel: automatically `open React` on `#require "react"`.
+- Add `S.Bool.{flip,edge,fall,rise}`.
+
+v1.1.0 2014-04-27 La Forclaz (VS)
+---------------------------------
+
+- Fix `S.switch` rank's initialisation.
+- Add `E.l{1,2,3,4,5,6}`, lifting combinators on events.
+- Add `E.Option.{some,value}`.
+- Add `S.{Float,Int}.{zero,one,minus_one}`.
+- Add `S.Bool.{zero,one}`.
+- Add `S.Option.{none,some,value}`.
+- Add `{S,E}.on` equivalent to `{S,E}.when_`.
+- Deprecate `{S,E}.when_` (syntax error prone).
+
+v1.0.1 2014-04-21 La Forclaz (VS)
+---------------------------------
+
+- Fix `S.bind`.
+- Use package builder topkg for distribution.
+
+v1.0.0 2014-04-02 La Forclaz (VS)
+---------------------------------
+
+- OPAM friendly workflow and drop OASIS support.
+- Add `S.bind`.
+
+The following changes are incompatible.
+
+- Add support for update steps, see the `React.Step` module. Allows to
+ specify simultaneous primitive signal updates and event occurences.
+ The functions returned by `{S,E}.create` now have an optional
+ `?step` argument; if unused the previous semantics is preserved.
+- Add support for strong stops, can be used on platforms where weak
+ arrays are not to prevent leaks. The function `{E,S}.stop` now have
+ an optional `?strong` argument; if unused the previous semantics is
+ preserved.
+- Change signature of `S.switch`. Any existing call `S.switch ~eq s es` can
+ be replaced by `S.(switch ~eq (hold ~eq:( == ) s es))`.
+
+
+v0.9.4 2012-08-05 Lausanne
+--------------------------
+
+- OASIS 0.3.0 support.
+
+
+v0.9.3 2012-03-17 La Forclaz (VS)
+---------------------------------
+
+- OASIS support.
+
+
+v0.9.2 2010-04-25 Lausanne
+--------------------------
+
+- Fix a bug in weak heap implementation (thanks to Jake Donham for reporting
+ and a discussion about the fix).
+
+
+v0.9.1 2010-04-15 Paris
+-----------------------
+
+- Added `E.retain` and `S.retain`.
+- A few `List.map` where replaced by `List.rev_map`.
+- Fixes to `breakout.ml` to make it work on vte based terminals.
+
+
+v0.9.0 2009-01-19 Lausanne
+--------------------------
+
+- First release.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..a1d8d25
--- /dev/null
+++ b/README.md
@@ -0,0 +1,53 @@
+React — Declarative events and signals for OCaml
+-------------------------------------------------------------------------------
+Release 1.2.0
+
+React is an OCaml module for functional reactive programming (FRP). It
+provides support to program with time varying values : declarative
+events and signals. React doesn't define any primitive event or
+signal, it lets the client chooses the concrete timeline.
+
+React is made of a single, independent, module and distributed under
+the BSD3 license.
+
+Home page: http://erratique.ch/software/react
+Contact: Daniel Bünzli `<daniel.buenzl i@erratique.ch>`
+
+
+## Installation
+
+React can be installed with `opam`:
+
+ opam install react
+
+If you don't use `opam` consult the [`opam`](opam) file for build
+instructions.
+
+
+## Documentation
+
+The documentation and API reference is automatically generated by
+`ocamldoc` from the interfaces. It can be consulted [online][3]
+and there is a generated version in the `doc` directory of the
+distribution.
+
+[3]: http://erratique.ch/software/react/doc/React
+
+
+## Sample programs
+
+If you installed React with `opam` sample programs are located in
+the directory `opam config var react:doc`.
+
+In the distribution sample programs are located in the `test`
+directory of the distribution. They can be built with:
+
+ ocamlbuild -use-ocamlfind test/tests.otarget
+
+The resulting binaries are in `_build/test`.
+
+- `test.native` tests the library, nothing should fail.
+- `clock.native` is a command line program using ANSI escape sequences
+ and the Unix module to print the current local time.
+- `breakout.native` is a command line program using ANSI escape sequences
+ and the Unix module to implement a simple breakout game.
diff --git a/TODO.md b/TODO.md
new file mode 100644
index 0000000..bfbf6cb
--- /dev/null
+++ b/TODO.md
@@ -0,0 +1,52 @@
+
+# Exceptions
+
+* Make steps resistant to exceptions ? There's more than one solution here
+ one is to discard the step and unschedule all nodes. Another would be
+ to catch them an trap them like in Fut.
+
+
+# New event combinators
+
+* E.merge but only on simultanous occs ?
+* Review Bool.flip init.
+* S.Bool.edge,rise,fall plural ?
+* E.Bool.flip
+
+# Signal init.
+
+Instead of having bare values why not always have signals ?
+This would undermine the temptation of using S.value.
+
+# Stopped nodes
+
+Stopped nodes could be detected and considered as constant by
+smart constructors.
+
+# Multisample
+
+Current combinators are not good for sampling multiple signals,
+which is generally useful in conjunction with accum. TODO
+maybe not in fact see list selector. Just compute the as a signal.
+But maybe not always natural ?
+
+
+# Recursive defs
+
+Investigate the case when dynamics can replace signals with constants
+one which could make a direct dep on the delay noded (and hence
+raise). Doesn't seem possible but I suspect I saw this once.
+
+# New signal combinators.
+
+To avoid uses of S.value we need better ways to access a
+signal's current value and inject it in an efficient
+way in the graph.
+
+```ocaml
+S.freeze : 'a signal -> 'a signal
+(** [freeze s]_{t} = [s]_{t'} where t' is freeze's creation time. *)
+```
+
+See if we can return a const and if what happens when used with
+bind and/or provide an alternative S.bind for bootstraping.
diff --git a/_tags b/_tags
new file mode 100644
index 0000000..fbcdaa0
--- /dev/null
+++ b/_tags
@@ -0,0 +1,11 @@
+<**/*.{ml,mli}> : bin_annot, annot
+
+<src> : include
+<src/react_top.*> : package(compiler-libs.toplevel)
+
+<test> : include
+<test/clock.{native,byte}> : use_unix
+<test/breakout.{native,byte}> : use_unix
+<test/js_test.{ml,native,byte}> : package(js_of_ocaml), \
+ package(js_of_ocaml.syntax), \
+ syntax(camlp4o) \ No newline at end of file
diff --git a/doc/React.E.Option.html b/doc/React.E.Option.html
new file mode 100644
index 0000000..8d8098c
--- /dev/null
+++ b/doc/React.E.Option.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="Up" href="React.E.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.E.Option</title>
+</head>
+<body>
+<div class="navbar">&nbsp;<a class="up" href="React.E.html" title="React.E">Up</a>
+&nbsp;</div>
+<h1>Module <a href="type_React.E.Option.html">React.E.Option</a></h1>
+
+<pre><span class="keyword">module</span> Option: <code class="code"><span class="keyword">sig</span></code> <a href="React.E.Option.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><div class="info module top">
+Events with option occurences.<br>
+</div>
+<hr width="100%">
+
+<pre><span id="VALsome"><span class="keyword">val</span> some</span> : <code class="type">'a <a href="React.html#TYPEevent">React.event</a> -> 'a option <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">some e</code> is <code class="code">map (<span class="keyword">fun</span> v <span class="keywordsign">-&gt;</span> <span class="constructor">Some</span> v) e</code>.<br>
+</div>
+
+<pre><span id="VALvalue"><span class="keyword">val</span> value</span> : <code class="type">?default:'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a option <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">value default e</code> either silences <code class="code"><span class="constructor">None</span></code> occurences if <code class="code">default</code> is
+ unspecified or replaces them by the value of <code class="code">default</code> at the occurence
+ time.
+ <ul>
+<li>[<code class="code">value ~default e</code>]<sub class="subscript">t</sub><code class="code"> = v</code> if [<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> (<span class="constructor">Some</span> v)</code>.</li>
+<li>[<code class="code">value ?default:<span class="constructor">None</span> e</code>]<sub class="subscript">t</sub><code class="code"> = <span class="constructor">None</span></code> if [<code class="code">e</code>]<sub class="subscript">t</sub> = <code class="code"><span class="constructor">None</span></code>.</li>
+<li>[<code class="code">value ?default:(<span class="constructor">Some</span> s) e</code>]<sub class="subscript">t</sub><code class="code"> = v</code>
+ if [<code class="code">e</code>]<sub class="subscript">t</sub> = <code class="code"><span class="constructor">None</span></code> and [<code class="code">s</code>]<sub class="subscript">t</sub> <code class="code">= v</code>.</li>
+</ul>
+<br>
+</div>
+</body></html> \ No newline at end of file
diff --git a/doc/React.E.html b/doc/React.E.html
new file mode 100644
index 0000000..219390d
--- /dev/null
+++ b/doc/React.E.html
@@ -0,0 +1,332 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="next" href="React.S.html">
+<link rel="Up" href="React.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><link title="Primitive and basics" rel="Section" href="#prim">
+<link title="Transforming and filtering" rel="Section" href="#transf">
+<link title="Accumulating" rel="Section" href="#accum">
+<link title="Combining" rel="Section" href="#combine">
+<link title="Lifting" rel="Section" href="#1_Lifting">
+<link title="Pervasives support" rel="Section" href="#1_Pervasivessupport">
+<title>React.E</title>
+</head>
+<body>
+<div class="navbar">&nbsp;<a class="up" href="React.html" title="React">Up</a>
+&nbsp;<a class="post" href="React.S.html" title="React.S">Next</a>
+</div>
+<h1>Module <a href="type_React.E.html">React.E</a></h1>
+
+<pre><span class="keyword">module</span> E: <code class="code"><span class="keyword">sig</span></code> <a href="React.E.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><div class="info module top">
+Event combinators.
+<p>
+
+ Consult their <a href="React.html#evsem">semantics.</a><br>
+</div>
+<hr width="100%">
+<br>
+<h1 id="prim">Primitive and basics</h1><br>
+
+<pre><span id="TYPEt"><span class="keyword">type</span> <code class="type">'a</code> t</span> = <code class="type">'a <a href="React.html#TYPEevent">React.event</a></code> </pre>
+<div class="info ">
+The type for events with occurrences of type <code class="code"><span class="keywordsign">'</span>a</code>.<br>
+</div>
+
+
+<pre><span id="VALnever"><span class="keyword">val</span> never</span> : <code class="type">'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+A never occuring event. For all t, [<code class="code">never</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code>.<br>
+</div>
+
+<pre><span id="VALcreate"><span class="keyword">val</span> create</span> : <code class="type">unit -> 'a <a href="React.html#TYPEevent">React.event</a> * (?step:<a href="React.html#TYPEstep">React.step</a> -> 'a -> unit)</code></pre><div class="info ">
+<code class="code">create ()</code> is a primitive event <code class="code">e</code> and a <code class="code">send</code> function. The
+ function <code class="code">send</code> is such that:
+ <ul>
+<li><code class="code">send v</code> generates an occurrence <code class="code">v</code> of <code class="code">e</code> at the time it is called
+ and triggers an <a href="React.html#steps">update step</a>.</li>
+<li><code class="code">send ~step v</code> generates an occurence <code class="code">v</code> of <code class="code">e</code> on the step <code class="code">step</code>
+ when <code class="code">step</code> is <a href="React.Step.html#VALexecute">executed</a>.</li>
+<li><code class="code">send ~step v</code> raises <code class="code"><span class="constructor">Invalid_argument</span></code> if it was previously
+ called with a step and this step has not executed yet or if
+ the given <code class="code">step</code> was already executed.</li>
+</ul>
+
+<p>
+
+ <b>Warning.</b> <code class="code">send</code> must not be executed inside an update step.<br>
+</div>
+
+<pre><span id="VALretain"><span class="keyword">val</span> retain</span> : <code class="type">'a <a href="React.html#TYPEevent">React.event</a> -> (unit -> unit) -> [ `R of unit -> unit ]</code></pre><div class="info ">
+<code class="code">retain e c</code> keeps a reference to the closure <code class="code">c</code> in <code class="code">e</code> and
+ returns the previously retained value. <code class="code">c</code> will <em>never</em> be
+ invoked.
+<p>
+
+ <b>Raises.</b> <code class="code"><span class="constructor">Invalid_argument</span></code> on <a href="React.E.html#VALnever"><code class="code"><span class="constructor">React</span>.<span class="constructor">E</span>.never</code></a>.<br>
+</div>
+
+<pre><span id="VALstop"><span class="keyword">val</span> stop</span> : <code class="type">?strong:bool -> 'a <a href="React.html#TYPEevent">React.event</a> -> unit</code></pre><div class="info ">
+<code class="code">stop e</code> stops <code class="code">e</code> from occuring. It conceptually becomes
+ <a href="React.E.html#VALnever"><code class="code"><span class="constructor">React</span>.<span class="constructor">E</span>.never</code></a> and cannot be restarted. Allows to
+ disable <a href="React.html#sideeffects">effectful</a> events.
+<p>
+
+ The <code class="code">strong</code> argument should only be used on platforms
+ where weak arrays have a strong semantics (i.e. JavaScript).
+ See <a href="React.html#strongstop">details</a>.
+<p>
+
+ <b>Note.</b> If executed in an <a href="React.html#steps">update step</a>
+ the event may still occur in the step.<br>
+</div>
+
+<pre><span id="VALequal"><span class="keyword">val</span> equal</span> : <code class="type">'a <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEevent">React.event</a> -> bool</code></pre><div class="info ">
+<code class="code">equal e e'</code> is <code class="code"><span class="keyword">true</span></code> iff <code class="code">e</code> and <code class="code">e'</code> are equal. If both events are
+ different from <a href="React.E.html#VALnever"><code class="code"><span class="constructor">React</span>.<span class="constructor">E</span>.never</code></a>, physical equality is used.<br>
+</div>
+
+<pre><span id="VALtrace"><span class="keyword">val</span> trace</span> : <code class="type">?iff:bool <a href="React.html#TYPEsignal">React.signal</a> -> ('a -> unit) -> 'a <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">trace iff tr e</code> is <code class="code">e</code> except <code class="code">tr</code> is invoked with e's
+ occurence when <code class="code">iff</code> is <code class="code"><span class="keyword">true</span></code> (defaults to <code class="code"><span class="constructor">S</span>.const <span class="keyword">true</span></code>).
+ For all t where [<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code> and [<code class="code">iff</code>]<sub class="subscript">t</sub> =
+ <code class="code"><span class="keyword">true</span></code>, <code class="code">tr</code> is invoked with <code class="code">v</code>.<br>
+</div>
+<br>
+<h1 id="transf">Transforming and filtering</h1><br>
+
+<pre><span id="VALonce"><span class="keyword">val</span> once</span> : <code class="type">'a <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">once e</code> is <code class="code">e</code> with only its next occurence.
+ <ul>
+<li>[<code class="code">once e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code> if [<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code> and
+ [<code class="code">e</code>]<sub class="subscript">&lt;t</sub> <code class="code">= <span class="constructor">None</span></code>.</li>
+<li>[<code class="code">once e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> otherwise.</li>
+</ul>
+<br>
+</div>
+
+<pre><span id="VALdrop_once"><span class="keyword">val</span> drop_once</span> : <code class="type">'a <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">drop_once e</code> is <code class="code">e</code> without its next occurrence.
+ <ul>
+<li>[<code class="code">drop_once e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code> if [<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code> and
+ [<code class="code">e</code>]<sub class="subscript">&lt;t</sub> <code class="code">= <span class="constructor">Some</span> _</code>.</li>
+<li>[<code class="code">drop_once e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> otherwise.</li>
+</ul>
+<br>
+</div>
+
+<pre><span id="VALapp"><span class="keyword">val</span> app</span> : <code class="type">('a -> 'b) <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEevent">React.event</a> -> 'b <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">app ef e</code> occurs when both <code class="code">ef</code> and <code class="code">e</code> occur
+ <a href="React.html#simultaneity">simultaneously</a>.
+ The value is <code class="code">ef</code>'s occurence applied to <code class="code">e</code>'s one.
+ <ul>
+<li>[<code class="code">app ef e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v'</code> if [<code class="code">ef</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> f</code> and
+ [<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code> and <code class="code">f v = v'</code>.</li>
+<li>[<code class="code">app ef e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> otherwise.</li>
+</ul>
+<br>
+</div>
+
+<pre><span id="VALmap"><span class="keyword">val</span> map</span> : <code class="type">('a -> 'b) -> 'a <a href="React.html#TYPEevent">React.event</a> -> 'b <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">map f e</code> applies <code class="code">f</code> to <code class="code">e</code>'s occurrences.
+ <ul>
+<li>[<code class="code">map f e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> (f v)</code> if [<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code>.</li>
+<li>[<code class="code">map f e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> otherwise.</li>
+</ul>
+<br>
+</div>
+
+<pre><span id="VALstamp"><span class="keyword">val</span> stamp</span> : <code class="type">'b <a href="React.html#TYPEevent">React.event</a> -> 'a -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">stamp e v</code> is <code class="code">map (<span class="keyword">fun</span> _ <span class="keywordsign">-&gt;</span> v) e</code>.<br>
+</div>
+
+<pre><span id="VALfilter"><span class="keyword">val</span> filter</span> : <code class="type">('a -> bool) -> 'a <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">filter p e</code> are <code class="code">e</code>'s occurrences that satisfy <code class="code">p</code>.
+ <ul>
+<li>[<code class="code">filter p e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code> if [<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code> and
+ <code class="code">p v = <span class="keyword">true</span></code></li>
+<li>[<code class="code">filter p e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> otherwise.</li>
+</ul>
+<br>
+</div>
+
+<pre><span id="VALfmap"><span class="keyword">val</span> fmap</span> : <code class="type">('a -> 'b option) -> 'a <a href="React.html#TYPEevent">React.event</a> -> 'b <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">fmap fm e</code> are <code class="code">e</code>'s occurrences filtered and mapped by <code class="code">fm</code>.
+ <ul>
+<li>[<code class="code">fmap fm e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code> if <code class="code">fm</code> [<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code></li>
+<li>[<code class="code">fmap fm e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> otherwise.</li>
+</ul>
+<br>
+</div>
+
+<pre><span id="VALdiff"><span class="keyword">val</span> diff</span> : <code class="type">('a -> 'a -> 'b) -> 'a <a href="React.html#TYPEevent">React.event</a> -> 'b <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">diff f e</code> occurs whenever <code class="code">e</code> occurs except on the next occurence.
+ Occurences are <code class="code">f v v'</code> where <code class="code">v</code> is <code class="code">e</code>'s current
+ occurrence and <code class="code">v'</code> the previous one.
+ <ul>
+<li>[<code class="code">diff f e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> r</code> if [<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code>,
+ [<code class="code">e</code>]<sub class="subscript">&lt;t</sub> <code class="code">= <span class="constructor">Some</span> v'</code> and <code class="code">f v v' = r</code>.</li>
+<li>[<code class="code">diff f e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> otherwise.</li>
+</ul>
+<br>
+</div>
+
+<pre><span id="VALchanges"><span class="keyword">val</span> changes</span> : <code class="type">?eq:('a -> 'a -> bool) -> 'a <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">changes eq e</code> is <code class="code">e</code>'s occurrences with occurences equal to
+ the previous one dropped. Equality is tested with <code class="code">eq</code> (defaults to
+ structural equality).
+ <ul>
+<li>[<code class="code">changes eq e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code> if [<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code>
+ and either [<code class="code">e</code>]<sub class="subscript">&lt;t</sub> <code class="code">= <span class="constructor">None</span></code> or [<code class="code">e</code>]<sub class="subscript">&lt;t</sub> <code class="code">= <span class="constructor">Some</span> v'</code> and
+ <code class="code">eq v v' = <span class="keyword">false</span></code>.</li>
+<li>[<code class="code">changes eq e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> otherwise.</li>
+</ul>
+<br>
+</div>
+
+<pre><span id="VALon"><span class="keyword">val</span> on</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">on c e</code> is the occurrences of <code class="code">e</code> when <code class="code">c</code> is <code class="code"><span class="keyword">true</span></code>.
+ <ul>
+<li>[<code class="code">on c e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code>
+ if [<code class="code">c</code>]<sub class="subscript">t</sub> <code class="code">= <span class="keyword">true</span></code> and [<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code>.</li>
+<li>[<code class="code">on c e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> otherwise.</li>
+</ul>
+<br>
+</div>
+
+<pre><span id="VALwhen_"><span class="keyword">val</span> when_</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<span class="warning">Deprecated.</span>Use <a href="React.E.html#VALon"><code class="code"><span class="constructor">React</span>.<span class="constructor">E</span>.on</code></a>.<br>
+</div>
+
+<pre><span id="VALdismiss"><span class="keyword">val</span> dismiss</span> : <code class="type">'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">dismiss c e</code> is the occurences of <code class="code">e</code> except the ones when <code class="code">c</code> occurs.
+ <ul>
+<li>[<code class="code">dimiss c e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code>
+ if [<code class="code">c</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> and [<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code>.</li>
+<li>[<code class="code">dimiss c e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> otherwise.</li>
+</ul>
+<br>
+</div>
+
+<pre><span id="VALuntil"><span class="keyword">val</span> until</span> : <code class="type">'a <a href="React.html#TYPEevent">React.event</a> -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'b <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">until c e</code> is <code class="code">e</code>'s occurences until <code class="code">c</code> occurs.
+ <ul>
+<li>[<code class="code">until c e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code> if [<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code> and
+ [<code class="code">c</code>]<sub class="subscript">&lt;=t</sub> <code class="code">= <span class="constructor">None</span></code></li>
+<li>[<code class="code">until c e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> otherwise.</li>
+</ul>
+<br>
+</div>
+<br>
+<h1 id="accum">Accumulating</h1><br>
+
+<pre><span id="VALaccum"><span class="keyword">val</span> accum</span> : <code class="type">('a -> 'a) <a href="React.html#TYPEevent">React.event</a> -> 'a -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">accum ef i</code> accumulates a value, starting with <code class="code">i</code>, using <code class="code">e</code>'s
+ functional occurrences.
+ <ul>
+<li>[<code class="code">accum ef i</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> (f i)</code> if [<code class="code">ef</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> f</code>
+ and [<code class="code">ef</code>]<sub class="subscript">&lt;t</sub> <code class="code">= <span class="constructor">None</span></code>.
+ </li>
+<li>[<code class="code">accum ef i</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> (f acc)</code> if [<code class="code">ef</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> f</code>
+ and [<code class="code">accum ef i</code>]<sub class="subscript">&lt;t</sub> <code class="code">= <span class="constructor">Some</span> acc</code>.</li>
+<li>[<code class="code">accum ef i</code>] <code class="code">= <span class="constructor">None</span></code> otherwise.</li>
+</ul>
+<br>
+</div>
+
+<pre><span id="VALfold"><span class="keyword">val</span> fold</span> : <code class="type">('a -> 'b -> 'a) -> 'a -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">fold f i e</code> accumulates <code class="code">e</code>'s occurrences with <code class="code">f</code> starting with <code class="code">i</code>.
+ <ul>
+<li>[<code class="code">fold f i e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> (f i v)</code> if
+ [<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code> and [<code class="code">e</code>]<sub class="subscript">&lt;t</sub> <code class="code">= <span class="constructor">None</span></code>.</li>
+<li>[<code class="code">fold f i e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> (f acc v)</code> if
+ [<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code> and [<code class="code">fold f i e</code>]<sub class="subscript">&lt;t</sub> <code class="code">= <span class="constructor">Some</span> acc</code>.</li>
+<li>[<code class="code">fold f i e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> otherwise.</li>
+</ul>
+<br>
+</div>
+<br>
+<h1 id="combine">Combining</h1><br>
+
+<pre><span id="VALselect"><span class="keyword">val</span> select</span> : <code class="type">'a <a href="React.html#TYPEevent">React.event</a> list -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">select el</code> is the occurrences of every event in <code class="code">el</code>.
+ If more than one event occurs <a href="React.html#simultaneity">simultaneously</a>
+ the leftmost is taken and the others are lost.
+ <ul>
+<li>[<code class="code">select el</code>]<sub class="subscript">t</sub> <code class="code">=</code> [<code class="code"><span class="constructor">List</span>.find (<span class="keyword">fun</span> e <span class="keywordsign">-&gt;</span> </code>[<code class="code">e</code>]<sub class="subscript">t</sub>
+ <code class="code">&lt;&gt; <span class="constructor">None</span>) el</code>]<sub class="subscript">t</sub></li>
+<li>[<code class="code">select el</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> otherwise.</li>
+</ul>
+<br>
+</div>
+
+<pre><span id="VALmerge"><span class="keyword">val</span> merge</span> : <code class="type">('a -> 'b -> 'a) -> 'a -> 'b <a href="React.html#TYPEevent">React.event</a> list -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">merge f a el</code> merges the <a href="React.html#simultaneity">simultaneous</a>
+ occurrences of every event in <code class="code">el</code> using <code class="code">f</code> and the accumulator <code class="code">a</code>.
+<p>
+
+ [<code class="code">merge f a el</code>]<sub class="subscript">t</sub>
+ <code class="code">= <span class="constructor">List</span>.fold_left f a (<span class="constructor">List</span>.filter (<span class="keyword">fun</span> o <span class="keywordsign">-&gt;</span> o &lt;&gt; <span class="constructor">None</span>)
+ (<span class="constructor">List</span>.map</code> []<sub class="subscript">t</sub><code class="code"> el))</code>.<br>
+</div>
+
+<pre><span id="VALswitch"><span class="keyword">val</span> switch</span> : <code class="type">'a <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEevent">React.event</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">switch e ee</code> is <code class="code">e</code>'s occurrences until there is an
+ occurrence <code class="code">e'</code> on <code class="code">ee</code>, the occurrences of <code class="code">e'</code> are then used
+ until there is a new occurrence on <code class="code">ee</code>, etc..
+ <ul>
+<li>[<code class="code">switch e ee</code>]<sub class="subscript">t</sub> <code class="code">=</code> [<code class="code">e</code>]<sub class="subscript">t</sub> if [<code class="code">ee</code>]<sub class="subscript">&lt;=t</sub> <code class="code">= <span class="constructor">None</span></code>.</li>
+<li>[<code class="code">switch e ee</code>]<sub class="subscript">t</sub> <code class="code">=</code> [<code class="code">e'</code>]<sub class="subscript">t</sub> if [<code class="code">ee</code>]<sub class="subscript">&lt;=t</sub>
+ <code class="code">= <span class="constructor">Some</span> e'</code>.</li>
+</ul>
+<br>
+</div>
+
+<pre><span id="VALfix"><span class="keyword">val</span> fix</span> : <code class="type">('a <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEevent">React.event</a> * 'b) -> 'b</code></pre><div class="info ">
+<code class="code">fix ef</code> allows to refer to the value an event had an
+ infinitesimal amount of time before.
+<p>
+
+ In <code class="code">fix ef</code>, <code class="code">ef</code> is called with an event <code class="code">e</code> that represents
+ the event returned by <code class="code">ef</code> delayed by an infinitesimal amount of
+ time. If <code class="code">e', r = ef e</code> then <code class="code">r</code> is returned by <code class="code">fix</code> and <code class="code">e</code>
+ is such that :
+ <ul>
+<li>[<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">=</code> <code class="code"><span class="constructor">None</span></code> if t = 0 </li>
+<li>[<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">=</code> [<code class="code">e'</code>]<sub class="subscript">t-dt</sub> otherwise</li>
+</ul>
+
+<p>
+
+ <b>Raises.</b> <code class="code"><span class="constructor">Invalid_argument</span></code> if <code class="code">e'</code> is directly a delayed event (i.e.
+ an event given to a fixing function).<br>
+</div>
+<br>
+<h1 id="1_Lifting">Lifting</h1>
+<p>
+
+ Lifting combinators. For a given <code class="code">n</code> the semantics is:
+ <ul>
+<li>[<code class="code">ln f e1 ... en</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> (f v1 ... vn)</code> if for all
+ i : [<code class="code">ei</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> vi</code>.</li>
+<li>[<code class="code">ln f e1 ... en</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> otherwise.</li>
+</ul>
+<br>
+
+<pre><span id="VALl1"><span class="keyword">val</span> l1</span> : <code class="type">('a -> 'b) -> 'a <a href="React.html#TYPEevent">React.event</a> -> 'b <a href="React.html#TYPEevent">React.event</a></code></pre>
+<pre><span id="VALl2"><span class="keyword">val</span> l2</span> : <code class="type">('a -> 'b -> 'c) -> 'a <a href="React.html#TYPEevent">React.event</a> -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'c <a href="React.html#TYPEevent">React.event</a></code></pre>
+<pre><span id="VALl3"><span class="keyword">val</span> l3</span> : <code class="type">('a -> 'b -> 'c -> 'd) -><br> 'a <a href="React.html#TYPEevent">React.event</a> -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'c <a href="React.html#TYPEevent">React.event</a> -> 'd <a href="React.html#TYPEevent">React.event</a></code></pre>
+<pre><span id="VALl4"><span class="keyword">val</span> l4</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e) -><br> 'a <a href="React.html#TYPEevent">React.event</a> -><br> 'b <a href="React.html#TYPEevent">React.event</a> -> 'c <a href="React.html#TYPEevent">React.event</a> -> 'd <a href="React.html#TYPEevent">React.event</a> -> 'e <a href="React.html#TYPEevent">React.event</a></code></pre>
+<pre><span id="VALl5"><span class="keyword">val</span> l5</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f) -><br> 'a <a href="React.html#TYPEevent">React.event</a> -><br> 'b <a href="React.html#TYPEevent">React.event</a> -><br> 'c <a href="React.html#TYPEevent">React.event</a> -> 'd <a href="React.html#TYPEevent">React.event</a> -> 'e <a href="React.html#TYPEevent">React.event</a> -> 'f <a href="React.html#TYPEevent">React.event</a></code></pre>
+<pre><span id="VALl6"><span class="keyword">val</span> l6</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g) -><br> 'a <a href="React.html#TYPEevent">React.event</a> -><br> 'b <a href="React.html#TYPEevent">React.event</a> -><br> 'c <a href="React.html#TYPEevent">React.event</a> -><br> 'd <a href="React.html#TYPEevent">React.event</a> -> 'e <a href="React.html#TYPEevent">React.event</a> -> 'f <a href="React.html#TYPEevent">React.event</a> -> 'g <a href="React.html#TYPEevent">React.event</a></code></pre><br>
+<h1 id="1_Pervasivessupport">Pervasives support</h1><br>
+
+<pre><span class="keyword">module</span> <a href="React.E.Option.html">Option</a>: <code class="code"><span class="keyword">sig</span></code> <a href="React.E.Option.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><div class="info">
+Events with option occurences.
+</div>
+</body></html> \ No newline at end of file
diff --git a/doc/React.S.Bool.html b/doc/React.S.Bool.html
new file mode 100644
index 0000000..2fc2801
--- /dev/null
+++ b/doc/React.S.Bool.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="next" href="React.S.Int.html">
+<link rel="Up" href="React.S.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Bool</title>
+</head>
+<body>
+<div class="navbar">&nbsp;<a class="up" href="React.S.html" title="React.S">Up</a>
+&nbsp;<a class="post" href="React.S.Int.html" title="React.S.Int">Next</a>
+</div>
+<h1>Module <a href="type_React.S.Bool.html">React.S.Bool</a></h1>
+
+<pre><span class="keyword">module</span> Bool: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Bool.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><hr width="100%">
+
+<pre><span id="VALzero"><span class="keyword">val</span> zero</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALone"><span class="keyword">val</span> one</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALnot"><span class="keyword">val</span> not</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(&&)"><span class="keyword">val</span> (&amp;&amp;)</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(||)"><span class="keyword">val</span> (||)</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALedge"><span class="keyword">val</span> edge</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">edge s</code> is <code class="code">changes s</code>.<br>
+</div>
+
+<pre><span id="VALrise"><span class="keyword">val</span> rise</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -> unit <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">rise s</code> is <code class="code"><span class="constructor">E</span>.fmap (<span class="keyword">fun</span> b <span class="keywordsign">-&gt;</span> <span class="keyword">if</span> b <span class="keyword">then</span> <span class="constructor">Some</span> () <span class="keyword">else</span> <span class="constructor">None</span>) (edge s)</code>.<br>
+</div>
+
+<pre><span id="VALfall"><span class="keyword">val</span> fall</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -> unit <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">fall s</code> is <code class="code"><span class="constructor">E</span>.fmap (<span class="keyword">fun</span> b <span class="keywordsign">-&gt;</span> <span class="keyword">if</span> b <span class="keyword">then</span> <span class="constructor">None</span> <span class="keyword">else</span> <span class="constructor">Some</span> ()) (edge s)</code>.<br>
+</div>
+
+<pre><span id="VALflip"><span class="keyword">val</span> flip</span> : <code class="type">bool -> 'a <a href="React.html#TYPEevent">React.event</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info ">
+<code class="code">flip b e</code> is a signal whose boolean value flips each time
+ <code class="code">e</code> occurs. <code class="code">b</code> is the initial signal value.
+ <ul>
+<li>[<code class="code">flip b e</code>]<sub class="subscript">0</sub> <code class="code">= not b</code> if [<code class="code">e</code>]<sub class="subscript">0</sub> <code class="code">= <span class="constructor">Some</span> _</code></li>
+<li>[<code class="code">flip b e</code>]<sub class="subscript">t</sub> <code class="code">= b</code> if [<code class="code">e</code>]<sub class="subscript">&lt;=t</sub> <code class="code">= <span class="constructor">None</span></code></li>
+<li>[<code class="code">flip b e</code>]<sub class="subscript">t</sub> <code class="code">=</code> <code class="code">not</code> [<code class="code">flip b e</code>]<sub class="subscript">t-dt</sub>
+ if [<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> _</code></li>
+</ul>
+<br>
+</div>
+</body></html> \ No newline at end of file
diff --git a/doc/React.S.Compare.html b/doc/React.S.Compare.html
new file mode 100644
index 0000000..70713f8
--- /dev/null
+++ b/doc/React.S.Compare.html
@@ -0,0 +1,33 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="previous" href="React.S.Option.html">
+<link rel="next" href="React.S.Make.html">
+<link rel="Up" href="React.S.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Compare</title>
+</head>
+<body>
+<div class="navbar"><a class="pre" href="React.S.Option.html" title="React.S.Option">Previous</a>
+&nbsp;<a class="up" href="React.S.html" title="React.S">Up</a>
+&nbsp;<a class="post" href="React.S.Make.html" title="React.S.Make">Next</a>
+</div>
+<h1>Module <a href="type_React.S.Compare.html">React.S.Compare</a></h1>
+
+<pre><span class="keyword">module</span> Compare: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Compare.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><hr width="100%">
+
+<pre><span id="VAL(=)"><span class="keyword">val</span> (=)</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(<>)"><span class="keyword">val</span> (&lt;&gt;)</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(<)"><span class="keyword">val</span> (&lt;)</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(>)"><span class="keyword">val</span> (&gt;)</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(<=)"><span class="keyword">val</span> (&lt;=)</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(>=)"><span class="keyword">val</span> (&gt;=)</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALcompare"><span class="keyword">val</span> compare</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(==)"><span class="keyword">val</span> (==)</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(!=)"><span class="keyword">val</span> (!=)</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
diff --git a/doc/React.S.EqType.html b/doc/React.S.EqType.html
new file mode 100644
index 0000000..e0d2c97
--- /dev/null
+++ b/doc/React.S.EqType.html
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="next" href="React.S.S.html">
+<link rel="Up" href="React.S.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.EqType</title>
+</head>
+<body>
+<div class="navbar">&nbsp;<a class="up" href="React.S.html" title="React.S">Up</a>
+&nbsp;<a class="post" href="React.S.S.html" title="React.S.S">Next</a>
+</div>
+<h1>Module type <a href="type_React.S.EqType.html">React.S.EqType</a></h1>
+
+<pre><span class="keyword">module type</span> EqType = <code class="code"><span class="keyword">sig</span></code> <a href="React.S.EqType.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><div class="info modtype top">
+Input signature of <a href="React.S.Make.html"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">Make</span></code></a><br>
+</div>
+<hr width="100%">
+
+<pre><span id="TYPEt"><span class="keyword">type</span> <code class="type">'a</code> t</span> </pre>
+
+
+<pre><span id="VALequal"><span class="keyword">val</span> equal</span> : <code class="type">'a <a href="React.S.EqType.html#TYPEt">t</a> -> 'a <a href="React.S.EqType.html#TYPEt">t</a> -> bool</code></pre></body></html> \ No newline at end of file
diff --git a/doc/React.S.Float.html b/doc/React.S.Float.html
new file mode 100644
index 0000000..af261f2
--- /dev/null
+++ b/doc/React.S.Float.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="previous" href="React.S.Int.html">
+<link rel="next" href="React.S.Pair.html">
+<link rel="Up" href="React.S.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Float</title>
+</head>
+<body>
+<div class="navbar"><a class="pre" href="React.S.Int.html" title="React.S.Int">Previous</a>
+&nbsp;<a class="up" href="React.S.html" title="React.S">Up</a>
+&nbsp;<a class="post" href="React.S.Pair.html" title="React.S.Pair">Next</a>
+</div>
+<h1>Module <a href="type_React.S.Float.html">React.S.Float</a></h1>
+
+<pre><span class="keyword">module</span> Float: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Float.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><hr width="100%">
+
+<pre><span id="VALzero"><span class="keyword">val</span> zero</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALone"><span class="keyword">val</span> one</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALminus_one"><span class="keyword">val</span> minus_one</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(~-.)"><span class="keyword">val</span> (~-.)</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(+.)"><span class="keyword">val</span> (+.)</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(-.)"><span class="keyword">val</span> (-.)</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL( *. )"><span class="keyword">val</span> ( *. )</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(/.)"><span class="keyword">val</span> (/.)</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL( ** )"><span class="keyword">val</span> ( ** )</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALsqrt"><span class="keyword">val</span> sqrt</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALexp"><span class="keyword">val</span> exp</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALlog"><span class="keyword">val</span> log</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALlog10"><span class="keyword">val</span> log10</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALcos"><span class="keyword">val</span> cos</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALsin"><span class="keyword">val</span> sin</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALtan"><span class="keyword">val</span> tan</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALacos"><span class="keyword">val</span> acos</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALasin"><span class="keyword">val</span> asin</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALatan"><span class="keyword">val</span> atan</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALatan2"><span class="keyword">val</span> atan2</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALcosh"><span class="keyword">val</span> cosh</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALsinh"><span class="keyword">val</span> sinh</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALtanh"><span class="keyword">val</span> tanh</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALceil"><span class="keyword">val</span> ceil</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfloor"><span class="keyword">val</span> floor</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALabs_float"><span class="keyword">val</span> abs_float</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALmod_float"><span class="keyword">val</span> mod_float</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfrexp"><span class="keyword">val</span> frexp</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> (float * int) <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALldexp"><span class="keyword">val</span> ldexp</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALmodf"><span class="keyword">val</span> modf</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> (float * float) <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfloat"><span class="keyword">val</span> float</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfloat_of_int"><span class="keyword">val</span> float_of_int</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALtruncate"><span class="keyword">val</span> truncate</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALint_of_float"><span class="keyword">val</span> int_of_float</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALinfinity"><span class="keyword">val</span> infinity</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALneg_infinity"><span class="keyword">val</span> neg_infinity</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALnan"><span class="keyword">val</span> nan</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALmax_float"><span class="keyword">val</span> max_float</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALmin_float"><span class="keyword">val</span> min_float</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALepsilon_float"><span class="keyword">val</span> epsilon_float</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALclassify_float"><span class="keyword">val</span> classify_float</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> Pervasives.fpclass <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
diff --git a/doc/React.S.Int.html b/doc/React.S.Int.html
new file mode 100644
index 0000000..a99e71a
--- /dev/null
+++ b/doc/React.S.Int.html
@@ -0,0 +1,44 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="previous" href="React.S.Bool.html">
+<link rel="next" href="React.S.Float.html">
+<link rel="Up" href="React.S.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Int</title>
+</head>
+<body>
+<div class="navbar"><a class="pre" href="React.S.Bool.html" title="React.S.Bool">Previous</a>
+&nbsp;<a class="up" href="React.S.html" title="React.S">Up</a>
+&nbsp;<a class="post" href="React.S.Float.html" title="React.S.Float">Next</a>
+</div>
+<h1>Module <a href="type_React.S.Int.html">React.S.Int</a></h1>
+
+<pre><span class="keyword">module</span> Int: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Int.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><hr width="100%">
+
+<pre><span id="VALzero"><span class="keyword">val</span> zero</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALone"><span class="keyword">val</span> one</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALminus_one"><span class="keyword">val</span> minus_one</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(~-)"><span class="keyword">val</span> (~-)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALsucc"><span class="keyword">val</span> succ</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALpred"><span class="keyword">val</span> pred</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(+)"><span class="keyword">val</span> (+)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(-)"><span class="keyword">val</span> (-)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL( * )"><span class="keyword">val</span> ( * )</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(mod)"><span class="keyword">val</span> (mod)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALabs"><span class="keyword">val</span> abs</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALmax_int"><span class="keyword">val</span> max_int</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALmin_int"><span class="keyword">val</span> min_int</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(land)"><span class="keyword">val</span> (land)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(lor)"><span class="keyword">val</span> (lor)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(lxor)"><span class="keyword">val</span> (lxor)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALlnot"><span class="keyword">val</span> lnot</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(lsl)"><span class="keyword">val</span> (lsl)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(lsr)"><span class="keyword">val</span> (lsr)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VAL(asr)"><span class="keyword">val</span> (asr)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
diff --git a/doc/React.S.Make.html b/doc/React.S.Make.html
new file mode 100644
index 0000000..a9a566c
--- /dev/null
+++ b/doc/React.S.Make.html
@@ -0,0 +1,65 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="previous" href="React.S.Compare.html">
+<link rel="next" href="React.S.Special.html">
+<link rel="Up" href="React.S.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Make</title>
+</head>
+<body>
+<div class="navbar"><a class="pre" href="React.S.Compare.html" title="React.S.Compare">Previous</a>
+&nbsp;<a class="up" href="React.S.html" title="React.S">Up</a>
+&nbsp;<a class="post" href="React.S.Special.html" title="React.S.Special">Next</a>
+</div>
+<h1>Functor <a href="type_React.S.Make.html">React.S.Make</a></h1>
+
+<pre><span class="keyword">module</span> Make: <div class="sig_block"><code class="code"><span class="keyword">functor</span> (</code><code class="code"><span class="constructor">Eq</span></code><code class="code"> : </code><code class="type"><a href="React.S.EqType.html">EqType</a></code><code class="code">) <span class="keywordsign">-&gt;</span> </code><code class="type"><a href="React.S.S.html">S</a></code><code class="type"> with type 'a v = 'a Eq.t</code></div></pre><div class="info module top">
+Functor specializing the combinators for the given signal value type<br>
+</div>
+<table border="0" cellpadding="3" width="100%">
+<tr>
+<td align="left" valign="top" width="1%%"><b>Parameters: </b></td>
+<td>
+<table class="paramstable">
+<tr>
+<td align="center" valign="top" width="15%">
+<code>Eq</code></td>
+<td align="center" valign="top">:</td>
+<td><code class="type"><a href="React.S.EqType.html">EqType</a></code>
+</table>
+</td>
+</tr>
+</table>
+<hr width="100%">
+
+<pre><span id="TYPEv"><span class="keyword">type</span> <code class="type">'a</code> v</span> </pre>
+
+
+<pre><span id="VALcreate"><span class="keyword">val</span> create</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * (?step:<a href="React.html#TYPEstep">React.step</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> -> unit)</code></pre>
+<pre><span id="VALequal"><span class="keyword">val</span> equal</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> bool</code></pre>
+<pre><span id="VALhold"><span class="keyword">val</span> hold</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALapp"><span class="keyword">val</span> app</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALmap"><span class="keyword">val</span> map</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfilter"><span class="keyword">val</span> filter</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> bool) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfmap"><span class="keyword">val</span> fmap</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a> option) -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALwhen_"><span class="keyword">val</span> when_</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALdismiss"><span class="keyword">val</span> dismiss</span> : <code class="type">'b <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALaccum"><span class="keyword">val</span> accum</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfold"><span class="keyword">val</span> fold</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALmerge"><span class="keyword">val</span> merge</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> list -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALswitch"><span class="keyword">val</span> switch</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALbind"><span class="keyword">val</span> bind</span> : <code class="type">'b <a href="React.html#TYPEsignal">React.signal</a> -><br> ('b -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a>) -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfix"><span class="keyword">val</span> fix</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> ('a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * 'b) -> 'b</code></pre>
+<pre><span id="VALl1"><span class="keyword">val</span> l1</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl2"><span class="keyword">val</span> l2</span> : <code class="type">('a -> 'b -> 'c <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl3"><span class="keyword">val</span> l3</span> : <code class="type">('a -> 'b -> 'c -> 'd <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl4"><span class="keyword">val</span> l4</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl5"><span class="keyword">val</span> l5</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl6"><span class="keyword">val</span> l6</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -><br> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a> -> 'g <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
diff --git a/doc/React.S.Option.html b/doc/React.S.Option.html
new file mode 100644
index 0000000..5523801
--- /dev/null
+++ b/doc/React.S.Option.html
@@ -0,0 +1,54 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="previous" href="React.S.Pair.html">
+<link rel="next" href="React.S.Compare.html">
+<link rel="Up" href="React.S.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Option</title>
+</head>
+<body>
+<div class="navbar"><a class="pre" href="React.S.Pair.html" title="React.S.Pair">Previous</a>
+&nbsp;<a class="up" href="React.S.html" title="React.S">Up</a>
+&nbsp;<a class="post" href="React.S.Compare.html" title="React.S.Compare">Next</a>
+</div>
+<h1>Module <a href="type_React.S.Option.html">React.S.Option</a></h1>
+
+<pre><span class="keyword">module</span> Option: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Option.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><hr width="100%">
+
+<pre><span id="VALnone"><span class="keyword">val</span> none</span> : <code class="type">'a option <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info ">
+<code class="code">none</code> is <code class="code"><span class="constructor">S</span>.const <span class="constructor">None</span></code>.<br>
+</div>
+
+<pre><span id="VALsome"><span class="keyword">val</span> some</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a option <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info ">
+<code class="code">some s</code> is <code class="code"><span class="constructor">S</span>.map ~eq (<span class="keyword">fun</span> v <span class="keywordsign">-&gt;</span> <span class="constructor">Some</span> v) <span class="constructor">None</span></code>, where <code class="code">eq</code> uses
+ <code class="code">s</code>'s equality function to test the <code class="code"><span class="constructor">Some</span> v</code>'s equalities.<br>
+</div>
+
+<pre><span id="VALvalue"><span class="keyword">val</span> value</span> : <code class="type">?eq:('a -> 'a -> bool) -><br> default:[ `Always of 'a <a href="React.html#TYPEsignal">React.signal</a> | `Init of 'a <a href="React.html#TYPEsignal">React.signal</a> ] -><br> 'a option <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info ">
+<code class="code">value default s</code> is <code class="code">s</code> with only its <code class="code"><span class="constructor">Some</span> v</code> values.
+ Whenever <code class="code">s</code> is <code class="code"><span class="constructor">None</span></code>, if <code class="code">default</code> is <code class="code"><span class="keywordsign">`</span><span class="constructor">Always</span> dv</code> then
+ the current value of <code class="code">dv</code> is used instead. If <code class="code">default</code>
+ is <code class="code"><span class="keywordsign">`</span><span class="constructor">Init</span> dv</code> the current value of <code class="code">dv</code> is only used
+ if there's no value at creation time, otherwise the last
+ <code class="code"><span class="constructor">Some</span> v</code> value of <code class="code">s</code> is used.
+ <ul>
+<li>[<code class="code">value ~default s</code>]<sub class="subscript">t</sub> <code class="code">= v</code> if [<code class="code">s</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code></li>
+<li>[<code class="code">value ~default:(<span class="keywordsign">`</span><span class="constructor">Always</span> d) s</code>]<sub class="subscript">t</sub> <code class="code">=</code> [<code class="code">d</code>]<sub class="subscript">t</sub>
+ if [<code class="code">s</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code></li>
+<li>[<code class="code">value ~default:(<span class="keywordsign">`</span><span class="constructor">Init</span> d) s</code>]<sub class="subscript">0</sub> <code class="code">=</code> [<code class="code">d</code>]<sub class="subscript">0</sub>
+ if [<code class="code">s</code>]<sub class="subscript">0</sub> <code class="code">= <span class="constructor">None</span></code></li>
+<li>[<code class="code">value ~default:(<span class="keywordsign">`</span><span class="constructor">Init</span> d) s</code>]<sub class="subscript">t</sub> <code class="code">=</code>
+ [<code class="code">value ~default:(<span class="keywordsign">`</span><span class="constructor">Init</span> d) s</code>]<sub class="subscript">t'</sub>
+ if [<code class="code">s</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> and t' is the greatest t' &lt; t
+ with [<code class="code">s</code>]<sub class="subscript">t'</sub> <code class="code">&lt;&gt; <span class="constructor">None</span></code> or 0 if there is no such <code class="code">t'</code>.</li>
+</ul>
+<br>
+</div>
+</body></html> \ No newline at end of file
diff --git a/doc/React.S.Pair.html b/doc/React.S.Pair.html
new file mode 100644
index 0000000..9dc96e0
--- /dev/null
+++ b/doc/React.S.Pair.html
@@ -0,0 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="previous" href="React.S.Float.html">
+<link rel="next" href="React.S.Option.html">
+<link rel="Up" href="React.S.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Pair</title>
+</head>
+<body>
+<div class="navbar"><a class="pre" href="React.S.Float.html" title="React.S.Float">Previous</a>
+&nbsp;<a class="up" href="React.S.html" title="React.S">Up</a>
+&nbsp;<a class="post" href="React.S.Option.html" title="React.S.Option">Next</a>
+</div>
+<h1>Module <a href="type_React.S.Pair.html">React.S.Pair</a></h1>
+
+<pre><span class="keyword">module</span> Pair: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Pair.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><hr width="100%">
+
+<pre><span id="VALpair"><span class="keyword">val</span> pair</span> : <code class="type">?eq:('a * 'b -> 'a * 'b -> bool) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> ('a * 'b) <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfst"><span class="keyword">val</span> fst</span> : <code class="type">?eq:('a -> 'a -> bool) -> ('a * 'b) <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALsnd"><span class="keyword">val</span> snd</span> : <code class="type">?eq:('a -> 'a -> bool) -> ('b * 'a) <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
diff --git a/doc/React.S.S.html b/doc/React.S.S.html
new file mode 100644
index 0000000..49b67d1
--- /dev/null
+++ b/doc/React.S.S.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="previous" href="React.S.EqType.html">
+<link rel="Up" href="React.S.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.S</title>
+</head>
+<body>
+<div class="navbar"><a class="pre" href="React.S.EqType.html" title="React.S.EqType">Previous</a>
+&nbsp;<a class="up" href="React.S.html" title="React.S">Up</a>
+&nbsp;</div>
+<h1>Module type <a href="type_React.S.S.html">React.S.S</a></h1>
+
+<pre><span class="keyword">module type</span> S = <code class="code"><span class="keyword">sig</span></code> <a href="React.S.S.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><div class="info modtype top">
+Output signature of <a href="React.S.Make.html"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">Make</span></code></a><br>
+</div>
+<hr width="100%">
+
+<pre><span id="TYPEv"><span class="keyword">type</span> <code class="type">'a</code> v</span> </pre>
+
+
+<pre><span id="VALcreate"><span class="keyword">val</span> create</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * (?step:<a href="React.html#TYPEstep">React.step</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> -> unit)</code></pre>
+<pre><span id="VALequal"><span class="keyword">val</span> equal</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> bool</code></pre>
+<pre><span id="VALhold"><span class="keyword">val</span> hold</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALapp"><span class="keyword">val</span> app</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALmap"><span class="keyword">val</span> map</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfilter"><span class="keyword">val</span> filter</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> bool) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfmap"><span class="keyword">val</span> fmap</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a> option) -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALwhen_"><span class="keyword">val</span> when_</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALdismiss"><span class="keyword">val</span> dismiss</span> : <code class="type">'b <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALaccum"><span class="keyword">val</span> accum</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfold"><span class="keyword">val</span> fold</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALmerge"><span class="keyword">val</span> merge</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> list -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALswitch"><span class="keyword">val</span> switch</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALbind"><span class="keyword">val</span> bind</span> : <code class="type">'b <a href="React.html#TYPEsignal">React.signal</a> -><br> ('b -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a>) -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfix"><span class="keyword">val</span> fix</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> ('a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * 'b) -> 'b</code></pre>
+<pre><span id="VALl1"><span class="keyword">val</span> l1</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl2"><span class="keyword">val</span> l2</span> : <code class="type">('a -> 'b -> 'c <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl3"><span class="keyword">val</span> l3</span> : <code class="type">('a -> 'b -> 'c -> 'd <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl4"><span class="keyword">val</span> l4</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl5"><span class="keyword">val</span> l5</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl6"><span class="keyword">val</span> l6</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -><br> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a> -> 'g <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
diff --git a/doc/React.S.Special.Sb.html b/doc/React.S.Special.Sb.html
new file mode 100644
index 0000000..20fc507
--- /dev/null
+++ b/doc/React.S.Special.Sb.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="next" href="React.S.Special.Si.html">
+<link rel="Up" href="React.S.Special.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Special.Sb</title>
+</head>
+<body>
+<div class="navbar">&nbsp;<a class="up" href="React.S.Special.html" title="React.S.Special">Up</a>
+&nbsp;<a class="post" href="React.S.Special.Si.html" title="React.S.Special.Si">Next</a>
+</div>
+<h1>Module <a href="type_React.S.Special.Sb.html">React.S.Special.Sb</a></h1>
+
+<pre><span class="keyword">module</span> Sb: <code class="type"><a href="React.S.S.html">React.S.S</a></code><code class="type"> with type 'a v = bool</code></pre><div class="info module top">
+Specialization for booleans.<br>
+</div>
+<hr width="100%">
+
+<pre><span id="TYPEv"><span class="keyword">type</span> <code class="type">'a</code> v</span> </pre>
+
+
+<pre><span id="VALcreate"><span class="keyword">val</span> create</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * (?step:<a href="React.html#TYPEstep">React.step</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> -> unit)</code></pre>
+<pre><span id="VALequal"><span class="keyword">val</span> equal</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> bool</code></pre>
+<pre><span id="VALhold"><span class="keyword">val</span> hold</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALapp"><span class="keyword">val</span> app</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALmap"><span class="keyword">val</span> map</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfilter"><span class="keyword">val</span> filter</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> bool) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfmap"><span class="keyword">val</span> fmap</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a> option) -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALwhen_"><span class="keyword">val</span> when_</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALdismiss"><span class="keyword">val</span> dismiss</span> : <code class="type">'b <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALaccum"><span class="keyword">val</span> accum</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfold"><span class="keyword">val</span> fold</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALmerge"><span class="keyword">val</span> merge</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> list -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALswitch"><span class="keyword">val</span> switch</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALbind"><span class="keyword">val</span> bind</span> : <code class="type">'b <a href="React.html#TYPEsignal">React.signal</a> -><br> ('b -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a>) -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfix"><span class="keyword">val</span> fix</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> ('a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * 'b) -> 'b</code></pre>
+<pre><span id="VALl1"><span class="keyword">val</span> l1</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl2"><span class="keyword">val</span> l2</span> : <code class="type">('a -> 'b -> 'c <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl3"><span class="keyword">val</span> l3</span> : <code class="type">('a -> 'b -> 'c -> 'd <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl4"><span class="keyword">val</span> l4</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl5"><span class="keyword">val</span> l5</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl6"><span class="keyword">val</span> l6</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -><br> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a> -> 'g <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
diff --git a/doc/React.S.Special.Sf.html b/doc/React.S.Special.Sf.html
new file mode 100644
index 0000000..9c68ab2
--- /dev/null
+++ b/doc/React.S.Special.Sf.html
@@ -0,0 +1,49 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="previous" href="React.S.Special.Si.html">
+<link rel="Up" href="React.S.Special.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Special.Sf</title>
+</head>
+<body>
+<div class="navbar"><a class="pre" href="React.S.Special.Si.html" title="React.S.Special.Si">Previous</a>
+&nbsp;<a class="up" href="React.S.Special.html" title="React.S.Special">Up</a>
+&nbsp;</div>
+<h1>Module <a href="type_React.S.Special.Sf.html">React.S.Special.Sf</a></h1>
+
+<pre><span class="keyword">module</span> Sf: <code class="type"><a href="React.S.S.html">React.S.S</a></code><code class="type"> with type 'a v = float</code></pre><div class="info module top">
+Specialization for floats.<br>
+</div>
+<hr width="100%">
+
+<pre><span id="TYPEv"><span class="keyword">type</span> <code class="type">'a</code> v</span> </pre>
+
+
+<pre><span id="VALcreate"><span class="keyword">val</span> create</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * (?step:<a href="React.html#TYPEstep">React.step</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> -> unit)</code></pre>
+<pre><span id="VALequal"><span class="keyword">val</span> equal</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> bool</code></pre>
+<pre><span id="VALhold"><span class="keyword">val</span> hold</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALapp"><span class="keyword">val</span> app</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALmap"><span class="keyword">val</span> map</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfilter"><span class="keyword">val</span> filter</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> bool) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfmap"><span class="keyword">val</span> fmap</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a> option) -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALwhen_"><span class="keyword">val</span> when_</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALdismiss"><span class="keyword">val</span> dismiss</span> : <code class="type">'b <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALaccum"><span class="keyword">val</span> accum</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfold"><span class="keyword">val</span> fold</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALmerge"><span class="keyword">val</span> merge</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> list -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALswitch"><span class="keyword">val</span> switch</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALbind"><span class="keyword">val</span> bind</span> : <code class="type">'b <a href="React.html#TYPEsignal">React.signal</a> -><br> ('b -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a>) -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfix"><span class="keyword">val</span> fix</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> ('a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * 'b) -> 'b</code></pre>
+<pre><span id="VALl1"><span class="keyword">val</span> l1</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl2"><span class="keyword">val</span> l2</span> : <code class="type">('a -> 'b -> 'c <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl3"><span class="keyword">val</span> l3</span> : <code class="type">('a -> 'b -> 'c -> 'd <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl4"><span class="keyword">val</span> l4</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl5"><span class="keyword">val</span> l5</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl6"><span class="keyword">val</span> l6</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -><br> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a> -> 'g <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
diff --git a/doc/React.S.Special.Si.html b/doc/React.S.Special.Si.html
new file mode 100644
index 0000000..f64228a
--- /dev/null
+++ b/doc/React.S.Special.Si.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="previous" href="React.S.Special.Sb.html">
+<link rel="next" href="React.S.Special.Sf.html">
+<link rel="Up" href="React.S.Special.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Special.Si</title>
+</head>
+<body>
+<div class="navbar"><a class="pre" href="React.S.Special.Sb.html" title="React.S.Special.Sb">Previous</a>
+&nbsp;<a class="up" href="React.S.Special.html" title="React.S.Special">Up</a>
+&nbsp;<a class="post" href="React.S.Special.Sf.html" title="React.S.Special.Sf">Next</a>
+</div>
+<h1>Module <a href="type_React.S.Special.Si.html">React.S.Special.Si</a></h1>
+
+<pre><span class="keyword">module</span> Si: <code class="type"><a href="React.S.S.html">React.S.S</a></code><code class="type"> with type 'a v = int</code></pre><div class="info module top">
+Specialization for integers.<br>
+</div>
+<hr width="100%">
+
+<pre><span id="TYPEv"><span class="keyword">type</span> <code class="type">'a</code> v</span> </pre>
+
+
+<pre><span id="VALcreate"><span class="keyword">val</span> create</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * (?step:<a href="React.html#TYPEstep">React.step</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> -> unit)</code></pre>
+<pre><span id="VALequal"><span class="keyword">val</span> equal</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> bool</code></pre>
+<pre><span id="VALhold"><span class="keyword">val</span> hold</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALapp"><span class="keyword">val</span> app</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALmap"><span class="keyword">val</span> map</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfilter"><span class="keyword">val</span> filter</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> bool) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfmap"><span class="keyword">val</span> fmap</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a> option) -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALwhen_"><span class="keyword">val</span> when_</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALdismiss"><span class="keyword">val</span> dismiss</span> : <code class="type">'b <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALaccum"><span class="keyword">val</span> accum</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfold"><span class="keyword">val</span> fold</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALmerge"><span class="keyword">val</span> merge</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> list -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALswitch"><span class="keyword">val</span> switch</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALbind"><span class="keyword">val</span> bind</span> : <code class="type">'b <a href="React.html#TYPEsignal">React.signal</a> -><br> ('b -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a>) -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALfix"><span class="keyword">val</span> fix</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> ('a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * 'b) -> 'b</code></pre>
+<pre><span id="VALl1"><span class="keyword">val</span> l1</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl2"><span class="keyword">val</span> l2</span> : <code class="type">('a -> 'b -> 'c <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl3"><span class="keyword">val</span> l3</span> : <code class="type">('a -> 'b -> 'c -> 'd <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl4"><span class="keyword">val</span> l4</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl5"><span class="keyword">val</span> l5</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl6"><span class="keyword">val</span> l6</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -><br> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a> -> 'g <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
diff --git a/doc/React.S.Special.html b/doc/React.S.Special.html
new file mode 100644
index 0000000..8479c22
--- /dev/null
+++ b/doc/React.S.Special.html
@@ -0,0 +1,40 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="previous" href="React.S.Make.html">
+<link rel="Up" href="React.S.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Special</title>
+</head>
+<body>
+<div class="navbar"><a class="pre" href="React.S.Make.html" title="React.S.Make">Previous</a>
+&nbsp;<a class="up" href="React.S.html" title="React.S">Up</a>
+&nbsp;</div>
+<h1>Module <a href="type_React.S.Special.html">React.S.Special</a></h1>
+
+<pre><span class="keyword">module</span> Special: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Special.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><div class="info module top">
+Specialization for booleans, integers and floats.
+<p>
+
+ Open this module to use it.<br>
+</div>
+<hr width="100%">
+
+<pre><span class="keyword">module</span> <a href="React.S.Special.Sb.html">Sb</a>: <code class="type"><a href="React.S.S.html">React.S.S</a></code><code class="type"> with type 'a v = bool</code></pre><div class="info">
+Specialization for booleans.
+</div>
+
+<pre><span class="keyword">module</span> <a href="React.S.Special.Si.html">Si</a>: <code class="type"><a href="React.S.S.html">React.S.S</a></code><code class="type"> with type 'a v = int</code></pre><div class="info">
+Specialization for integers.
+</div>
+
+<pre><span class="keyword">module</span> <a href="React.S.Special.Sf.html">Sf</a>: <code class="type"><a href="React.S.S.html">React.S.S</a></code><code class="type"> with type 'a v = float</code></pre><div class="info">
+Specialization for floats.
+</div>
+</body></html> \ No newline at end of file
diff --git a/doc/React.S.html b/doc/React.S.html
new file mode 100644
index 0000000..cad02a1
--- /dev/null
+++ b/doc/React.S.html
@@ -0,0 +1,347 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="previous" href="React.E.html">
+<link rel="next" href="React.Step.html">
+<link rel="Up" href="React.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><link title="Primitive and basics" rel="Section" href="#prim">
+<link title="From events" rel="Section" href="#1_Fromevents">
+<link title="Transforming and filtering" rel="Section" href="#tr">
+<link title="Accumulating" rel="Section" href="#acc">
+<link title="Combining" rel="Section" href="#combine">
+<link title="Lifting" rel="Section" href="#lifting">
+<link title="Combinator specialization" rel="Section" href="#special">
+<title>React.S</title>
+</head>
+<body>
+<div class="navbar"><a class="pre" href="React.E.html" title="React.E">Previous</a>
+&nbsp;<a class="up" href="React.html" title="React">Up</a>
+&nbsp;<a class="post" href="React.Step.html" title="React.Step">Next</a>
+</div>
+<h1>Module <a href="type_React.S.html">React.S</a></h1>
+
+<pre><span class="keyword">module</span> S: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><div class="info module top">
+Signal combinators.
+<p>
+
+ Consult their <a href="React.html#sigsem">semantics.</a><br>
+</div>
+<hr width="100%">
+<br>
+<h1 id="prim">Primitive and basics</h1><br>
+
+<pre><span id="TYPEt"><span class="keyword">type</span> <code class="type">'a</code> t</span> = <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a></code> </pre>
+<div class="info ">
+The type for signals of type <code class="code"><span class="keywordsign">'</span>a</code>.<br>
+</div>
+
+
+<pre><span id="VALconst"><span class="keyword">val</span> const</span> : <code class="type">'a -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info ">
+<code class="code">const v</code> is always <code class="code">v</code>, [<code class="code">const v</code>]<sub class="subscript">t</sub> <code class="code">= v</code>.<br>
+</div>
+
+<pre><span id="VALcreate"><span class="keyword">val</span> create</span> : <code class="type">?eq:('a -> 'a -> bool) -><br> 'a -> 'a <a href="React.html#TYPEsignal">React.signal</a> * (?step:<a href="React.html#TYPEstep">React.step</a> -> 'a -> unit)</code></pre><div class="info ">
+<code class="code">create i</code> is a primitive signal <code class="code">s</code> set to <code class="code">i</code> and a
+ <code class="code">set</code> function. The function <code class="code">set</code> is such that:
+ <ul>
+<li><code class="code">set v</code> sets the signal's value to <code class="code">v</code> at the time it is called and
+ triggers an <a href="React.html#steps">update step</a>.</li>
+<li><code class="code">set ~step v</code> sets the signal's value to <code class="code">v</code> at the time it is
+ called and updates it dependencies when <code class="code">step</code> is
+ <a href="React.Step.html#VALexecute">executed</a></li>
+<li><code class="code">set ~step v</code> raises <code class="code"><span class="constructor">Invalid_argument</span></code> if it was previously
+ called with a step and this step has not executed yet or if
+ the given <code class="code">step</code> was already executed.</li>
+</ul>
+
+ <b>Warning.</b> <code class="code">set</code> must not be executed inside an update step.<br>
+</div>
+
+<pre><span id="VALvalue"><span class="keyword">val</span> value</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a</code></pre><div class="info ">
+<code class="code">value s</code> is <code class="code">s</code>'s current value.
+<p>
+
+ <b>Warning.</b> If executed in an <a href="React.html#steps">update
+ step</a> may return a non up-to-date value or raise <code class="code"><span class="constructor">Failure</span></code> if
+ the signal is not yet initialized.<br>
+</div>
+
+<pre><span id="VALretain"><span class="keyword">val</span> retain</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> (unit -> unit) -> [ `R of unit -> unit ]</code></pre><div class="info ">
+<code class="code">retain s c</code> keeps a reference to the closure <code class="code">c</code> in <code class="code">s</code> and
+ returns the previously retained value. <code class="code">c</code> will <em>never</em> be
+ invoked.
+<p>
+
+ <b>Raises.</b> <code class="code"><span class="constructor">Invalid_argument</span></code> on constant signals.<br>
+</div>
+
+<pre><span id="VALstop"><span class="keyword">val</span> stop</span> : <code class="type">?strong:bool -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> unit</code></pre><div class="info ">
+<code class="code">stop s</code>, stops updating <code class="code">s</code>. It conceptually becomes <a href="React.S.html#VALconst"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.const</code></a>
+ with the signal's last value and cannot be restarted. Allows to
+ disable <a href="React.html#sideeffects">effectful</a> signals.
+<p>
+
+ The <code class="code">strong</code> argument should only be used on platforms
+ where weak arrays have a strong semantics (i.e. JavaScript).
+ See <a href="React.html#strongstop">details</a>.
+<p>
+
+ <b>Note.</b> If executed in an update step the signal may
+ still update in the step.<br>
+</div>
+
+<pre><span id="VALequal"><span class="keyword">val</span> equal</span> : <code class="type">?eq:('a -> 'a -> bool) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> bool</code></pre><div class="info ">
+<code class="code">equal s s'</code> is <code class="code"><span class="keyword">true</span></code> iff <code class="code">s</code> and <code class="code">s'</code> are equal. If both
+ signals are <a href="React.S.html#VALconst"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.const</code></a>ant <code class="code">eq</code> is used between their value
+ (defauts to structural equality). If both signals are not
+ <a href="React.S.html#VALconst"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.const</code></a>ant, physical equality is used.<br>
+</div>
+
+<pre><span id="VALtrace"><span class="keyword">val</span> trace</span> : <code class="type">?iff:bool <a href="React.S.html#TYPEt">t</a> -> ('a -> unit) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info ">
+<code class="code">trace iff tr s</code> is <code class="code">s</code> except <code class="code">tr</code> is invoked with <code class="code">s</code>'s
+ current value and on <code class="code">s</code> changes when <code class="code">iff</code> is <code class="code"><span class="keyword">true</span></code> (defaults
+ to <code class="code"><span class="constructor">S</span>.const <span class="keyword">true</span></code>). For all t where [<code class="code">s</code>]<sub class="subscript">t</sub> <code class="code">= v</code> and (t = 0
+ or ([<code class="code">s</code>]<sub class="subscript">t-dt</sub><code class="code">= v'</code> and <code class="code">eq v v' = <span class="keyword">false</span></code>)) and
+ [<code class="code">iff</code>]<sub class="subscript">t</sub> = <code class="code"><span class="keyword">true</span></code>, <code class="code">tr</code> is invoked with <code class="code">v</code>.<br>
+</div>
+<br>
+<h1 id="1_Fromevents">From events</h1><br>
+
+<pre><span id="VALhold"><span class="keyword">val</span> hold</span> : <code class="type">?eq:('a -> 'a -> bool) -> 'a -> 'a <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info ">
+<code class="code">hold i e</code> has the value of <code class="code">e</code>'s last occurrence or <code class="code">i</code> if there
+ wasn't any.
+ <ul>
+<li>[<code class="code">hold i e</code>]<sub class="subscript">t</sub> <code class="code">= i</code> if [<code class="code">e</code>]<sub class="subscript">&lt;=t</sub> <code class="code">= <span class="constructor">None</span></code></li>
+<li>[<code class="code">hold i e</code>]<sub class="subscript">t</sub> <code class="code">= v</code> if [<code class="code">e</code>]<sub class="subscript">&lt;=t</sub> <code class="code">= <span class="constructor">Some</span> v</code></li>
+</ul>
+<br>
+</div>
+<br>
+<h1 id="tr">Transforming and filtering</h1><br>
+
+<pre><span id="VALapp"><span class="keyword">val</span> app</span> : <code class="type">?eq:('b -> 'b -> bool) -><br> ('a -> 'b) <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info ">
+<code class="code">app sf s</code> holds the value of <code class="code">sf</code> applied
+ to the value of <code class="code">s</code>, [<code class="code">app sf s</code>]<sub class="subscript">t</sub>
+ <code class="code">=</code> [<code class="code">sf</code>]<sub class="subscript">t</sub> [<code class="code">s</code>]<sub class="subscript">t</sub>.<br>
+</div>
+
+<pre><span id="VALmap"><span class="keyword">val</span> map</span> : <code class="type">?eq:('b -> 'b -> bool) -> ('a -> 'b) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info ">
+<code class="code">map f s</code> is <code class="code">s</code> transformed by <code class="code">f</code>, [<code class="code">map f s</code>]<sub class="subscript">t</sub> = <code class="code">f</code> [<code class="code">s</code>]<sub class="subscript">t</sub>.<br>
+</div>
+
+<pre><span id="VALfilter"><span class="keyword">val</span> filter</span> : <code class="type">?eq:('a -> 'a -> bool) -><br> ('a -> bool) -> 'a -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info ">
+<code class="code">filter f i s</code> is <code class="code">s</code>'s values that satisfy <code class="code">p</code>. If a value does not
+ satisfy <code class="code">p</code> it holds the last value that was satisfied or <code class="code">i</code> if
+ there is none.
+ <ul>
+<li>[<code class="code">filter p s</code>]<sub class="subscript">t</sub> <code class="code">=</code> [<code class="code">s</code>]<sub class="subscript">t</sub> if <code class="code">p</code> [<code class="code">s</code>]<sub class="subscript">t</sub><code class="code"> = <span class="keyword">true</span></code>.</li>
+<li>[<code class="code">filter p s</code>]<sub class="subscript">t</sub> <code class="code">=</code> [<code class="code">s</code>]<sub class="subscript">t'</sub> if <code class="code">p</code> [<code class="code">s</code>]<sub class="subscript">t</sub><code class="code"> = <span class="keyword">false</span></code>
+ and t' is the greatest t' &lt; t with <code class="code">p</code> [<code class="code">s</code>]<sub class="subscript">t'</sub><code class="code"> = <span class="keyword">true</span></code>.</li>
+<li>[<code class="code">filter p e</code>]<sub class="subscript">t</sub> <code class="code">= i</code> otherwise.</li>
+</ul>
+<br>
+</div>
+
+<pre><span id="VALfmap"><span class="keyword">val</span> fmap</span> : <code class="type">?eq:('b -> 'b -> bool) -><br> ('a -> 'b option) -> 'b -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info ">
+<code class="code">fmap fm i s</code> is <code class="code">s</code> filtered and mapped by <code class="code">fm</code>.
+ <ul>
+<li>[<code class="code">fmap fm i s</code>]<sub class="subscript">t</sub> <code class="code">=</code> v if <code class="code">fm</code> [<code class="code">s</code>]<sub class="subscript">t</sub><code class="code"> = <span class="constructor">Some</span> v</code>.</li>
+<li>[<code class="code">fmap fm i s</code>]<sub class="subscript">t</sub> <code class="code">=</code> [<code class="code">fmap fm i s</code>]<sub class="subscript">t'</sub> if <code class="code">fm</code>
+ [<code class="code">s</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> and t' is the greatest t' &lt; t with <code class="code">fm</code>
+ [<code class="code">s</code>]<sub class="subscript">t'</sub> <code class="code">&lt;&gt; <span class="constructor">None</span></code>.</li>
+<li>[<code class="code">fmap fm i s</code>]<sub class="subscript">t</sub> <code class="code">= i</code> otherwise.</li>
+</ul>
+<br>
+</div>
+
+<pre><span id="VALdiff"><span class="keyword">val</span> diff</span> : <code class="type">('a -> 'a -> 'b) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">diff f s</code> is an event with occurrences whenever <code class="code">s</code> changes from
+ <code class="code">v'</code> to <code class="code">v</code> and <code class="code">eq v v'</code> is <code class="code"><span class="keyword">false</span></code> (<code class="code">eq</code> is the signal's equality
+ function). The value of the occurrence is <code class="code">f v v'</code>.
+ <ul>
+<li>[<code class="code">diff f s</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> d</code>
+ if [<code class="code">s</code>]<sub class="subscript">t</sub> <code class="code">= v</code> and [<code class="code">s</code>]<sub class="subscript">t-dt</sub> <code class="code">= v'</code> and <code class="code">eq v v' = <span class="keyword">false</span></code>
+ and <code class="code">f v v' = d</code>.</li>
+<li>[<code class="code">diff f s</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> otherwise.</li>
+</ul>
+<br>
+</div>
+
+<pre><span id="VALchanges"><span class="keyword">val</span> changes</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">changes s</code> is <code class="code">diff (<span class="keyword">fun</span> v _ <span class="keywordsign">-&gt;</span> v) s</code>.<br>
+</div>
+
+<pre><span id="VALsample"><span class="keyword">val</span> sample</span> : <code class="type">('b -> 'a -> 'c) -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info ">
+<code class="code">sample f e s</code> samples <code class="code">s</code> at <code class="code">e</code>'s occurrences.
+ <ul>
+<li>[<code class="code">sample f e s</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> (f ev sv)</code> if [<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> ev</code>
+ and [<code class="code">s</code>]<sub class="subscript">t</sub> <code class="code">= sv</code>.</li>
+<li>[<code class="code">sample e s</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> otherwise.</li>
+</ul>
+<br>
+</div>
+
+<pre><span id="VALon"><span class="keyword">val</span> on</span> : <code class="type">?eq:('a -> 'a -> bool) -><br> bool <a href="React.html#TYPEsignal">React.signal</a> -> 'a -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info ">
+<code class="code">on c i s</code> is the signal <code class="code">s</code> whenever <code class="code">c</code> is <code class="code"><span class="keyword">true</span></code>.
+ When <code class="code">c</code> is <code class="code"><span class="keyword">false</span></code> it holds the last value <code class="code">s</code> had when
+ <code class="code">c</code> was the last time <code class="code"><span class="keyword">true</span></code> or <code class="code">i</code> if it never was.
+ <ul>
+<li>[<code class="code">on c i s</code>]<sub class="subscript">t</sub> <code class="code">=</code> [<code class="code">s</code>]<sub class="subscript">t</sub> if [<code class="code">c</code>]<sub class="subscript">t</sub> <code class="code">= <span class="keyword">true</span></code></li>
+<li>[<code class="code">on c i s</code>]<sub class="subscript">t</sub> <code class="code">=</code> [<code class="code">s</code>]<sub class="subscript">t'</sub> if [<code class="code">c</code>]<sub class="subscript">t</sub> <code class="code">= <span class="keyword">false</span></code>
+ where t' is the greatest t' &lt; t with [<code class="code">c</code>]<sub class="subscript">t'</sub> <code class="code">= <span class="keyword">true</span></code>.</li>
+<li>[<code class="code">on c i s</code>]<sub class="subscript">t</sub> <code class="code">=</code> <code class="code">i</code> otherwise.</li>
+</ul>
+<br>
+</div>
+
+<pre><span id="VALwhen_"><span class="keyword">val</span> when_</span> : <code class="type">?eq:('a -> 'a -> bool) -><br> bool <a href="React.html#TYPEsignal">React.signal</a> -> 'a -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info ">
+<span class="warning">Deprecated.</span>Use <a href="React.S.html#VALon"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.on</code></a>.<br>
+</div>
+
+<pre><span id="VALdismiss"><span class="keyword">val</span> dismiss</span> : <code class="type">?eq:('a -> 'a -> bool) -><br> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info ">
+<code class="code">dismiss c i s</code> is the signal <code class="code">s</code> except changes when <code class="code">c</code> occurs
+ are ignored. If <code class="code">c</code> occurs initially <code class="code">i</code> is used.
+ <ul>
+<li>[<code class="code">dismiss c i s</code>]<sub class="subscript">t</sub> <code class="code">=</code> [<code class="code">s</code>]<sub class="subscript">t'</sub>
+ where t' is the greatest t' &lt;= t with [<code class="code">c</code>]<sub class="subscript">t'</sub> <code class="code">= <span class="constructor">None</span></code> and
+ [<code class="code">s</code>]<sub class="subscript">t'-dt</sub> <code class="code">&lt;&gt;</code> [<code class="code">s</code>]<sub class="subscript">t'</sub></li>
+<li>[<code class="code">dismiss_ c i s</code>]<sub class="subscript">0</sub> <code class="code">=</code> <code class="code">v</code> where <code class="code">v = i</code> if
+ [<code class="code">c</code>]<sub class="subscript">0</sub> <code class="code">= <span class="constructor">Some</span> _</code> and <code class="code">v =</code> [<code class="code">s</code>]<sub class="subscript">0</sub> otherwise.</li>
+</ul>
+<br>
+</div>
+<br>
+<h1 id="acc">Accumulating</h1><br>
+
+<pre><span id="VALaccum"><span class="keyword">val</span> accum</span> : <code class="type">?eq:('a -> 'a -> bool) -> ('a -> 'a) <a href="React.html#TYPEevent">React.event</a> -> 'a -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info ">
+<code class="code">accum e i</code> is <code class="code"><span class="constructor">S</span>.hold i (</code><a href="React.E.html#VALaccum"><code class="code"><span class="constructor">React</span>.<span class="constructor">E</span>.accum</code></a><code class="code"> e i)</code>.<br>
+</div>
+
+<pre><span id="VALfold"><span class="keyword">val</span> fold</span> : <code class="type">?eq:('a -> 'a -> bool) -><br> ('a -> 'b -> 'a) -> 'a -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info ">
+<code class="code">fold f i e</code> is <code class="code"><span class="constructor">S</span>.hold i (</code><a href="React.E.html#VALfold"><code class="code"><span class="constructor">React</span>.<span class="constructor">E</span>.fold</code></a><code class="code"> f i e)</code>.<br>
+</div>
+<br>
+<h1 id="combine">Combining</h1><br>
+
+<pre><span id="VALmerge"><span class="keyword">val</span> merge</span> : <code class="type">?eq:('a -> 'a -> bool) -><br> ('a -> 'b -> 'a) -> 'a -> 'b <a href="React.html#TYPEsignal">React.signal</a> list -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info ">
+<code class="code">merge f a sl</code> merges the value of every signal in <code class="code">sl</code>
+ using <code class="code">f</code> and the accumulator <code class="code">a</code>.
+<p>
+
+ [<code class="code">merge f a sl</code>]<sub class="subscript">t</sub>
+ <code class="code">= <span class="constructor">List</span>.fold_left f a (<span class="constructor">List</span>.map</code> []<sub class="subscript">t</sub><code class="code"> sl)</code>.<br>
+</div>
+
+<pre><span id="VALswitch"><span class="keyword">val</span> switch</span> : <code class="type">?eq:('a -> 'a -> bool) -> 'a <a href="React.html#TYPEsignal">React.signal</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info ">
+<code class="code">switch ss</code> is the inner signal of <code class="code">ss</code>.
+ <ul>
+<li>[<code class="code">switch ss</code>]<sub class="subscript">t</sub> <code class="code">=</code> [[<code class="code">ss</code>]<sub class="subscript">t</sub>]<sub class="subscript">t</sub>.</li>
+</ul>
+<br>
+</div>
+
+<pre><span id="VALbind"><span class="keyword">val</span> bind</span> : <code class="type">?eq:('b -> 'b -> bool) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> ('a -> 'b <a href="React.html#TYPEsignal">React.signal</a>) -> 'b <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info ">
+<code class="code">bind s sf</code> is <code class="code">switch (map ~eq:( == ) sf s)</code>.<br>
+</div>
+
+<pre><span id="VALfix"><span class="keyword">val</span> fix</span> : <code class="type">?eq:('a -> 'a -> bool) -><br> 'a -> ('a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> * 'b) -> 'b</code></pre><div class="info ">
+<code class="code">fix i sf</code> allow to refer to the value a signal had an
+ infinitesimal amount of time before.
+<p>
+
+ In <code class="code">fix sf</code>, <code class="code">sf</code> is called with a signal <code class="code">s</code> that represents
+ the signal returned by <code class="code">sf</code> delayed by an infinitesimal amount
+ time. If <code class="code">s', r = sf s</code> then <code class="code">r</code> is returned by <code class="code">fix</code> and <code class="code">s</code>
+ is such that :
+ <ul>
+<li>[<code class="code">s</code>]<sub class="subscript">t</sub> <code class="code">=</code> <code class="code">i</code> for t = 0. </li>
+<li>[<code class="code">s</code>]<sub class="subscript">t</sub> <code class="code">=</code> [<code class="code">s'</code>]<sub class="subscript">t-dt</sub> otherwise.</li>
+</ul>
+
+<p>
+
+ <code class="code">eq</code> is the equality used by <code class="code">s</code>.
+<p>
+
+ <b>Raises.</b> <code class="code"><span class="constructor">Invalid_argument</span></code> if <code class="code">s'</code> is directly a delayed signal (i.e.
+ a signal given to a fixing function).
+<p>
+
+ <b>Note.</b> Regarding values depending on the result <code class="code">r</code> of
+ <code class="code">s', r = sf s</code> the following two cases need to be distinguished :
+ <ul>
+<li>After <code class="code">sf s</code> is applied, <code class="code">s'</code> does not depend on
+ a value that is in a step and <code class="code">s</code> has no dependents in a step (e.g
+ in the simple case where <code class="code">fix</code> is applied outside a step).
+<p>
+
+ In that case if the initial value of <code class="code">s'</code> differs from <code class="code">i</code>,
+ <code class="code">s</code> and its dependents need to be updated and a special
+ update step will be triggered for this. Values
+ depending on the result <code class="code">r</code> will be created only after this
+ special update step has finished (e.g. they won't see
+ the <code class="code">i</code> of <code class="code">s</code> if <code class="code">r = s</code>).</li>
+<li>Otherwise, values depending on <code class="code">r</code> will be created in the same
+ step as <code class="code">s</code> and <code class="code">s'</code> (e.g. they will see the <code class="code">i</code> of <code class="code">s</code> if <code class="code">r = s</code>).</li>
+</ul>
+<br>
+</div>
+<br>
+<h1 id="lifting">Lifting</h1>
+<p>
+
+ Lifting combinators. For a given <code class="code">n</code> the semantics is :
+<p>
+
+ [<code class="code">ln f a1</code> ... <code class="code">an</code>]<sub class="subscript">t</sub> = f [<code class="code">a1</code>]<sub class="subscript">t</sub> ... [<code class="code">an</code>]<sub class="subscript">t</sub><br>
+
+<pre><span id="VALl1"><span class="keyword">val</span> l1</span> : <code class="type">?eq:('b -> 'b -> bool) -> ('a -> 'b) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl2"><span class="keyword">val</span> l2</span> : <code class="type">?eq:('c -> 'c -> bool) -><br> ('a -> 'b -> 'c) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl3"><span class="keyword">val</span> l3</span> : <code class="type">?eq:('d -> 'd -> bool) -><br> ('a -> 'b -> 'c -> 'd) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl4"><span class="keyword">val</span> l4</span> : <code class="type">?eq:('e -> 'e -> bool) -><br> ('a -> 'b -> 'c -> 'd -> 'e) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl5"><span class="keyword">val</span> l5</span> : <code class="type">?eq:('f -> 'f -> bool) -><br> ('a -> 'b -> 'c -> 'd -> 'e -> 'f) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a></code></pre>
+<pre><span id="VALl6"><span class="keyword">val</span> l6</span> : <code class="type">?eq:('g -> 'g -> bool) -><br> ('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a> -> 'g <a href="React.html#TYPEsignal">React.signal</a></code></pre><br>
+The following modules lift some of <code class="code"><span class="constructor">Pervasives</span></code> functions and
+ operators.<br>
+
+<pre><span class="keyword">module</span> <a href="React.S.Bool.html">Bool</a>: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Bool.html">..</a> <code class="code"><span class="keyword">end</span></code></pre>
+<pre><span class="keyword">module</span> <a href="React.S.Int.html">Int</a>: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Int.html">..</a> <code class="code"><span class="keyword">end</span></code></pre>
+<pre><span class="keyword">module</span> <a href="React.S.Float.html">Float</a>: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Float.html">..</a> <code class="code"><span class="keyword">end</span></code></pre>
+<pre><span class="keyword">module</span> <a href="React.S.Pair.html">Pair</a>: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Pair.html">..</a> <code class="code"><span class="keyword">end</span></code></pre>
+<pre><span class="keyword">module</span> <a href="React.S.Option.html">Option</a>: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Option.html">..</a> <code class="code"><span class="keyword">end</span></code></pre>
+<pre><span class="keyword">module</span> <a href="React.S.Compare.html">Compare</a>: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Compare.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><br>
+<h1 id="special">Combinator specialization</h1>
+<p>
+
+ Given an equality function <code class="code">equal</code> and a type <code class="code">t</code>, the functor
+ <a href="React.S.Make.html"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">Make</span></code></a> automatically applies the <code class="code">eq</code> parameter of the combinators.
+ The outcome is combinators whose <em>results</em> are signals with
+ values in <code class="code">t</code>.
+<p>
+
+ Basic types are already specialized in the module <a href="React.S.Special.html"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">Special</span></code></a>, open
+ this module to use them.<br>
+
+<pre><span class="keyword">module type</span> <a href="React.S.EqType.html">EqType</a> = <code class="code"><span class="keyword">sig</span></code> <a href="React.S.EqType.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><div class="info">
+Input signature of <a href="React.S.Make.html"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">Make</span></code></a>
+</div>
+
+<pre><span class="keyword">module type</span> <a href="React.S.S.html">S</a> = <code class="code"><span class="keyword">sig</span></code> <a href="React.S.S.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><div class="info">
+Output signature of <a href="React.S.Make.html"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">Make</span></code></a>
+</div>
+
+<pre><span class="keyword">module</span> <a href="React.S.Make.html">Make</a>: <div class="sig_block"><code class="code"><span class="keyword">functor</span> (</code><code class="code"><span class="constructor">Eq</span></code><code class="code"> : </code><code class="type"><a href="React.S.EqType.html">EqType</a></code><code class="code">) <span class="keywordsign">-&gt;</span> </code><code class="type"><a href="React.S.S.html">S</a></code><code class="type"> with type 'a v = 'a Eq.t</code></div></pre><div class="info">
+Functor specializing the combinators for the given signal value type
+</div>
+
+<pre><span class="keyword">module</span> <a href="React.S.Special.html">Special</a>: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Special.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><div class="info">
+Specialization for booleans, integers and floats.
+</div>
+</body></html> \ No newline at end of file
diff --git a/doc/React.Step.html b/doc/React.Step.html
new file mode 100644
index 0000000..c52b573
--- /dev/null
+++ b/doc/React.Step.html
@@ -0,0 +1,55 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="previous" href="React.S.html">
+<link rel="Up" href="React.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><link title="Steps" rel="Section" href="#1_Steps">
+<title>React.Step</title>
+</head>
+<body>
+<div class="navbar"><a class="pre" href="React.S.html" title="React.S">Previous</a>
+&nbsp;<a class="up" href="React.html" title="React">Up</a>
+&nbsp;</div>
+<h1>Module <a href="type_React.Step.html">React.Step</a></h1>
+
+<pre><span class="keyword">module</span> Step: <code class="code"><span class="keyword">sig</span></code> <a href="React.Step.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><div class="info module top">
+Update steps.
+<p>
+
+ Update functions returned by <a href="React.S.html#VALcreate"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.create</code></a> and <a href="React.E.html#VALcreate"><code class="code"><span class="constructor">React</span>.<span class="constructor">E</span>.create</code></a>
+ implicitely create and execute update steps when used without
+ specifying their <code class="code">step</code> argument.
+<p>
+
+ Using explicit <a href="React.html#TYPEstep"><code class="code"><span class="constructor">React</span>.step</code></a> values with these functions gives more control on
+ the time when the update step is perfomed and allows to perform
+ simultaneous <a href="React.html#primitives">primitive</a> signal updates and event
+ occurences. See also the documentation about <a href="React.html#steps">update steps</a> and
+ <a href="React.html#simultaneity">simultaneous events</a>.<br>
+</div>
+<hr width="100%">
+<br>
+<h1 id="1_Steps">Steps</h1><br>
+
+<pre><span id="TYPEt"><span class="keyword">type</span> <code class="type"></code>t</span> = <code class="type"><a href="React.html#TYPEstep">React.step</a></code> </pre>
+<div class="info ">
+The type for update steps.<br>
+</div>
+
+
+<pre><span id="VALcreate"><span class="keyword">val</span> create</span> : <code class="type">unit -> <a href="React.html#TYPEstep">React.step</a></code></pre><div class="info ">
+<code class="code">create ()</code> is a new update step.<br>
+</div>
+
+<pre><span id="VALexecute"><span class="keyword">val</span> execute</span> : <code class="type"><a href="React.html#TYPEstep">React.step</a> -> unit</code></pre><div class="info ">
+<code class="code">execute step</code> executes the update step.<br>
+<b>Raises</b> <code>Invalid_argument</code> if <code class="code">step</code> was already executed.<br>
+</div>
+</body></html> \ No newline at end of file
diff --git a/doc/React.html b/doc/React.html
new file mode 100644
index 0000000..7a93bca
--- /dev/null
+++ b/doc/React.html
@@ -0,0 +1,469 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link rel="Up" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><link title="Interface" rel="Section" href="#1_Interface">
+<link title="Semantics" rel="Section" href="#sem">
+<link title="Basics" rel="Section" href="#basics">
+<link title="Examples" rel="Section" href="#ex">
+<link title="Events" rel="Subsection" href="#evsem">
+<link title="Signals" rel="Subsection" href="#sigsem">
+<link title="Primitive events and signals" rel="Subsection" href="#primitives">
+<link title="Update steps" rel="Subsection" href="#steps">
+<link title="Simultaneous events" rel="Subsection" href="#simultaneity">
+<link title="The update step and thread safety" rel="Subsection" href="#update">
+<link title="Side effects" rel="Subsection" href="#sideeffects">
+<link title="Lifting" rel="Subsection" href="#lifting">
+<link title="Mutual and self reference" rel="Subsection" href="#recursion">
+<link title="Strong stops" rel="Subsection" href="#strongstop">
+<link title="Clock" rel="Subsection" href="#clock">
+<title>React</title>
+</head>
+<body>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
+&nbsp;</div>
+<h1>Module <a href="type_React.html">React</a></h1>
+
+<pre><span class="keyword">module</span> React: <code class="code"><span class="keyword">sig</span></code> <a href="React.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><div class="info module top">
+Declarative events and signals.
+<p>
+
+ React is a module for functional reactive programming (frp). It
+ provides support to program with time varying values : declarative
+ <a href="React.E.html">events</a> and <a href="React.S.html">signals</a>. React
+ doesn't define any primitive event or signal, this lets the client
+ choose the concrete timeline.
+<p>
+
+ Consult the <a href="React.html#sem">semantics</a>, the <a href="React.html#basics">basics</a> and
+ <a href="React.html#ex">examples</a>. Open the module to use it, this defines only two
+ types and modules in your scope.
+<p>
+
+ <em>Release 1.2.0 - Daniel Bünzli &lt;daniel.buenzl i@erratique.ch&gt; </em><br>
+</div>
+<hr width="100%">
+<br>
+<h1 id="1_Interface">Interface</h1><br>
+
+<pre><span id="TYPEevent"><span class="keyword">type</span> <code class="type">'a</code> event</span> </pre>
+<div class="info ">
+The type for events of type <code class="code"><span class="keywordsign">'</span>a</code>.<br>
+</div>
+
+
+<pre><span id="TYPEsignal"><span class="keyword">type</span> <code class="type">'a</code> signal</span> </pre>
+<div class="info ">
+The type for signals of type <code class="code"><span class="keywordsign">'</span>a</code>.<br>
+</div>
+
+
+<pre><span id="TYPEstep"><span class="keyword">type</span> <code class="type"></code>step</span> </pre>
+<div class="info ">
+The type for update steps.<br>
+</div>
+
+
+<pre><span class="keyword">module</span> <a href="React.E.html">E</a>: <code class="code"><span class="keyword">sig</span></code> <a href="React.E.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><div class="info">
+Event combinators.
+</div>
+
+<pre><span class="keyword">module</span> <a href="React.S.html">S</a>: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><div class="info">
+Signal combinators.
+</div>
+
+<pre><span class="keyword">module</span> <a href="React.Step.html">Step</a>: <code class="code"><span class="keyword">sig</span></code> <a href="React.Step.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><div class="info">
+Update steps.
+</div>
+<br>
+<h1 id="sem">Semantics</h1>
+<p>
+
+ The following notations are used to give precise meaning to the
+ combinators. It is important to note that in these semantic
+ descriptions the origin of time t = 0 is <em>always</em> fixed at
+ the time at which the combinator creates the event or the signal and
+ the semantics of the dependents is evaluated relative to this timeline.
+<p>
+
+ We use dt to denote an infinitesimal amount of time.
+ <h2 id="evsem">Events</h2>
+<p>
+
+ An event is a value with discrete occurrences over time.
+<p>
+
+ The semantic function [] <code class="code">: <span class="keywordsign">'</span>a event <span class="keywordsign">-&gt;</span> time <span class="keywordsign">-&gt;</span> <span class="keywordsign">'</span>a option</code> gives
+ meaning to an event <code class="code">e</code> by mapping it to a function of time
+ [<code class="code">e</code>] returning <code class="code"><span class="constructor">Some</span> v</code> whenever the event occurs with value
+ <code class="code">v</code> and <code class="code"><span class="constructor">None</span></code> otherwise. We write [<code class="code">e</code>]<sub class="subscript">t</sub> the evaluation of
+ this <em>semantic</em> function at time t.
+<p>
+
+ As a shortcut notation we also define []<sub class="subscript">&lt;t</sub> <code class="code">: <span class="keywordsign">'</span>a event <span class="keywordsign">-&gt;</span> <span class="keywordsign">'</span>a option</code>
+ (resp. []<sub class="subscript">&lt;=t</sub>) to denote the last occurrence, if any, of an
+ event before (resp. before or at) <code class="code">t</code>. More precisely :
+ <ul>
+<li>[<code class="code">e</code>]<sub class="subscript">&lt;t</sub> <code class="code">=</code> [<code class="code">e</code>]<sub class="subscript">t'</sub> with t' the greatest t' &lt; t
+ (resp. <code class="code">&lt;=</code>) such that
+ [<code class="code">e</code>]<sub class="subscript">t'</sub> <code class="code">&lt;&gt; <span class="constructor">None</span></code>.</li>
+<li>[<code class="code">e</code>]<sub class="subscript">&lt;t</sub> <code class="code">= <span class="constructor">None</span></code> if there is no such t'.</li>
+</ul>
+
+<p>
+
+ <h2 id="sigsem">Signals</h2>
+<p>
+
+ A signal is a value that varies continuously over time. In
+ contrast to <a href="React.html#evsem">events</a> which occur at specific point
+ in time, a signal has a value at every point in time.
+<p>
+
+ The semantic function [] <code class="code">: <span class="keywordsign">'</span>a signal <span class="keywordsign">-&gt;</span> time <span class="keywordsign">-&gt;</span> <span class="keywordsign">'</span>a</code> gives
+ meaning to a signal <code class="code">s</code> by mapping it to a function of time
+ [<code class="code">s</code>] that returns its value at a given time. We write [<code class="code">s</code>]<sub class="subscript">t</sub>
+ the evaluation of this <em>semantic</em> function at time t.
+ <h3 id="sigeq">Equality</h3>
+<p>
+
+ Most signal combinators have an optional <code class="code">eq</code> parameter that
+ defaults to structural equality. <code class="code">eq</code> specifies the equality
+ function used to detect changes in the value of the resulting
+ signal. This function is needed for the efficient update of
+ signals and to deal correctly with signals that perform
+ <a href="React.html#sideeffects">side effects</a>.
+<p>
+
+ Given an equality function on a type the combinators can be automatically
+ <a href="React.S.html#special">specialized</a> via a functor.
+<p>
+
+ <h3 id="sigcont">Continuity</h3>
+<p>
+
+ Ultimately signal updates depend on
+ <a href="React.html#primitives">primitives</a> updates. Thus a signal can
+ only approximate a real continuous signal. The accuracy of the
+ approximation depends on the variation rate of the real signal and
+ the primitive's update frequency.
+<p>
+
+ <h1 id="basics">Basics</h1>
+<p>
+
+ <h2 id="primitives">Primitive events and signals</h2>
+<p>
+
+ React doesn't define primitive events and signals, they must be
+ created and updated by the client.
+<p>
+
+ Primitive events are created with <a href="React.E.html#VALcreate"><code class="code"><span class="constructor">React</span>.<span class="constructor">E</span>.create</code></a>. This function
+ returns a new event and an update function that generates an
+ occurrence for the event at the time it is called. The following
+ code creates a primitive integer event <code class="code">x</code> and generates three
+ occurrences with value <code class="code">1</code>, <code class="code">2</code>, <code class="code">3</code>. Those occurrences are printed
+ on stdout by the effectful event <code class="code">pr_x</code>. <pre class="codepre"><code class="code"><span class="keyword">open</span>&nbsp;<span class="constructor">React</span>;;<br>
+<br>
+<span class="keyword">let</span>&nbsp;x,&nbsp;send_x&nbsp;=&nbsp;<span class="constructor">E</span>.create&nbsp;()<br>
+<span class="keyword">let</span>&nbsp;pr_x&nbsp;=&nbsp;<span class="constructor">E</span>.map&nbsp;print_int&nbsp;x<br>
+<span class="keyword">let</span>&nbsp;()&nbsp;=&nbsp;<span class="constructor">List</span>.iter&nbsp;send_x&nbsp;[1;&nbsp;2;&nbsp;3]</code></pre>
+ Primitive signals are created with <a href="React.S.html#VALcreate"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.create</code></a>. This function
+ returns a new signal and an update function that sets the signal's value
+ at the time it is called. The following code creates an
+ integer signal <code class="code">x</code> initially set to <code class="code">1</code> and updates it three time with
+ values <code class="code">2</code>, <code class="code">2</code>, <code class="code">3</code>. The signal's values are printed on stdout by the
+ effectful signal <code class="code">pr_x</code>. Note that only updates that change
+ the signal's value are printed, hence the program prints <code class="code">123</code>, not <code class="code">1223</code>.
+ See the discussion on
+ <a href="React.html#sideeffects">side effects</a> for more details.
+<p>
+
+<pre class="codepre"><code class="code"><span class="keyword">open</span>&nbsp;<span class="constructor">React</span>;;<br>
+<br>
+<span class="keyword">let</span>&nbsp;x,&nbsp;set_x&nbsp;=&nbsp;<span class="constructor">S</span>.create&nbsp;1<br>
+<span class="keyword">let</span>&nbsp;pr_x&nbsp;=&nbsp;<span class="constructor">S</span>.map&nbsp;print_int&nbsp;x<br>
+<span class="keyword">let</span>&nbsp;()&nbsp;=&nbsp;<span class="constructor">List</span>.iter&nbsp;set_x&nbsp;[2;&nbsp;2;&nbsp;3]</code></pre>
+ The <a href="React.html#clock">clock</a> example shows how a realtime time
+ flow can be defined.
+<p>
+
+ <h2 id="steps">Update steps</h2>
+<p>
+
+ The <a href="React.E.html#VALcreate"><code class="code"><span class="constructor">React</span>.<span class="constructor">E</span>.create</code></a> and <a href="React.S.html#VALcreate"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.create</code></a> functions return update functions
+ used to generate primitive event occurences and set the value of
+ primitive signals. Upon invocation as in the preceding section
+ these functions immediatly create and invoke an update step.
+ The <em>update step</em> automatically updates events and signals that
+ transitively depend on the updated primitive. The dependents of a
+ signal are updated iff the signal's value changed according to its
+ <a href="React.html#sigeq">equality function</a>.
+<p>
+
+ The update functions have an optional <code class="code">step</code> argument. If they are
+ given a concrete <code class="code">step</code> value created with <a href="React.Step.html#VALcreate"><code class="code"><span class="constructor">React</span>.<span class="constructor">Step</span>.create</code></a>, then it
+ updates the event or signal but doesn't update its dependencies. It
+ will only do so whenever <code class="code">step</code> is executed with
+ <a href="React.Step.html#VALexecute"><code class="code"><span class="constructor">React</span>.<span class="constructor">Step</span>.execute</code></a>. This allows to make primitive event occurences and
+ signal changes simultaneous. See next section for an example.
+<p>
+
+ <h2 id="simultaneity">Simultaneous events</h2>
+<p>
+
+ <a href="React.html#steps">Update steps</a> are made under a
+ <a href="http://dx.doi.org/10.1016/0167-6423(92)90005-V">synchrony hypothesis</a> :
+ the update step takes no time, it is instantenous. Two event occurrences
+ are <em>simultaneous</em> if they occur in the same update step.
+<p>
+
+ In the code below <code class="code">w</code>, <code class="code">x</code> and <code class="code">y</code> will always have simultaneous
+ occurrences. They <em>may</em> have simulatenous occurences with <code class="code">z</code>
+ if <code class="code">send_w</code> and <code class="code">send_z</code> are used with the same update step.
+<p>
+
+<pre class="codepre"><code class="code"><span class="keyword">let</span>&nbsp;w,&nbsp;send_w&nbsp;=&nbsp;<span class="constructor">E</span>.create&nbsp;()<br>
+<span class="keyword">let</span>&nbsp;x&nbsp;=&nbsp;<span class="constructor">E</span>.map&nbsp;succ&nbsp;w<br>
+<span class="keyword">let</span>&nbsp;y&nbsp;=&nbsp;<span class="constructor">E</span>.map&nbsp;succ&nbsp;x<br>
+<span class="keyword">let</span>&nbsp;z,&nbsp;send_z&nbsp;=&nbsp;<span class="constructor">E</span>.create&nbsp;()<br>
+<br>
+<span class="keyword">let</span>&nbsp;()&nbsp;=<br>
+&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;()&nbsp;=&nbsp;send_w&nbsp;3&nbsp;<span class="comment">(*&nbsp;w&nbsp;x&nbsp;y&nbsp;occur&nbsp;simultaneously,&nbsp;z&nbsp;doesn't&nbsp;occur&nbsp;*)</span>&nbsp;<span class="keyword">in</span><br>
+&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;step&nbsp;=&nbsp;<span class="constructor">Step</span>.create&nbsp;()&nbsp;<span class="keyword">in</span><br>
+&nbsp;&nbsp;send_w&nbsp;~step&nbsp;3;<br>
+&nbsp;&nbsp;send_z&nbsp;~step&nbsp;4;<br>
+&nbsp;&nbsp;<span class="constructor">Step</span>.execute&nbsp;step&nbsp;<span class="comment">(*&nbsp;w&nbsp;x&nbsp;z&nbsp;y&nbsp;occur&nbsp;simultaneously&nbsp;*)</span><br>
+</code></pre>
+<p>
+
+ <h2 id="update">The update step and thread safety</h2>
+<p>
+
+ <a href="React.html#primitives">Primitives</a> are the only mean to drive the reactive
+ system and they are entirely under the control of the client. When
+ the client invokes a primitive's update function without the
+ <code class="code">step</code> argument or when it invokes <a href="React.Step.html#VALexecute"><code class="code"><span class="constructor">React</span>.<span class="constructor">Step</span>.execute</code></a> on a <code class="code">step</code>
+ value, React performs an update step.
+<p>
+
+ To ensure correctness in the presence of threads, update steps
+ must be executed in a critical section. Let uset(<code class="code">p</code>) be the set
+ of events and signals that need to be updated whenever the
+ primitive <code class="code">p</code> is updated. Updating two primitives <code class="code">p</code> and <code class="code">p'</code>
+ concurrently is only allowed if uset(<code class="code">p</code>) and uset(<code class="code">p'</code>) are
+ disjoint. Otherwise the updates must be properly serialized.
+<p>
+
+ Below, concurrent, updates to <code class="code">x</code> and <code class="code">y</code> must be serialized (or
+ performed on the same step if it makes sense semantically), but z
+ can be updated concurently to both <code class="code">x</code> and <code class="code">y</code>.
+<p>
+
+<pre class="codepre"><code class="code"><span class="keyword">open</span>&nbsp;<span class="constructor">React</span>;;<br>
+<br>
+<span class="keyword">let</span>&nbsp;x,&nbsp;set_x&nbsp;=&nbsp;<span class="constructor">S</span>.create&nbsp;0<br>
+<span class="keyword">let</span>&nbsp;y,&nbsp;send_y&nbsp;=&nbsp;<span class="constructor">E</span>.create&nbsp;()<br>
+<span class="keyword">let</span>&nbsp;z,&nbsp;set_z&nbsp;=&nbsp;<span class="constructor">S</span>.create&nbsp;0<br>
+<span class="keyword">let</span>&nbsp;max_xy&nbsp;=&nbsp;<span class="constructor">S</span>.l2&nbsp;(<span class="keyword">fun</span>&nbsp;x&nbsp;y&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keyword">if</span>&nbsp;x&nbsp;&gt;&nbsp;y&nbsp;<span class="keyword">then</span>&nbsp;x&nbsp;<span class="keyword">else</span>&nbsp;y)&nbsp;x&nbsp;(<span class="constructor">S</span>.hold&nbsp;0&nbsp;y)<br>
+<span class="keyword">let</span>&nbsp;succ_z&nbsp;=&nbsp;<span class="constructor">S</span>.map&nbsp;succ&nbsp;z</code></pre>
+<p>
+
+ <h2 id="sideeffects">Side effects</h2>
+<p>
+
+ Effectful events and signals perform their side effect
+ exactly <em>once</em> in each <a href="React.html#steps">update step</a> in which there
+ is an update of at least one of the event or signal it depends on.
+<p>
+
+ Remember that a signal updates in a step iff its
+ <a href="React.html#sigeq">equality function</a> determined that the signal
+ value changed. Signal initialization is unconditionally considered as
+ an update.
+<p>
+
+ It is important to keep references on effectful events and
+ signals. Otherwise they may be reclaimed by the garbage collector.
+ The following program prints only a <code class="code">1</code>.
+<pre class="codepre"><code class="code"><span class="keyword">let</span>&nbsp;x,&nbsp;set_x&nbsp;=&nbsp;<span class="constructor">S</span>.create&nbsp;1<br>
+<span class="keyword">let</span>&nbsp;()&nbsp;=&nbsp;ignore&nbsp;(<span class="constructor">S</span>.map&nbsp;print_int&nbsp;x)<br>
+<span class="keyword">let</span>&nbsp;()&nbsp;=&nbsp;<span class="constructor">Gc</span>.full_major&nbsp;();&nbsp;<span class="constructor">List</span>.iter&nbsp;set_x&nbsp;[2;&nbsp;2;&nbsp;3]</code></pre>
+ <h2 id="lifting">Lifting</h2>
+<p>
+
+ Lifting transforms a regular function to make it act on signals.
+ The combinators
+ <a href="React.S.html#VALconst"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.const</code></a> and <a href="React.S.html#VALapp"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.app</code></a> allow to lift functions of arbitrary arity n,
+ but this involves the inefficient creation of n-1 intermediary
+ closure signals. The fixed arity <a href="React.S.html#lifting">lifting
+ functions</a> are more efficient. For example :
+<pre class="codepre"><code class="code"><span class="keyword">let</span>&nbsp;f&nbsp;x&nbsp;y&nbsp;=&nbsp;x&nbsp;<span class="keyword">mod</span>&nbsp;y<br>
+<span class="keyword">let</span>&nbsp;fl&nbsp;x&nbsp;y&nbsp;=&nbsp;<span class="constructor">S</span>.app&nbsp;(<span class="constructor">S</span>.app&nbsp;~eq:(==)&nbsp;(<span class="constructor">S</span>.const&nbsp;f)&nbsp;x)&nbsp;y&nbsp;<span class="comment">(*&nbsp;inefficient&nbsp;*)</span><br>
+<span class="keyword">let</span>&nbsp;fl'&nbsp;x&nbsp;y&nbsp;=&nbsp;<span class="constructor">S</span>.l2&nbsp;f&nbsp;x&nbsp;y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;efficient&nbsp;*)</span><br>
+</code></pre>
+ Besides, some of <code class="code"><span class="constructor">Pervasives</span></code>'s functions and operators are
+ already lifted and availables in submodules of <a href="React.S.html"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span></code></a>. They can be
+ be opened in specific scopes. For example if you are dealing with
+ float signals you can open <a href="React.S.Float.html"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">Float</span></code></a>.
+<pre class="codepre"><code class="code"><span class="keyword">open</span>&nbsp;<span class="constructor">React</span><br>
+<span class="keyword">open</span>&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">Float</span><br>
+<br>
+<span class="keyword">let</span>&nbsp;f&nbsp;t&nbsp;=&nbsp;sqrt&nbsp;t&nbsp;*.&nbsp;sin&nbsp;t&nbsp;<span class="comment">(*&nbsp;f&nbsp;is&nbsp;defined&nbsp;on&nbsp;float&nbsp;signals&nbsp;*)</span><br>
+...<br>
+<span class="keyword">open</span>&nbsp;<span class="constructor">Pervasives</span>&nbsp;<span class="comment">(*&nbsp;back&nbsp;to&nbsp;pervasives&nbsp;floats&nbsp;*)</span><br>
+</code></pre>
+ If you are using OCaml 3.12 or later you can also use the <code class="code"><span class="keyword">let</span> <span class="keyword">open</span></code>
+ construct
+<pre class="codepre"><code class="code"><span class="keyword">let</span>&nbsp;<span class="keyword">open</span>&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">Float</span>&nbsp;<span class="keyword">in</span><br>
+<span class="keyword">let</span>&nbsp;f&nbsp;t&nbsp;=&nbsp;sqrt&nbsp;t&nbsp;*.&nbsp;sin&nbsp;t&nbsp;<span class="keyword">in</span>&nbsp;<span class="comment">(*&nbsp;f&nbsp;is&nbsp;defined&nbsp;on&nbsp;float&nbsp;signals&nbsp;*)</span><br>
+...<br>
+</code></pre>
+<p>
+
+ <h2 id="recursion">Mutual and self reference</h2>
+<p>
+
+ Mutual and self reference among time varying values occurs naturally
+ in programs. However a mutually recursive definition of two signals
+ in which both need the value of the other at time t to define
+ their value at time t has no least fixed point. To break this
+ tight loop one signal must depend on the value the other had at time
+ t-dt where dt is an infinitesimal delay.
+<p>
+
+ The fixed point combinators <a href="React.E.html#VALfix"><code class="code"><span class="constructor">React</span>.<span class="constructor">E</span>.fix</code></a> and <a href="React.S.html#VALfix"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.fix</code></a> allow to refer to
+ the value an event or signal had an infinitesimal amount of time
+ before. These fixed point combinators act on a function <code class="code">f</code> that takes
+ as argument the infinitesimally delayed event or signal that <code class="code">f</code>
+ itself returns.
+<p>
+
+ In the example below <code class="code">history s</code> returns a signal whose value
+ is the history of <code class="code">s</code> as a list.
+<pre class="codepre"><code class="code"><span class="keyword">let</span>&nbsp;history&nbsp;?(eq&nbsp;=&nbsp;(&nbsp;=&nbsp;))&nbsp;s&nbsp;=<br>
+&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;push&nbsp;v&nbsp;=&nbsp;<span class="keyword">function</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;[]&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;[&nbsp;v&nbsp;]<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;v'&nbsp;::&nbsp;_&nbsp;<span class="keyword">as</span>&nbsp;l&nbsp;<span class="keyword">when</span>&nbsp;eq&nbsp;v&nbsp;v'&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;l<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;l&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;v&nbsp;::&nbsp;l<br>
+&nbsp;&nbsp;<span class="keyword">in</span><br>
+&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;define&nbsp;h&nbsp;=<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;h'&nbsp;=&nbsp;<span class="constructor">S</span>.l2&nbsp;push&nbsp;s&nbsp;h&nbsp;<span class="keyword">in</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;h',&nbsp;h'<br>
+&nbsp;&nbsp;<span class="keyword">in</span><br>
+&nbsp;&nbsp;<span class="constructor">S</span>.fix&nbsp;[]&nbsp;define</code></pre>
+ When a program has infinitesimally delayed values a
+ <a href="React.html#primitives">primitive</a> may trigger more than one update
+ step. For example if a signal <code class="code">s</code> is infinitesimally delayed, then
+ its update in a step <code class="code">c</code> will trigger a new step <code class="code">c'</code> at the end
+ of the step in which the delayed signal of <code class="code">s</code> will have the value
+ <code class="code">s</code> had in <code class="code">c</code>. This means that the recursion occuring between a
+ signal (or event) and its infinitesimally delayed counterpart must
+ be well-founded otherwise this may trigger an infinite number
+ of update steps, like in the following examples.
+<pre class="codepre"><code class="code"><span class="keyword">let</span>&nbsp;start,&nbsp;send_start&nbsp;=&nbsp;<span class="constructor">E</span>.create&nbsp;()<br>
+<span class="keyword">let</span>&nbsp;diverge&nbsp;=<br>
+&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;define&nbsp;e&nbsp;=<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;e'&nbsp;=&nbsp;<span class="constructor">E</span>.select&nbsp;[e;&nbsp;start]&nbsp;<span class="keyword">in</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;e',&nbsp;e'<br>
+&nbsp;&nbsp;<span class="keyword">in</span><br>
+&nbsp;&nbsp;<span class="constructor">E</span>.fix&nbsp;define<br>
+<br>
+<span class="keyword">let</span>&nbsp;()&nbsp;=&nbsp;send_start&nbsp;()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;diverges&nbsp;*)</span><br>
+<br>
+<span class="keyword">let</span>&nbsp;diverge&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;diverges&nbsp;*)</span><br>
+&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;define&nbsp;s&nbsp;=<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;s'&nbsp;=&nbsp;<span class="constructor">S</span>.<span class="constructor">Int</span>.succ&nbsp;s&nbsp;<span class="keyword">in</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;s',&nbsp;s'<br>
+&nbsp;&nbsp;<span class="keyword">in</span><br>
+&nbsp;&nbsp;<span class="constructor">S</span>.fix&nbsp;0&nbsp;define</code></pre>
+ For technical reasons, delayed events and signals (those given to
+ fixing functions) are not allowed to directly depend on each
+ other. Fixed point combinators will raise <code class="code"><span class="constructor">Invalid_argument</span></code> if
+ such dependencies are created. This limitation can be
+ circumvented by mapping these values with the identity.
+<p>
+
+ <h2 id="strongstop">Strong stops</h2>
+<p>
+
+ Strong stops should only be used on platforms where weak arrays have
+ a strong semantics (i.e. JavaScript). You can safely ignore that
+ section and the <code class="code">strong</code> argument of <a href="React.E.html#VALstop"><code class="code"><span class="constructor">React</span>.<span class="constructor">E</span>.stop</code></a> and <a href="React.S.html#VALstop"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.stop</code></a>
+ if that's not the case.
+<p>
+
+ Whenever <a href="React.E.html#VALstop"><code class="code"><span class="constructor">React</span>.<span class="constructor">E</span>.stop</code></a> and <a href="React.S.html#VALstop"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.stop</code></a> is called with <code class="code">~strong:<span class="keyword">true</span></code> on a
+ reactive value <code class="code">v</code>, it is first stopped and then it walks over the
+ list <code class="code">prods</code> of events and signals that it depends on and
+ unregisters itself from these ones as a dependent (something that is
+ normally automatically done when <code class="code">v</code> is garbage collected since
+ dependents are stored in a weak array). Then for each element of
+ <code class="code">prod</code> that has no dependents anymore and is not a primitive it
+ stops them aswell and recursively.
+<p>
+
+ A stop call with <code class="code">~strong:<span class="keyword">true</span></code> is more involved. But it allows to
+ prevent memory leaks when used judiciously on the leaves of the
+ reactive system that are no longer used.
+<p>
+
+ <b>Warning.</b> It should be noted that if direct references are kept
+ on an intermediate event or signal of the reactive system it may
+ suddenly stop updating if all its dependents were strongly stopped. In
+ the example below, <code class="code">e1</code> will <em>never</em> occur:
+<pre class="codepre"><code class="code"><span class="keyword">let</span>&nbsp;e,&nbsp;e_send&nbsp;=&nbsp;<span class="constructor">E</span>.create&nbsp;()<br>
+<span class="keyword">let</span>&nbsp;e1&nbsp;=&nbsp;<span class="constructor">E</span>.map&nbsp;(<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;x&nbsp;+&nbsp;1)&nbsp;e&nbsp;<span class="comment">(*&nbsp;never&nbsp;occurs&nbsp;*)</span><br>
+<span class="keyword">let</span>&nbsp;()&nbsp;=<br>
+&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;e2&nbsp;=&nbsp;<span class="constructor">E</span>.map&nbsp;(<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;x&nbsp;+&nbsp;1)&nbsp;e1&nbsp;<span class="keyword">in</span><br>
+&nbsp;&nbsp;<span class="constructor">E</span>.stop&nbsp;~strong:<span class="keyword">true</span>&nbsp;e2<br>
+</code></pre>
+ This can be side stepped by making an artificial dependency to keep
+ the reference:
+<pre class="codepre"><code class="code"><span class="keyword">let</span>&nbsp;e,&nbsp;e_send&nbsp;=&nbsp;<span class="constructor">E</span>.create&nbsp;()<br>
+<span class="keyword">let</span>&nbsp;e1&nbsp;=&nbsp;<span class="constructor">E</span>.map&nbsp;(<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;x&nbsp;+&nbsp;1)&nbsp;e&nbsp;<span class="comment">(*&nbsp;may&nbsp;still&nbsp;occur&nbsp;*)</span><br>
+<span class="keyword">let</span>&nbsp;e1_ref&nbsp;=&nbsp;<span class="constructor">E</span>.map&nbsp;(<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;x)&nbsp;e1<br>
+<span class="keyword">let</span>&nbsp;()&nbsp;=<br>
+&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;e2&nbsp;=&nbsp;<span class="constructor">E</span>.map&nbsp;(<span class="keyword">fun</span>&nbsp;x&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;x&nbsp;+&nbsp;1)&nbsp;e1&nbsp;<span class="keyword">in</span><br>
+&nbsp;&nbsp;<span class="constructor">E</span>.stop&nbsp;~strong:<span class="keyword">true</span>&nbsp;e2<br>
+</code></pre>
+<p>
+
+ <h1 id="ex">Examples</h1>
+<p>
+
+ <h2 id="clock">Clock</h2>
+<p>
+
+ The following program defines a primitive event <code class="code">seconds</code> holding
+ the UNIX time and occuring on every second. An effectful event
+ converts these occurences to local time and prints them on stdout
+ along with an
+ <a href="http://www.ecma-international.org/publications/standards/Ecma-048.htm">ANSI
+ escape sequence</a> to control the cursor position.
+<pre class="codepre"><code class="code"><span class="keyword">let</span>&nbsp;pr_time&nbsp;t&nbsp;=<br>
+&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;tm&nbsp;=&nbsp;<span class="constructor">Unix</span>.localtime&nbsp;t&nbsp;<span class="keyword">in</span><br>
+&nbsp;&nbsp;<span class="constructor">Printf</span>.printf&nbsp;<span class="string">"\x1B[8D%02d:%02d:%02d%!"</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;tm.<span class="constructor">Unix</span>.tm_hour&nbsp;tm.<span class="constructor">Unix</span>.tm_min&nbsp;tm.<span class="constructor">Unix</span>.tm_sec<br>
+<br>
+<span class="keyword">open</span>&nbsp;<span class="constructor">React</span>;;<br>
+<br>
+<span class="keyword">let</span>&nbsp;seconds,&nbsp;run&nbsp;=<br>
+&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;e,&nbsp;send&nbsp;=&nbsp;<span class="constructor">E</span>.create&nbsp;()&nbsp;<span class="keyword">in</span><br>
+&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;run&nbsp;()&nbsp;=<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">while</span>&nbsp;<span class="keyword">true</span>&nbsp;<span class="keyword">do</span>&nbsp;send&nbsp;(<span class="constructor">Unix</span>.gettimeofday&nbsp;());&nbsp;<span class="constructor">Unix</span>.sleep&nbsp;1&nbsp;<span class="keyword">done</span><br>
+&nbsp;&nbsp;<span class="keyword">in</span><br>
+&nbsp;&nbsp;e,&nbsp;run<br>
+<br>
+<span class="keyword">let</span>&nbsp;printer&nbsp;=&nbsp;<span class="constructor">E</span>.map&nbsp;pr_time&nbsp;seconds<br>
+<br>
+<span class="keyword">let</span>&nbsp;()&nbsp;=&nbsp;run&nbsp;()</code></pre><br>
+</body></html> \ No newline at end of file
diff --git a/doc/api.odocl b/doc/api.odocl
new file mode 100644
index 0000000..7a3b0be
--- /dev/null
+++ b/doc/api.odocl
@@ -0,0 +1 @@
+React
diff --git a/doc/index.html b/doc/index.html
new file mode 100644
index 0000000..1f9094f
--- /dev/null
+++ b/doc/index.html
@@ -0,0 +1,29 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title></title>
+</head>
+<body>
+<h1></h1>
+<ul class="indexlist">
+<li><a href="index_types.html">Index of types</a></li>
+<li><a href="index_values.html">Index of values</a></li>
+<li><a href="index_modules.html">Index of modules</a></li>
+<li><a href="index_module_types.html">Index of module types</a></li>
+</ul>
+<br/><br>
+<table class="indextable">
+<tr><td class="module"><a href="React.html">React</a></td><td><div class="info">
+Declarative events and signals.
+</div>
+</td></tr>
+</table>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/index_attributes.html b/doc/index_attributes.html
new file mode 100644
index 0000000..cac9135
--- /dev/null
+++ b/doc/index_attributes.html
@@ -0,0 +1,19 @@
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>Index of class attributes</title>
+</head>
+<body>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
+&nbsp;</div>
+<h1>Index of class attributes</h1>
+<table>
+</table>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/index_class_types.html b/doc/index_class_types.html
new file mode 100644
index 0000000..a138038
--- /dev/null
+++ b/doc/index_class_types.html
@@ -0,0 +1,19 @@
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>Index of class types</title>
+</head>
+<body>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
+&nbsp;</div>
+<h1>Index of class types</h1>
+<table>
+</table>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/index_classes.html b/doc/index_classes.html
new file mode 100644
index 0000000..5b9f199
--- /dev/null
+++ b/doc/index_classes.html
@@ -0,0 +1,19 @@
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>Index of classes</title>
+</head>
+<body>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
+&nbsp;</div>
+<h1>Index of classes</h1>
+<table>
+</table>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/index_exceptions.html b/doc/index_exceptions.html
new file mode 100644
index 0000000..8fe35d4
--- /dev/null
+++ b/doc/index_exceptions.html
@@ -0,0 +1,19 @@
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>Index of exceptions</title>
+</head>
+<body>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
+&nbsp;</div>
+<h1>Index of exceptions</h1>
+<table>
+</table>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/index_methods.html b/doc/index_methods.html
new file mode 100644
index 0000000..fc6ffa5
--- /dev/null
+++ b/doc/index_methods.html
@@ -0,0 +1,19 @@
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>Index of class methods</title>
+</head>
+<body>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
+&nbsp;</div>
+<h1>Index of class methods</h1>
+<table>
+</table>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/index_module_types.html b/doc/index_module_types.html
new file mode 100644
index 0000000..c64195b
--- /dev/null
+++ b/doc/index_module_types.html
@@ -0,0 +1,31 @@
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>Index of module types</title>
+</head>
+<body>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
+&nbsp;</div>
+<h1>Index of module types</h1>
+<table>
+<tr><td align="left"><br>E</td></tr>
+<tr><td><a href="React.S.EqType.html">EqType</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+Input signature of <a href="React.S.Make.html"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">Make</span></code></a>
+</div>
+</td></tr>
+<tr><td align="left"><br>S</td></tr>
+<tr><td><a href="React.S.S.html">S</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+Output signature of <a href="React.S.Make.html"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">Make</span></code></a>
+</div>
+</td></tr>
+</table>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/index_modules.html b/doc/index_modules.html
new file mode 100644
index 0000000..5549f38
--- /dev/null
+++ b/doc/index_modules.html
@@ -0,0 +1,91 @@
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>Index of modules</title>
+</head>
+<body>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
+&nbsp;</div>
+<h1>Index of modules</h1>
+<table>
+<tr><td align="left"><br>B</td></tr>
+<tr><td><a href="React.S.Bool.html">Bool</a> [<a href="React.S.html">React.S</a>]</td>
+<td></td></tr>
+<tr><td align="left"><br>C</td></tr>
+<tr><td><a href="React.S.Compare.html">Compare</a> [<a href="React.S.html">React.S</a>]</td>
+<td></td></tr>
+<tr><td align="left"><br>E</td></tr>
+<tr><td><a href="React.E.html">E</a> [<a href="React.html">React</a>]</td>
+<td><div class="info">
+Event combinators.
+</div>
+</td></tr>
+<tr><td align="left"><br>F</td></tr>
+<tr><td><a href="React.S.Float.html">Float</a> [<a href="React.S.html">React.S</a>]</td>
+<td></td></tr>
+<tr><td align="left"><br>I</td></tr>
+<tr><td><a href="React.S.Int.html">Int</a> [<a href="React.S.html">React.S</a>]</td>
+<td></td></tr>
+<tr><td align="left"><br>M</td></tr>
+<tr><td><a href="React.S.Make.html">Make</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+Functor specializing the combinators for the given signal value type
+</div>
+</td></tr>
+<tr><td align="left"><br>O</td></tr>
+<tr><td><a href="React.S.Option.html">Option</a> [<a href="React.S.html">React.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.E.Option.html">Option</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+Events with option occurences.
+</div>
+</td></tr>
+<tr><td align="left"><br>P</td></tr>
+<tr><td><a href="React.S.Pair.html">Pair</a> [<a href="React.S.html">React.S</a>]</td>
+<td></td></tr>
+<tr><td align="left"><br>R</td></tr>
+<tr><td><a href="React.html">React</a> </td>
+<td><div class="info">
+Declarative events and signals.
+</div>
+</td></tr>
+<tr><td align="left"><br>S</td></tr>
+<tr><td><a href="React.S.html">S</a> [<a href="React.html">React</a>]</td>
+<td><div class="info">
+Signal combinators.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Special.Sb.html">Sb</a> [<a href="React.S.Special.html">React.S.Special</a>]</td>
+<td><div class="info">
+Specialization for booleans.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Special.Sf.html">Sf</a> [<a href="React.S.Special.html">React.S.Special</a>]</td>
+<td><div class="info">
+Specialization for floats.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Special.Si.html">Si</a> [<a href="React.S.Special.html">React.S.Special</a>]</td>
+<td><div class="info">
+Specialization for integers.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Special.html">Special</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+Specialization for booleans, integers and floats.
+</div>
+</td></tr>
+<tr><td><a href="React.Step.html">Step</a> [<a href="React.html">React</a>]</td>
+<td><div class="info">
+Update steps.
+</div>
+</td></tr>
+</table>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/index_types.html b/doc/index_types.html
new file mode 100644
index 0000000..d255cbb
--- /dev/null
+++ b/doc/index_types.html
@@ -0,0 +1,57 @@
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>Index of types</title>
+</head>
+<body>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
+&nbsp;</div>
+<h1>Index of types</h1>
+<table>
+<tr><td align="left"><br>E</td></tr>
+<tr><td><a href="React.html#TYPEevent">event</a> [<a href="React.html">React</a>]</td>
+<td><div class="info">
+The type for events of type <code class="code"><span class="keywordsign">'</span>a</code>.
+</div>
+</td></tr>
+<tr><td align="left"><br>S</td></tr>
+<tr><td><a href="React.html#TYPEsignal">signal</a> [<a href="React.html">React</a>]</td>
+<td><div class="info">
+The type for signals of type <code class="code"><span class="keywordsign">'</span>a</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.html#TYPEstep">step</a> [<a href="React.html">React</a>]</td>
+<td><div class="info">
+The type for update steps.
+</div>
+</td></tr>
+<tr><td align="left"><br>T</td></tr>
+<tr><td><a href="React.Step.html#TYPEt">t</a> [<a href="React.Step.html">React.Step</a>]</td>
+<td><div class="info">
+The type for update steps.
+</div>
+</td></tr>
+<tr><td><a href="React.S.EqType.html#TYPEt">t</a> [<a href="React.S.EqType.html">React.S.EqType</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#TYPEt">t</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+The type for signals of type <code class="code"><span class="keywordsign">'</span>a</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#TYPEt">t</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+The type for events with occurrences of type <code class="code"><span class="keywordsign">'</span>a</code>.
+</div>
+</td></tr>
+<tr><td align="left"><br>V</td></tr>
+<tr><td><a href="React.S.S.html#TYPEv">v</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+</table>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/index_values.html b/doc/index_values.html
new file mode 100644
index 0000000..63722b4
--- /dev/null
+++ b/doc/index_values.html
@@ -0,0 +1,587 @@
+<html>
+<head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>Index of values</title>
+</head>
+<body>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
+&nbsp;</div>
+<h1>Index of values</h1>
+<table>
+<tr><td align="left"><br></td></tr>
+<tr><td><a href="React.S.Int.html#VAL( * )">( * )</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VAL( ** )">( ** )</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VAL( *. )">( *. )</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Compare.html#VAL(!=)">(!=)</a> [<a href="React.S.Compare.html">React.S.Compare</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Bool.html#VAL(&&)">(&amp;&amp;)</a> [<a href="React.S.Bool.html">React.S.Bool</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Int.html#VAL(+)">(+)</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VAL(+.)">(+.)</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Int.html#VAL(-)">(-)</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VAL(-.)">(-.)</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VAL(/.)">(/.)</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Compare.html#VAL(<)">(&lt;)</a> [<a href="React.S.Compare.html">React.S.Compare</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Compare.html#VAL(<=)">(&lt;=)</a> [<a href="React.S.Compare.html">React.S.Compare</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Compare.html#VAL(<>)">(&lt;&gt;)</a> [<a href="React.S.Compare.html">React.S.Compare</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Compare.html#VAL(=)">(=)</a> [<a href="React.S.Compare.html">React.S.Compare</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Compare.html#VAL(==)">(==)</a> [<a href="React.S.Compare.html">React.S.Compare</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Compare.html#VAL(>)">(&gt;)</a> [<a href="React.S.Compare.html">React.S.Compare</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Compare.html#VAL(>=)">(&gt;=)</a> [<a href="React.S.Compare.html">React.S.Compare</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Int.html#VAL(asr)">(asr)</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Int.html#VAL(land)">(land)</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Int.html#VAL(lor)">(lor)</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Int.html#VAL(lsl)">(lsl)</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Int.html#VAL(lsr)">(lsr)</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Int.html#VAL(lxor)">(lxor)</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Int.html#VAL(mod)">(mod)</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Bool.html#VAL(||)">(||)</a> [<a href="React.S.Bool.html">React.S.Bool</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Int.html#VAL(~-)">(~-)</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VAL(~-.)">(~-.)</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td align="left"><br>A</td></tr>
+<tr><td><a href="React.S.Int.html#VALabs">abs</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VALabs_float">abs_float</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.S.html#VALaccum">accum</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALaccum">accum</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">accum e i</code> is <code class="code"><span class="constructor">S</span>.hold i (</code><a href="React.E.html#VALaccum"><code class="code"><span class="constructor">React</span>.<span class="constructor">E</span>.accum</code></a><code class="code"> e i)</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALaccum">accum</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">accum ef i</code> accumulates a value, starting with <code class="code">i</code>, using <code class="code">e</code>'s
+ functional occurrences.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Float.html#VALacos">acos</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.S.html#VALapp">app</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALapp">app</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">app sf s</code> holds the value of <code class="code">sf</code> applied
+ to the value of <code class="code">s</code>, [<code class="code">app sf s</code>]<sub class="subscript">t</sub>
+ <code class="code">=</code> [<code class="code">sf</code>]<sub class="subscript">t</sub> [<code class="code">s</code>]<sub class="subscript">t</sub>.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALapp">app</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">app ef e</code> occurs when both <code class="code">ef</code> and <code class="code">e</code> occur
+ <a href="React.html#simultaneity">simultaneously</a>.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Float.html#VALasin">asin</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VALatan">atan</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VALatan2">atan2</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td align="left"><br>B</td></tr>
+<tr><td><a href="React.S.S.html#VALbind">bind</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALbind">bind</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">bind s sf</code> is <code class="code">switch (map ~eq:( == ) sf s)</code>.
+</div>
+</td></tr>
+<tr><td align="left"><br>C</td></tr>
+<tr><td><a href="React.S.Float.html#VALceil">ceil</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALchanges">changes</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">changes s</code> is <code class="code">diff (<span class="keyword">fun</span> v _ <span class="keywordsign">-&gt;</span> v) s</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALchanges">changes</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">changes eq e</code> is <code class="code">e</code>'s occurrences with occurences equal to
+ the previous one dropped.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Float.html#VALclassify_float">classify_float</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Compare.html#VALcompare">compare</a> [<a href="React.S.Compare.html">React.S.Compare</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALconst">const</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">const v</code> is always <code class="code">v</code>, [<code class="code">const v</code>]<sub class="subscript">t</sub> <code class="code">= v</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Float.html#VALcos">cos</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VALcosh">cosh</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.Step.html#VALcreate">create</a> [<a href="React.Step.html">React.Step</a>]</td>
+<td><div class="info">
+<code class="code">create ()</code> is a new update step.
+</div>
+</td></tr>
+<tr><td><a href="React.S.S.html#VALcreate">create</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALcreate">create</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">create i</code> is a primitive signal <code class="code">s</code> set to <code class="code">i</code> and a
+ <code class="code">set</code> function.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALcreate">create</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">create ()</code> is a primitive event <code class="code">e</code> and a <code class="code">send</code> function.
+</div>
+</td></tr>
+<tr><td align="left"><br>D</td></tr>
+<tr><td><a href="React.S.html#VALdiff">diff</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">diff f s</code> is an event with occurrences whenever <code class="code">s</code> changes from
+ <code class="code">v'</code> to <code class="code">v</code> and <code class="code">eq v v'</code> is <code class="code"><span class="keyword">false</span></code> (<code class="code">eq</code> is the signal's equality
+ function).
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALdiff">diff</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">diff f e</code> occurs whenever <code class="code">e</code> occurs except on the next occurence.
+</div>
+</td></tr>
+<tr><td><a href="React.S.S.html#VALdismiss">dismiss</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALdismiss">dismiss</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">dismiss c i s</code> is the signal <code class="code">s</code> except changes when <code class="code">c</code> occurs
+ are ignored.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALdismiss">dismiss</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">dismiss c e</code> is the occurences of <code class="code">e</code> except the ones when <code class="code">c</code> occurs.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALdrop_once">drop_once</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">drop_once e</code> is <code class="code">e</code> without its next occurrence.
+</div>
+</td></tr>
+<tr><td align="left"><br>E</td></tr>
+<tr><td><a href="React.S.Bool.html#VALedge">edge</a> [<a href="React.S.Bool.html">React.S.Bool</a>]</td>
+<td><div class="info">
+<code class="code">edge s</code> is <code class="code">changes s</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Float.html#VALepsilon_float">epsilon_float</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.EqType.html#VALequal">equal</a> [<a href="React.S.EqType.html">React.S.EqType</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.S.html#VALequal">equal</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALequal">equal</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">equal s s'</code> is <code class="code"><span class="keyword">true</span></code> iff <code class="code">s</code> and <code class="code">s'</code> are equal.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALequal">equal</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">equal e e'</code> is <code class="code"><span class="keyword">true</span></code> iff <code class="code">e</code> and <code class="code">e'</code> are equal.
+</div>
+</td></tr>
+<tr><td><a href="React.Step.html#VALexecute">execute</a> [<a href="React.Step.html">React.Step</a>]</td>
+<td><div class="info">
+<code class="code">execute step</code> executes the update step.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Float.html#VALexp">exp</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td align="left"><br>F</td></tr>
+<tr><td><a href="React.S.Bool.html#VALfall">fall</a> [<a href="React.S.Bool.html">React.S.Bool</a>]</td>
+<td><div class="info">
+<code class="code">fall s</code> is <code class="code"><span class="constructor">E</span>.fmap (<span class="keyword">fun</span> b <span class="keywordsign">-&gt;</span> <span class="keyword">if</span> b <span class="keyword">then</span> <span class="constructor">None</span> <span class="keyword">else</span> <span class="constructor">Some</span> ()) (edge s)</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.S.S.html#VALfilter">filter</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALfilter">filter</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">filter f i s</code> is <code class="code">s</code>'s values that satisfy <code class="code">p</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALfilter">filter</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">filter p e</code> are <code class="code">e</code>'s occurrences that satisfy <code class="code">p</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.S.S.html#VALfix">fix</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALfix">fix</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">fix i sf</code> allow to refer to the value a signal had an
+ infinitesimal amount of time before.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALfix">fix</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">fix ef</code> allows to refer to the value an event had an
+ infinitesimal amount of time before.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Bool.html#VALflip">flip</a> [<a href="React.S.Bool.html">React.S.Bool</a>]</td>
+<td><div class="info">
+<code class="code">flip b e</code> is a signal whose boolean value flips each time
+ <code class="code">e</code> occurs.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Float.html#VALfloat">float</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VALfloat_of_int">float_of_int</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VALfloor">floor</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.S.html#VALfmap">fmap</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALfmap">fmap</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">fmap fm i s</code> is <code class="code">s</code> filtered and mapped by <code class="code">fm</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALfmap">fmap</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">fmap fm e</code> are <code class="code">e</code>'s occurrences filtered and mapped by <code class="code">fm</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.S.S.html#VALfold">fold</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALfold">fold</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">fold f i e</code> is <code class="code"><span class="constructor">S</span>.hold i (</code><a href="React.E.html#VALfold"><code class="code"><span class="constructor">React</span>.<span class="constructor">E</span>.fold</code></a><code class="code"> f i e)</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALfold">fold</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">fold f i e</code> accumulates <code class="code">e</code>'s occurrences with <code class="code">f</code> starting with <code class="code">i</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Float.html#VALfrexp">frexp</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Pair.html#VALfst">fst</a> [<a href="React.S.Pair.html">React.S.Pair</a>]</td>
+<td></td></tr>
+<tr><td align="left"><br>H</td></tr>
+<tr><td><a href="React.S.S.html#VALhold">hold</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALhold">hold</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">hold i e</code> has the value of <code class="code">e</code>'s last occurrence or <code class="code">i</code> if there
+ wasn't any.
+</div>
+</td></tr>
+<tr><td align="left"><br>I</td></tr>
+<tr><td><a href="React.S.Float.html#VALinfinity">infinity</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VALint_of_float">int_of_float</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td align="left"><br>L</td></tr>
+<tr><td><a href="React.S.S.html#VALl1">l1</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALl1">l1</a> [<a href="React.S.html">React.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.E.html#VALl1">l1</a> [<a href="React.E.html">React.E</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.S.html#VALl2">l2</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALl2">l2</a> [<a href="React.S.html">React.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.E.html#VALl2">l2</a> [<a href="React.E.html">React.E</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.S.html#VALl3">l3</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALl3">l3</a> [<a href="React.S.html">React.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.E.html#VALl3">l3</a> [<a href="React.E.html">React.E</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.S.html#VALl4">l4</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALl4">l4</a> [<a href="React.S.html">React.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.E.html#VALl4">l4</a> [<a href="React.E.html">React.E</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.S.html#VALl5">l5</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALl5">l5</a> [<a href="React.S.html">React.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.E.html#VALl5">l5</a> [<a href="React.E.html">React.E</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.S.html#VALl6">l6</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALl6">l6</a> [<a href="React.S.html">React.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.E.html#VALl6">l6</a> [<a href="React.E.html">React.E</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VALldexp">ldexp</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Int.html#VALlnot">lnot</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VALlog">log</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VALlog10">log10</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td align="left"><br>M</td></tr>
+<tr><td><a href="React.S.S.html#VALmap">map</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALmap">map</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">map f s</code> is <code class="code">s</code> transformed by <code class="code">f</code>, [<code class="code">map f s</code>]<sub class="subscript">t</sub> = <code class="code">f</code> [<code class="code">s</code>]<sub class="subscript">t</sub>.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALmap">map</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">map f e</code> applies <code class="code">f</code> to <code class="code">e</code>'s occurrences.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Float.html#VALmax_float">max_float</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Int.html#VALmax_int">max_int</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.S.html#VALmerge">merge</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALmerge">merge</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">merge f a sl</code> merges the value of every signal in <code class="code">sl</code>
+ using <code class="code">f</code> and the accumulator <code class="code">a</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALmerge">merge</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">merge f a el</code> merges the <a href="React.html#simultaneity">simultaneous</a>
+ occurrences of every event in <code class="code">el</code> using <code class="code">f</code> and the accumulator <code class="code">a</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Float.html#VALmin_float">min_float</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Int.html#VALmin_int">min_int</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VALminus_one">minus_one</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Int.html#VALminus_one">minus_one</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VALmod_float">mod_float</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VALmodf">modf</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td align="left"><br>N</td></tr>
+<tr><td><a href="React.S.Float.html#VALnan">nan</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VALneg_infinity">neg_infinity</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.E.html#VALnever">never</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+A never occuring event.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Option.html#VALnone">none</a> [<a href="React.S.Option.html">React.S.Option</a>]</td>
+<td><div class="info">
+<code class="code">none</code> is <code class="code"><span class="constructor">S</span>.const <span class="constructor">None</span></code>.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Bool.html#VALnot">not</a> [<a href="React.S.Bool.html">React.S.Bool</a>]</td>
+<td></td></tr>
+<tr><td align="left"><br>O</td></tr>
+<tr><td><a href="React.S.html#VALon">on</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">on c i s</code> is the signal <code class="code">s</code> whenever <code class="code">c</code> is <code class="code"><span class="keyword">true</span></code>.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALon">on</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">on c e</code> is the occurrences of <code class="code">e</code> when <code class="code">c</code> is <code class="code"><span class="keyword">true</span></code>.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALonce">once</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">once e</code> is <code class="code">e</code> with only its next occurence.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Float.html#VALone">one</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Int.html#VALone">one</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Bool.html#VALone">one</a> [<a href="React.S.Bool.html">React.S.Bool</a>]</td>
+<td></td></tr>
+<tr><td align="left"><br>P</td></tr>
+<tr><td><a href="React.S.Pair.html#VALpair">pair</a> [<a href="React.S.Pair.html">React.S.Pair</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Int.html#VALpred">pred</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td align="left"><br>R</td></tr>
+<tr><td><a href="React.S.html#VALretain">retain</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">retain s c</code> keeps a reference to the closure <code class="code">c</code> in <code class="code">s</code> and
+ returns the previously retained value.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALretain">retain</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">retain e c</code> keeps a reference to the closure <code class="code">c</code> in <code class="code">e</code> and
+ returns the previously retained value.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Bool.html#VALrise">rise</a> [<a href="React.S.Bool.html">React.S.Bool</a>]</td>
+<td><div class="info">
+<code class="code">rise s</code> is <code class="code"><span class="constructor">E</span>.fmap (<span class="keyword">fun</span> b <span class="keywordsign">-&gt;</span> <span class="keyword">if</span> b <span class="keyword">then</span> <span class="constructor">Some</span> () <span class="keyword">else</span> <span class="constructor">None</span>) (edge s)</code>.
+</div>
+</td></tr>
+<tr><td align="left"><br>S</td></tr>
+<tr><td><a href="React.S.html#VALsample">sample</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">sample f e s</code> samples <code class="code">s</code> at <code class="code">e</code>'s occurrences.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALselect">select</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">select el</code> is the occurrences of every event in <code class="code">el</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Float.html#VALsin">sin</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VALsinh">sinh</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Pair.html#VALsnd">snd</a> [<a href="React.S.Pair.html">React.S.Pair</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Option.html#VALsome">some</a> [<a href="React.S.Option.html">React.S.Option</a>]</td>
+<td><div class="info">
+<code class="code">some s</code> is <code class="code"><span class="constructor">S</span>.map ~eq (<span class="keyword">fun</span> v <span class="keywordsign">-&gt;</span> <span class="constructor">Some</span> v) <span class="constructor">None</span></code>, where <code class="code">eq</code> uses
+ <code class="code">s</code>'s equality function to test the <code class="code"><span class="constructor">Some</span> v</code>'s equalities.
+</div>
+</td></tr>
+<tr><td><a href="React.E.Option.html#VALsome">some</a> [<a href="React.E.Option.html">React.E.Option</a>]</td>
+<td><div class="info">
+<code class="code">some e</code> is <code class="code">map (<span class="keyword">fun</span> v <span class="keywordsign">-&gt;</span> <span class="constructor">Some</span> v) e</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Float.html#VALsqrt">sqrt</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.E.html#VALstamp">stamp</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">stamp e v</code> is <code class="code">map (<span class="keyword">fun</span> _ <span class="keywordsign">-&gt;</span> v) e</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.S.html#VALstop">stop</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">stop s</code>, stops updating <code class="code">s</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALstop">stop</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">stop e</code> stops <code class="code">e</code> from occuring.
+</div>
+</td></tr>
+<tr><td><a href="React.S.Int.html#VALsucc">succ</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.S.html#VALswitch">switch</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALswitch">switch</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">switch ss</code> is the inner signal of <code class="code">ss</code>.
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALswitch">switch</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">switch e ee</code> is <code class="code">e</code>'s occurrences until there is an
+ occurrence <code class="code">e'</code> on <code class="code">ee</code>, the occurrences of <code class="code">e'</code> are then used
+ until there is a new occurrence on <code class="code">ee</code>, etc..
+</div>
+</td></tr>
+<tr><td align="left"><br>T</td></tr>
+<tr><td><a href="React.S.Float.html#VALtan">tan</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Float.html#VALtanh">tanh</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALtrace">trace</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">trace iff tr s</code> is <code class="code">s</code> except <code class="code">tr</code> is invoked with <code class="code">s</code>'s
+ current value and on <code class="code">s</code> changes when <code class="code">iff</code> is <code class="code"><span class="keyword">true</span></code> (defaults
+ to <code class="code"><span class="constructor">S</span>.const <span class="keyword">true</span></code>).
+</div>
+</td></tr>
+<tr><td><a href="React.E.html#VALtrace">trace</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">trace iff tr e</code> is <code class="code">e</code> except <code class="code">tr</code> is invoked with e's
+ occurence when <code class="code">iff</code> is <code class="code"><span class="keyword">true</span></code> (defaults to <code class="code"><span class="constructor">S</span>.const <span class="keyword">true</span></code>).
+</div>
+</td></tr>
+<tr><td><a href="React.S.Float.html#VALtruncate">truncate</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td align="left"><br>U</td></tr>
+<tr><td><a href="React.E.html#VALuntil">until</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<code class="code">until c e</code> is <code class="code">e</code>'s occurences until <code class="code">c</code> occurs.
+</div>
+</td></tr>
+<tr><td align="left"><br>V</td></tr>
+<tr><td><a href="React.S.Option.html#VALvalue">value</a> [<a href="React.S.Option.html">React.S.Option</a>]</td>
+<td><div class="info">
+<code class="code">value default s</code> is <code class="code">s</code> with only its <code class="code"><span class="constructor">Some</span> v</code> values.
+</div>
+</td></tr>
+<tr><td><a href="React.S.html#VALvalue">value</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<code class="code">value s</code> is <code class="code">s</code>'s current value.
+</div>
+</td></tr>
+<tr><td><a href="React.E.Option.html#VALvalue">value</a> [<a href="React.E.Option.html">React.E.Option</a>]</td>
+<td><div class="info">
+<code class="code">value default e</code> either silences <code class="code"><span class="constructor">None</span></code> occurences if <code class="code">default</code> is
+ unspecified or replaces them by the value of <code class="code">default</code> at the occurence
+ time.
+</div>
+</td></tr>
+<tr><td align="left"><br>W</td></tr>
+<tr><td><a href="React.S.S.html#VALwhen_">when_</a> [<a href="React.S.S.html">React.S.S</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.html#VALwhen_">when_</a> [<a href="React.S.html">React.S</a>]</td>
+<td><div class="info">
+<span class="deprecated"></span></div>
+</td></tr>
+<tr><td><a href="React.E.html#VALwhen_">when_</a> [<a href="React.E.html">React.E</a>]</td>
+<td><div class="info">
+<span class="deprecated"></span></div>
+</td></tr>
+<tr><td align="left"><br>Z</td></tr>
+<tr><td><a href="React.S.Float.html#VALzero">zero</a> [<a href="React.S.Float.html">React.S.Float</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Int.html#VALzero">zero</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
+<td></td></tr>
+<tr><td><a href="React.S.Bool.html#VALzero">zero</a> [<a href="React.S.Bool.html">React.S.Bool</a>]</td>
+<td></td></tr>
+</table>
+</body>
+</html> \ No newline at end of file
diff --git a/doc/style.css b/doc/style.css
new file mode 100644
index 0000000..cf17675
--- /dev/null
+++ b/doc/style.css
@@ -0,0 +1,98 @@
+/* A style for ocamldoc. Daniel C. Buenzli */
+
+/* Reset a few things. */
+html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,
+a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,
+small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,
+form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td
+{ margin: 0; padding: 0; border: 0 none; outline: 0; font-size: 100%;
+ font-weight: inherit; font-style:inherit; font-family:inherit;
+ line-height: inherit; vertical-align: baseline; text-align:inherit;
+ color:inherit; background: transparent; }
+
+table { border-collapse: collapse; border-spacing: 0; }
+
+/* Basic page layout */
+
+body { font: normal 10pt/1.375em helvetica, arial, sans-serif; text-align:left;
+ margin: 1.375em 10%; min-width: 40ex; max-width: 72ex;
+ color: black; background: white /* url(line-height-22.gif) */; }
+
+b { font-weight: bold }
+em { font-style: italic }
+
+tt, code, pre { font-family: WorkAroundWebKitAndMozilla, monospace;
+ font-size: 1em; }
+pre code { font-size : inherit; }
+.codepre { margin-bottom:1.375em /* after code example we introduce space. */ }
+
+.superscript,.subscript
+{ font-size : 0.813em; line-height:0; margin-left:0.4ex;}
+.superscript { vertical-align: super; }
+.subscript { vertical-align: sub; }
+
+/* ocamldoc markup workaround hacks */
+
+
+
+hr, hr + br, div + br, center + br, span + br, ul + br, ol + br, pre + br
+{ display: none } /* annoying */
+
+div.info + br { display:block}
+
+.codepre br + br { display: none }
+h1 + pre { margin-bottom:1.375em} /* Toplevel module description */
+
+/* Sections and document divisions */
+
+/* .navbar { margin-bottom: -1.375em } */
+h1 { font-weight: bold; font-size: 1.5em; /* margin-top:1.833em; */
+ margin-top:0.917em; padding-top:0.875em;
+ border-top-style:solid; border-width:1px; border-color:#AAA; }
+h2 { font-weight: bold; font-size: 1.313em; margin-top: 1.048em }
+h3 { font-weight: bold; font-size: 1.125em; margin-top: 1.222em }
+h3 { font-weight: bold; font-size: 1em; margin-top: 1.375em}
+h4 { font-style: italic; }
+
+/* Used by OCaml's own library documentation. */
+ h6 { font-weight: bold; font-size: 1.125em; margin-top: 1.222em }
+ .h7 { font-weight: bold; font-size: 1em; margin-top: 1.375em }
+
+p { margin-top: 1.375em }
+pre { margin-top: 1.375em }
+.info { margin: 0.458em 0em -0.458em 2em;}/* Description of types values etc. */
+td .info { margin:0; padding:0; margin-left: 2em;} /* Description in indexes */
+
+ul, ol { margin-top:0.688em; padding-bottom:0.687em;
+ list-style-position:outside}
+ul + p, ol + p { margin-top: 0em }
+ul { list-style-type: square }
+
+
+/* h2 + ul, h3 + ul, p + ul { } */
+ul > li { margin-left: 1.375em; }
+ol > li { margin-left: 1.7em; }
+/* Links */
+
+a, a:link, a:visited, a:active, a:hover { color : #00B; text-decoration: none }
+a:hover { text-decoration : underline }
+*:target {background-color: #FFFF99;} /* anchor highlight */
+
+/* Code */
+
+.keyword { font-weight: bold; }
+.comment { color : red }
+.constructor { color : green }
+.string { color : brown }
+.warning { color : red ; font-weight : bold }
+
+/* Functors */
+
+.paramstable { border-style : hidden ; padding-bottom:1.375em}
+.paramstable code { margin-left: 1ex; margin-right: 1ex }
+.sig_block {margin-left: 1em}
+
+/* Images */
+
+img { margin-top: 1.375em; display:block }
+li img { margin-top: 0em; }
diff --git a/doc/type_React.E.Option.html b/doc/type_React.E.Option.html
new file mode 100644
index 0000000..ac806ed
--- /dev/null
+++ b/doc/type_React.E.Option.html
@@ -0,0 +1,16 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.E.Option</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;some&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;option&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;value&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?default:<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;option&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/type_React.E.html b/doc/type_React.E.html
new file mode 100644
index 0000000..aac8245
--- /dev/null
+++ b/doc/type_React.E.html
@@ -0,0 +1,68 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.E</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;t&nbsp;=&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;never&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;*&nbsp;(?step:<span class="constructor">React</span>.step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;retain&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;[&nbsp;<span class="keywordsign">`</span><span class="constructor">R</span>&nbsp;<span class="keyword">of</span>&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit&nbsp;]<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;stop&nbsp;:&nbsp;?strong:bool&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;trace&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?iff:bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;once&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;drop_once&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;stamp&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;diff&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;changes&nbsp;:&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;on&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;until&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;select&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Option</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;some&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;option&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;value&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?default:<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;option&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/type_React.S.Bool.html b/doc/type_React.S.Bool.html
new file mode 100644
index 0000000..c542efb
--- /dev/null
+++ b/doc/type_React.S.Bool.html
@@ -0,0 +1,22 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Bool</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;zero&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;one&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;not&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keywordsign">&amp;&amp;</span>&nbsp;)&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keywordsign">||</span>&nbsp;)&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;edge&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;rise&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fall&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;flip&nbsp;:&nbsp;bool&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/type_React.S.Compare.html b/doc/type_React.S.Compare.html
new file mode 100644
index 0000000..f97ec11
--- /dev/null
+++ b/doc/type_React.S.Compare.html
@@ -0,0 +1,22 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Compare</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;=&nbsp;)&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;&lt;&gt;&nbsp;)&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;&lt;&nbsp;)&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;&gt;&nbsp;)&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;&lt;=&nbsp;)&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;&gt;=&nbsp;)&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;compare&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;==&nbsp;)&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;!=&nbsp;)&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/type_React.S.EqType.html b/doc/type_React.S.EqType.html
new file mode 100644
index 0000000..94a82af
--- /dev/null
+++ b/doc/type_React.S.EqType.html
@@ -0,0 +1,15 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.EqType</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;t<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">EqType</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">EqType</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/type_React.S.Float.html b/doc/type_React.S.Float.html
new file mode 100644
index 0000000..7f7305d
--- /dev/null
+++ b/doc/type_React.S.Float.html
@@ -0,0 +1,55 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Float</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;zero&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;one&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;minus_one&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keywordsign">~-.</span>&nbsp;)&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;+.&nbsp;)&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;-.&nbsp;)&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;*.&nbsp;)&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;/.&nbsp;)&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;**&nbsp;)&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;sqrt&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;exp&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;log&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;log10&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;cos&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;sin&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;tan&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;acos&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;asin&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;atan&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;atan2&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;cosh&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;sinh&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;tanh&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;ceil&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;floor&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;abs_float&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;mod_float&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;frexp&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(float&nbsp;*&nbsp;int)&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;ldexp&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;modf&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(float&nbsp;*&nbsp;float)&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;float&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;float_of_int&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;truncate&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;int_of_float&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;infinity&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;neg_infinity&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;nan&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;max_float&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;min_float&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;epsilon_float&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;classify_float&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Pervasives</span>.fpclass&nbsp;<span class="constructor">React</span>.signal<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/type_React.S.Int.html b/doc/type_React.S.Int.html
new file mode 100644
index 0000000..d92f148
--- /dev/null
+++ b/doc/type_React.S.Int.html
@@ -0,0 +1,33 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Int</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;zero&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;one&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;minus_one&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keywordsign">~-</span>&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;succ&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;pred&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;+&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;-&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;*&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">mod</span>&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;abs&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;max_int&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;min_int&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">land</span>&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">lor</span>&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">lxor</span>&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;lnot&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">lsl</span>&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">lsr</span>&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">asr</span>&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/type_React.S.Make.html b/doc/type_React.S.Make.html
new file mode 100644
index 0000000..a1a3958
--- /dev/null
+++ b/doc/type_React.S.Make.html
@@ -0,0 +1,47 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Make</title>
+</head>
+<body>
+<code class="code"><span class="keyword">functor</span>&nbsp;(<span class="constructor">Eq</span>&nbsp;:&nbsp;<span class="constructor">EqType</span>)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;=&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">Eq</span>.t<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;(?step:step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/type_React.S.Option.html b/doc/type_React.S.Option.html
new file mode 100644
index 0000000..3b09382
--- /dev/null
+++ b/doc/type_React.S.Option.html
@@ -0,0 +1,19 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Option</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;none&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;option&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;some&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;option&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;value&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;default:[&nbsp;<span class="keywordsign">`</span><span class="constructor">Always</span>&nbsp;<span class="keyword">of</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Init</span>&nbsp;<span class="keyword">of</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;]&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;option&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/type_React.S.Pair.html b/doc/type_React.S.Pair.html
new file mode 100644
index 0000000..0d36e5b
--- /dev/null
+++ b/doc/type_React.S.Pair.html
@@ -0,0 +1,20 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Pair</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;pair&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;*&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;*&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fst&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;snd&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>b&nbsp;*&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/type_React.S.S.html b/doc/type_React.S.S.html
new file mode 100644
index 0000000..e5fca1a
--- /dev/null
+++ b/doc/type_React.S.S.html
@@ -0,0 +1,87 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.S</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;*<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(?step:<span class="constructor">React</span>.step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/type_React.S.Special.Sb.html b/doc/type_React.S.Special.Sb.html
new file mode 100644
index 0000000..2b8d2bd
--- /dev/null
+++ b/doc/type_React.S.Special.Sb.html
@@ -0,0 +1,46 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Special.Sb</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;=&nbsp;bool<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;(?step:step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v&nbsp;signal<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/type_React.S.Special.Sf.html b/doc/type_React.S.Special.Sf.html
new file mode 100644
index 0000000..9a3fe16
--- /dev/null
+++ b/doc/type_React.S.Special.Sf.html
@@ -0,0 +1,46 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Special.Sf</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;=&nbsp;float<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;(?step:step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v&nbsp;signal<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/type_React.S.Special.Si.html b/doc/type_React.S.Special.Si.html
new file mode 100644
index 0000000..8aad616
--- /dev/null
+++ b/doc/type_React.S.Special.Si.html
@@ -0,0 +1,46 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Special.Si</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;=&nbsp;int<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;(?step:step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v&nbsp;signal<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/type_React.S.Special.html b/doc/type_React.S.Special.html
new file mode 100644
index 0000000..cebc177
--- /dev/null
+++ b/doc/type_React.S.Special.html
@@ -0,0 +1,124 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S.Special</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Sb</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;=&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;(?step:step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Si</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;=&nbsp;int<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;(?step:step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Sf</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;=&nbsp;float<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;(?step:step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/type_React.S.html b/doc/type_React.S.html
new file mode 100644
index 0000000..ab386ca
--- /dev/null
+++ b/doc/type_React.S.html
@@ -0,0 +1,459 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.S</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;t&nbsp;=&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;const&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;*&nbsp;(?step:<span class="constructor">React</span>.step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;value&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;retain&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;[&nbsp;<span class="keywordsign">`</span><span class="constructor">R</span>&nbsp;<span class="keyword">of</span>&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit&nbsp;]<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;eq_fun&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;option<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;stop&nbsp;:&nbsp;?strong:bool&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;trace&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?iff:bool&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;diff&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;changes&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;sample&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;on&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>g&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Bool</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;zero&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;one&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;not&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keywordsign">&amp;&amp;</span>&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keywordsign">||</span>&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;edge&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;rise&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fall&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;flip&nbsp;:&nbsp;bool&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Int</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;zero&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;one&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;minus_one&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keywordsign">~-</span>&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;succ&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;pred&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;+&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;-&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;*&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">mod</span>&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;abs&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;max_int&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;min_int&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">land</span>&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">lor</span>&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">lxor</span>&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;lnot&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">lsl</span>&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">lsr</span>&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">asr</span>&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Float</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;zero&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;one&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;minus_one&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keywordsign">~-.</span>&nbsp;)&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;+.&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;-.&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;*.&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;/.&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;**&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;sqrt&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;exp&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;log&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;log10&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;cos&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;sin&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;tan&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;acos&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;asin&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;atan&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;atan2&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;cosh&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;sinh&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;tanh&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;ceil&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;floor&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;abs_float&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;mod_float&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;frexp&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(float&nbsp;*&nbsp;int)&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;ldexp&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;modf&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(float&nbsp;*&nbsp;float)&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;float&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;float_of_int&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;truncate&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;int_of_float&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;infinity&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;neg_infinity&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;nan&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;max_float&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;min_float&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;epsilon_float&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;classify_float&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Pervasives</span>.fpclass&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Pair</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;pair&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;*&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;*&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fst&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;snd&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>b&nbsp;*&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Option</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;none&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;option&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;some&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;option&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;value&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:[&nbsp;<span class="keywordsign">`</span><span class="constructor">Always</span>&nbsp;<span class="keyword">of</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Init</span>&nbsp;<span class="keyword">of</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;]&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;option&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Compare</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;=&nbsp;)&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;&lt;&gt;&nbsp;)&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;&lt;&nbsp;)&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;&gt;&nbsp;)&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;&lt;=&nbsp;)&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;&gt;=&nbsp;)&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;compare&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;==&nbsp;)&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;!=&nbsp;)&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="keyword">type</span>&nbsp;<span class="constructor">EqType</span>&nbsp;=<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;t<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">EqType</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">EqType</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="keyword">type</span>&nbsp;<span class="constructor">S</span>&nbsp;=<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;*<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?step:<span class="constructor">React</span>.step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Make</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">functor</span>&nbsp;(<span class="constructor">Eq</span>&nbsp;:&nbsp;<span class="constructor">EqType</span>)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;=&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">Eq</span>.t<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;(?step:step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Special</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Sb</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;=&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;(?step:step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Si</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;=&nbsp;int<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;(?step:step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Sf</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;=&nbsp;float<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;(?step:step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/type_React.Step.html b/doc/type_React.Step.html
new file mode 100644
index 0000000..3749432
--- /dev/null
+++ b/doc/type_React.Step.html
@@ -0,0 +1,16 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React.Step</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;t&nbsp;=&nbsp;<span class="constructor">React</span>.step<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">React</span>.step<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;execute&nbsp;:&nbsp;<span class="constructor">React</span>.step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/doc/type_React.html b/doc/type_React.html
new file mode 100644
index 0000000..8c1832f
--- /dev/null
+++ b/doc/type_React.html
@@ -0,0 +1,586 @@
+<html><head>
+<link rel="stylesheet" href="style.css" type="text/css">
+<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
+<link rel="Start" href="index.html">
+<link title="Index of types" rel=Appendix href="index_types.html">
+<link title="Index of values" rel=Appendix href="index_values.html">
+<link title="Index of modules" rel=Appendix href="index_modules.html">
+<link title="Index of module types" rel=Appendix href="index_module_types.html">
+<link title="React" rel="Chapter" href="React.html"><title>React</title>
+</head>
+<body>
+<code class="code"><span class="keyword">sig</span><br>
+&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;event<br>
+&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;step<br>
+&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">E</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;t&nbsp;=&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;never&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;*&nbsp;(?step:<span class="constructor">React</span>.step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;retain&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;[&nbsp;<span class="keywordsign">`</span><span class="constructor">R</span>&nbsp;<span class="keyword">of</span>&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit&nbsp;]<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;stop&nbsp;:&nbsp;?strong:bool&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;trace&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?iff:bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;once&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;drop_once&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;stamp&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;diff&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;changes&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;on&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;until&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;select&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Option</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;some&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;option&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;value&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?default:<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;option&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">S</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;t&nbsp;=&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;const&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;*&nbsp;(?step:<span class="constructor">React</span>.step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;value&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;retain&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;[&nbsp;<span class="keywordsign">`</span><span class="constructor">R</span>&nbsp;<span class="keyword">of</span>&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit&nbsp;]<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;eq_fun&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;option<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;stop&nbsp;:&nbsp;?strong:bool&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;trace&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?iff:bool&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.t&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;diff&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;changes&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;sample&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;on&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>g&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Bool</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;zero&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;one&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;not&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keywordsign">&amp;&amp;</span>&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keywordsign">||</span>&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;edge&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;rise&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fall&nbsp;:&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;flip&nbsp;:&nbsp;bool&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Int</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;zero&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;one&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;minus_one&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keywordsign">~-</span>&nbsp;)&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;succ&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;pred&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;+&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;-&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;*&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">mod</span>&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;abs&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;max_int&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;min_int&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">land</span>&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">lor</span>&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">lxor</span>&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;lnot&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">lsl</span>&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">lsr</span>&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keyword">asr</span>&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Float</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;zero&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;one&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;minus_one&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;<span class="keywordsign">~-.</span>&nbsp;)&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;+.&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;-.&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;*.&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;/.&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;**&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;sqrt&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;exp&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;log&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;log10&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;cos&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;sin&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;tan&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;acos&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;asin&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;atan&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;atan2&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;cosh&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;sinh&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;tanh&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;ceil&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;floor&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;abs_float&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;mod_float&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;frexp&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(float&nbsp;*&nbsp;int)&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;ldexp&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;modf&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(float&nbsp;*&nbsp;float)&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;float&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;float_of_int&nbsp;:&nbsp;int&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;truncate&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;int_of_float&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;infinity&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;neg_infinity&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;nan&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;max_float&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;min_float&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;epsilon_float&nbsp;:&nbsp;float&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;classify_float&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">Pervasives</span>.fpclass&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Pair</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;pair&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;*&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;*&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fst&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;snd&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;*&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Option</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;none&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;option&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;some&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;option&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;value&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default:[&nbsp;<span class="keywordsign">`</span><span class="constructor">Always</span>&nbsp;<span class="keyword">of</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">|</span>&nbsp;<span class="keywordsign">`</span><span class="constructor">Init</span>&nbsp;<span class="keyword">of</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;]&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;option&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Compare</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;=&nbsp;)&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;&lt;&gt;&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;&lt;&nbsp;)&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;&gt;&nbsp;)&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;&lt;=&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;&gt;=&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;compare&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;int&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;==&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;(&nbsp;!=&nbsp;)&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="keyword">type</span>&nbsp;<span class="constructor">EqType</span>&nbsp;=<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;t<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">EqType</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">EqType</span>.t&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="keyword">type</span>&nbsp;<span class="constructor">S</span>&nbsp;=<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;*<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(?step:<span class="constructor">React</span>.step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Make</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">functor</span>&nbsp;(<span class="constructor">Eq</span>&nbsp;:&nbsp;<span class="constructor">EqType</span>)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;=&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">Eq</span>.t<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;(?step:step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Special</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Sb</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;=&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;(?step:step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Si</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;=&nbsp;int<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;(?step:step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Sf</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;=&nbsp;float<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;(?step:step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit)<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;equal&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;switch&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;bind&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fix&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+&nbsp;&nbsp;<span class="keyword">module</span>&nbsp;<span class="constructor">Step</span>&nbsp;:<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">sig</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">type</span>&nbsp;t&nbsp;=&nbsp;<span class="constructor">React</span>.step<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;create&nbsp;:&nbsp;unit&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="constructor">React</span>.step<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;execute&nbsp;:&nbsp;<span class="constructor">React</span>.step&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;unit<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><br>
+<span class="keyword">end</span></code></body></html> \ No newline at end of file
diff --git a/opam b/opam
new file mode 100644
index 0000000..0413d55
--- /dev/null
+++ b/opam
@@ -0,0 +1,17 @@
+opam-version: "1"
+maintainer: "Daniel Bünzli <daniel.buenzl i@erratique.ch>"
+homepage: "http://erratique.ch/software/react"
+authors: ["Daniel Bünzli <daniel.buenzl i@erratique.ch>"]
+doc: "http://erratique.ch/software/react/doc/React"
+dev-repo: "http://erratique.ch/repos/react.git"
+bug-reports: "https://github.com/dbuenzli/react/issues"
+tags: [ "reactive" "declarative" "signal" "event" "frp" "org:erratique" ]
+license: "BSD3"
+depends: ["ocamlfind"]
+ocaml-version: [>= "3.11.0"]
+build:
+[
+ [ "ocaml" "pkg/git.ml" ]
+ [ "ocaml" "pkg/build.ml" "native=%{ocaml-native}%"
+ "native-dynlink=%{ocaml-native-dynlink}%" ]
+] \ No newline at end of file
diff --git a/pkg/META b/pkg/META
new file mode 100644
index 0000000..9961ed0
--- /dev/null
+++ b/pkg/META
@@ -0,0 +1,22 @@
+version = "1.2.0"
+description = "Declarative events and signals for OCaml"
+archive(byte) = "react.cma"
+archive(byte, plugin) = "react.cma"
+archive(byte, toploop) += "react_top.cma"
+archive(native) = "react.cmxa"
+archive(native, plugin) = "react.cmxs"
+archive(native, toploop) += "react_top.cmxs"
+exists_if = "react.cma"
+
+package "top" (
+ description = "Toplevel support for React"
+ version = "1.2.0"
+ requires = "compiler-libs.toplevel"
+ archive(byte) = "react_top.cma"
+ archive(byte, plugin) = "react_top.cma"
+ archive(native) = "react_top.cmxa"
+ archive(native, plugin) = "react_top.cmxs"
+ exists_if = "react_top.cma"
+)
+
+
diff --git a/pkg/build.ml b/pkg/build.ml
new file mode 100755
index 0000000..53255fe
--- /dev/null
+++ b/pkg/build.ml
@@ -0,0 +1,16 @@
+#!/usr/bin/env ocaml
+#directory "pkg";;
+#use "topkg.ml";;
+
+let () =
+ Pkg.describe "react" ~builder:`OCamlbuild [
+ Pkg.lib "pkg/META";
+ Pkg.lib ~exts:Exts.module_library "src/react";
+ Pkg.lib ~exts:Exts.library "src/react_top";
+ Pkg.doc "README.md";
+ Pkg.doc "CHANGES.md";
+ Pkg.doc "test/breakout.ml";
+ Pkg.doc "test/clock.ml"; ]
+
+
+
diff --git a/pkg/config.ml b/pkg/config.ml
new file mode 100644
index 0000000..19ecc23
--- /dev/null
+++ b/pkg/config.ml
@@ -0,0 +1,11 @@
+#!/usr/bin/env ocaml
+#directory "pkg"
+#use "topkg-ext.ml"
+
+module Config = struct
+ include Config_default
+ let vars =
+ [ "NAME", "react";
+ "VERSION", Git.describe ~chop_v:true "master";
+ "MAINTAINER", "Daniel Bünzli <daniel.buenzl i\\@erratique.ch>" ]
+end
diff --git a/pkg/git.ml b/pkg/git.ml
new file mode 100755
index 0000000..963c605
--- /dev/null
+++ b/pkg/git.ml
@@ -0,0 +1,14 @@
+#!/usr/bin/env ocaml
+#directory "pkg"
+#use "config.ml"
+
+(* This is only for git checkout builds, it can be ignored
+ for distribution builds. *)
+
+let () =
+ if Dir.exists ".git" then begin
+ Vars.subst ~skip:Config.subst_skip ~vars:Config.vars ~dir:"."
+ >>& fun () -> Cmd.exec_hook Config.git_hook
+ >>& fun () -> ()
+ end
+
diff --git a/pkg/topkg-ext.ml b/pkg/topkg-ext.ml
new file mode 100644
index 0000000..b904899
--- /dev/null
+++ b/pkg/topkg-ext.ml
@@ -0,0 +1,272 @@
+(*---------------------------------------------------------------------------
+ Copyright (c) 2014 Daniel C. Bünzli. All rights reserved.
+ Distributed under the BSD3 license, see license at the end of the file.
+ react release 1.2.0
+ ---------------------------------------------------------------------------*)
+
+let ( >>= ) v f = match v with `Ok v -> f v | `Error _ as e -> e
+let ( >>& ) v f = match v with
+| `Ok v -> f v | `Error e -> Printf.eprintf "%s: %s\n%!" Sys.argv.(0) e; exit 1
+
+type 'a result = [ `Ok of 'a | `Error of string ]
+
+(** Working with files *)
+module File : sig
+ val exists : string -> bool
+ (** [exists file] is [true] if [file] exists. *)
+
+ val read : string -> string result
+ (** [read file] is [file]'s contents. *)
+
+ val write : string -> string -> unit result
+ (** [write file content] writes [contents] to [file]. *)
+
+ val write_subst : string -> (string * string) list -> string -> unit result
+ (** [write_subst file vars content] writes [contents] to [file]
+ substituting variables of the form [%%ID%%] by their definition.
+ The [ID]'s are [List.map fst vars] and their definition content
+ is found with [List.assoc]. *)
+
+ val delete : ?maybe:bool -> string -> unit result
+ (** [delete maybe file] deletes file [file]. If [maybe] is [true] (defaults
+ to false) no error is reported if the file doesn't exist. *)
+
+ val temp : unit -> string result
+ (** [temp ()] creates a temporary file and returns its name. The file
+ is destroyed at the end of program execution. *)
+end = struct
+ let exists = Sys.file_exists
+ let read file = try
+ let ic = open_in file in
+ let len = in_channel_length ic in
+ let s = String.create len in
+ really_input ic s 0 len; close_in ic; `Ok s
+ with Sys_error e -> `Error e
+
+ let write f s = try
+ let oc = open_out f in
+ output_string oc s; close_out oc; `Ok ()
+ with Sys_error e -> `Error e
+
+ let write_subst f vars s = try
+ let oc = open_out f in
+ let start = ref 0 in
+ let last = ref 0 in
+ let len = String.length s in
+ while (!last < len - 4) do
+ if not (s.[!last] = '%' && s.[!last + 1] = '%') then incr last else
+ begin
+ let start_subst = !last in
+ let last_id = ref (!last + 2) in
+ let stop = ref false in
+ while (!last_id < len - 1 && not !stop) do
+ if not (s.[!last_id] = '%' && s.[!last_id + 1] = '%') then begin
+ if s.[!last_id] <> ' ' then (incr last_id) else
+ (stop := true; last := !last_id)
+ end else begin
+ let id_start = start_subst + 2 in
+ let id = String.sub s (id_start) (!last_id - id_start) in
+ try
+ let subst = List.assoc id vars in
+ output oc s !start (start_subst - !start);
+ output_string oc subst;
+ stop := true;
+ start := !last_id + 2;
+ last := !last_id + 2;
+ with Not_found ->
+ stop := true;
+ last := !last_id
+ end
+ done
+ end
+ done;
+ output oc s !start (len - !start); close_out oc; `Ok ()
+ with Sys_error e -> `Error e
+
+ let delete ?(maybe = false) file = try
+ if maybe && not (exists file) then `Ok () else
+ `Ok (Sys.remove file)
+ with Sys_error e -> `Error e
+
+ let temp () = try
+ let f = Filename.temp_file (Filename.basename Sys.argv.(0)) "topkg" in
+ at_exit (fun () -> ignore (delete f)); `Ok f
+ with Sys_error e -> `Error e
+end
+
+(** Working with directories. *)
+module Dir : sig
+ val exists : string -> bool
+ (** [exists dir] is [true] if directory [dir] exists. *)
+
+ val change_cwd : string -> unit result
+ (** [change_cwd dir] changes the current working directory to [dir]. *)
+
+ val fold_files_rec : ?skip:string list -> (string -> 'a -> 'a result) ->
+ 'a -> string list -> 'a result
+ (** [fold_files_rec skip f acc paths] folds [f] over the files
+ found in [paths]. Files and directories whose suffix matches an
+ element of [skip] are skipped. *)
+end = struct
+ let exists dir = Sys.file_exists dir && Sys.is_directory dir
+ let change_cwd dir = try `Ok (Sys.chdir dir) with Sys_error e -> `Error e
+ let fold_files_rec ?(skip = []) f acc paths =
+ let is_dir d = try Sys.is_directory d with Sys_error _ -> false in
+ let readdir d = try Array.to_list (Sys.readdir d) with Sys_error _ -> [] in
+ let keep p = not (List.exists (fun s -> Filename.check_suffix p s) skip) in
+ let process acc file = match acc with
+ | `Error _ as e -> e
+ | `Ok acc -> f file acc
+ in
+ let rec aux f acc = function
+ | (d :: ds) :: up ->
+ let paths = List.rev_map (Filename.concat d) (readdir d) in
+ let paths = List.find_all keep paths in
+ let dirs, files = List.partition is_dir paths in
+ begin match List.fold_left process acc files with
+ | `Error _ as e -> e
+ | `Ok _ as acc -> aux f acc (dirs :: ds :: up)
+ end
+ | [] :: [] -> acc
+ | [] :: up -> aux f acc up
+ | _ -> assert false
+ in
+ let paths = List.find_all keep paths in
+ let dirs, files = List.partition is_dir paths in
+ let acc = List.fold_left process (`Ok acc) files in
+ aux f acc (dirs :: [])
+end
+
+(** Command invocation. *)
+module Cmd : sig
+ val exec : string -> unit result
+ (** [exec cmd] executes [cmd]. *)
+
+ val exec_hook : string option -> unit result
+ (** [exec_hook args] is [exec ("ocaml " ^ "args")] if [args] is some. *)
+
+ val read : string -> string result
+ (** [read cmd] executes [cmd] and returns the contents of its stdout. *)
+end = struct
+ let exec cmd =
+ let code = Sys.command cmd in
+ if code = 0 then `Ok () else
+ `Error (Printf.sprintf "invocation `%s' exited with %d" cmd code)
+
+ let exec_hook args = match args with
+ | None -> `Ok ()
+ | Some args -> exec (Printf.sprintf "ocaml %s" args)
+
+ let read cmd =
+ File.temp () >>= fun file ->
+ exec (Printf.sprintf "%s > %s" cmd file) >>= fun () ->
+ File.read file >>= fun v ->
+ `Ok v
+end
+
+(** Variable substitution. *)
+module Vars : sig
+ val subst : skip:string list -> vars:(string * string) list ->
+ dir:string -> unit result
+ (** [subst skip vars dir] substitutes [vars] in all files
+ in [dir] except those that are [skip]ped (see {!Dir.fold_files_rec}). *)
+
+ val get : string -> (string * string) list -> string result
+ (** [get v] lookup variable [v] in [vars]. Returns an error if [v] is
+ absent or if it is the empty string. *)
+
+end = struct
+ let subst ~skip ~vars ~dir =
+ let subst f () =
+ File.read f >>= fun contents ->
+ File.write_subst f vars contents >>= fun () -> `Ok ()
+ in
+ Dir.fold_files_rec ~skip subst () [dir]
+
+ let get v vars =
+ let v = try List.assoc v vars with Not_found -> "" in
+ if v <> "" then `Ok v else
+ `Error (Printf.sprintf "empty or undefined variable %s in Config.vars" v)
+end
+
+(** Git invocations. *)
+module Git : sig
+ val describe : ?chop_v:bool -> string -> string
+ (** [describe chop_v branch] invokes [git describe branch]. If [chop_v]
+ is [true] (defaults to [false]) an initial ['v'] in the result
+ is chopped. *)
+end = struct
+ let describe ?(chop_v = false) branch =
+ if not (Dir.exists ".git") then "not-a-git-checkout" else
+ Cmd.read (Printf.sprintf "git describe %s" branch) >>& fun d ->
+ let len = String.length d in
+ if chop_v && len > 0 && d.[0] = 'v' then String.sub d 1 (len - 2) else
+ String.sub d 0 (len - 1) (* remove \n *)
+end
+
+(** Default configuration. *)
+module Config_default : sig
+ val subst_skip : string list
+ (** [subst_skip] is a list of suffixes that are automatically
+ skipped during variable substitution. *)
+
+ val vars : (string * string) list
+ (** [vars] is the list of variables to substitute, empty. *)
+
+ val git_hook : string option
+ (** [git_start_hook] is an ocaml script to invoke before a git package
+ build, after variable substitution occured. *)
+
+ val distrib_remove : string list
+ (** [distrib_remove] is a list of files to remove before making
+ the distributino tarball. *)
+
+ val distrib_hook : string option
+ (** [distrib_hook] is an ocaml script to invoke before trying
+ to build the distribution. *)
+
+ val www_demos : string list
+ (** [www_demos] is a list of build targets that represent single page
+ js_of_ocaml demo. *)
+end = struct
+ let subst_skip = [".git"; ".png"; ".jpeg"; ".otf"; ".ttf"; ".pdf" ]
+ let vars = []
+ let git_hook = None
+ let distrib_remove = [".git"; ".gitignore"; "build"]
+ let distrib_hook = None
+ let www_demos = []
+end
+
+
+(*---------------------------------------------------------------------------
+ Copyright (c) 2014 Daniel C. Bünzli.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+ 3. Neither the name of Daniel C. Bünzli nor the names of
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ---------------------------------------------------------------------------*)
diff --git a/pkg/topkg.ml b/pkg/topkg.ml
new file mode 100644
index 0000000..a2b8406
--- /dev/null
+++ b/pkg/topkg.ml
@@ -0,0 +1,303 @@
+(*---------------------------------------------------------------------------
+ Copyright (c) 2014 Daniel C. Bünzli. All rights reserved.
+ Distributed under the BSD3 license, see license at the end of the file.
+ react release 1.2.0
+ ---------------------------------------------------------------------------*)
+
+(* Public api *)
+
+(** Build environment access *)
+module type Env = sig
+ val bool : string -> bool
+ (** [bool key] declares [key] as being a boolean key in the environment.
+ Specifing key=(true|false) on the command line becomes mandatory. *)
+
+ val native : bool
+ (** [native] is [bool "native"]. *)
+
+ val native_dynlink : bool
+ (** [native_dylink] is [bool "native-dynlink"] *)
+end
+
+(** Exts defines sets of file extensions. *)
+module type Exts = sig
+ val interface : string list
+ (** [interface] is [[".mli"; ".cmi"; ".cmti"]] *)
+
+ val interface_opt : string list
+ (** [interface_opt] is [".cmx" :: interface] *)
+
+ val library : string list
+ (** [library] is [[".cma"; ".cmxa"; ".cmxs"; ".a"]] *)
+
+ val module_library : string list
+ (** [module_library] is [(interface_opt @ library)]. *)
+end
+
+(** Package description. *)
+module type Pkg = sig
+ type builder = [ `OCamlbuild | `Other of string * string ]
+ (** The type for build tools. Either [`OCamlbuild] or an
+ [`Other (tool, bdir)] tool [tool] that generates its build artefacts
+ in [bdir]. *)
+
+ type moves
+ (** The type for install moves. *)
+
+ type field = ?cond:bool -> ?exts:string list -> ?dst:string -> string -> moves
+ (** The type for field install functions. A call
+ [field cond exts dst path] generates install moves as follows:
+ {ul
+ {- If [cond] is [false] (defaults to [true]), no move is generated.}
+ {- If [exts] is present, generates a move for each path in
+ the list [List.map (fun e -> path ^ e) exts].}
+ {- If [dst] is present this path is used as the move destination
+ (allows to install in subdirectories). If absent [dst] is
+ [Filename.basename path].} *)
+
+ val lib : field
+ val bin : ?auto:bool -> field
+ (** If [auto] is true (defaults to false) generates
+ [path ^ ".native"] if {!Env.native} is [true] and
+ [path ^ ".byte"] if {!Env.native} is [false]. *)
+ val sbin : ?auto:bool -> field (** See {!bin}. *)
+ val toplevel : field
+ val share : field
+ val share_root : field
+ val etc : field
+ val doc : field
+ val misc : field
+ val stublibs : field
+ val man : field
+ val describe : string -> builder:builder -> moves list -> unit
+ (** [describe name builder moves] describes a package named [name] with
+ builder [builder] and install moves [moves]. *)
+end
+
+(* Implementation *)
+
+module Topkg : sig
+ val cmd : [`Build | `Explain | `Help ]
+ val env : (string * bool) list
+ val err_parse : string -> 'a
+ val err_mdef : string -> 'a
+ val err_miss : string -> 'a
+ val err_file : string -> string -> 'a
+ val warn_unused : string -> unit
+end = struct
+
+ (* Parses the command line. The actual cmd execution occurs in the call
+ to Pkg.describe. *)
+
+ let err fmt =
+ let k _ = exit 1 in
+ Format.kfprintf k Format.err_formatter ("%s: " ^^ fmt ^^ "@.") Sys.argv.(0)
+
+ let err_parse a = err "argument `%s' is not of the form key=(true|false)" a
+ let err_mdef a = err "bool `%s' is defined more than once" a
+ let err_miss a = err "argument `%s=(true|false)' is missing" a
+ let err_file f e = err "%s: %s" f e
+ let warn_unused k =
+ Format.eprintf "%s: warning: environment key `%s` unused.@." Sys.argv.(0) k
+
+ let cmd, env =
+ let rec parse_env acc = function (* not t.r. *)
+ | arg :: args ->
+ begin try
+ (* String.cut ... *)
+ let len = String.length arg in
+ let eq = String.index arg '=' in
+ let bool = bool_of_string (String.sub arg (eq + 1) (len - eq - 1)) in
+ let key = String.sub arg 0 eq in
+ if key = "" then raise Exit else
+ try ignore (List.assoc key acc); err_mdef key with
+ | Not_found -> parse_env ((key, bool) :: acc) args
+ with
+ | Invalid_argument _ | Not_found | Exit -> err_parse arg
+ end
+ | [] -> acc
+ in
+ match List.tl (Array.to_list Sys.argv) with
+ | "explain" :: args -> `Explain, parse_env [] args
+ | ("help" | "-h" | "--help" | "-help") :: args -> `Help, parse_env [] args
+ | args -> `Build, parse_env [] args
+end
+
+module Env : sig
+ include Env
+ val get : unit -> (string * bool) list
+end = struct
+ let env = ref []
+ let get () = !env
+ let add_bool key b = env := (key, b) :: !env
+ let bool key =
+ let b = try List.assoc key Topkg.env with
+ | Not_found -> if Topkg.cmd = `Build then Topkg.err_miss key else true
+ in
+ add_bool key b; b
+
+ let native = bool "native"
+ let native_dynlink = bool "native-dynlink"
+end
+
+module Exts : Exts = struct
+ let interface = [".mli"; ".cmi"; ".cmti"]
+ let interface_opt = ".cmx" :: interface
+ let library = [".cma"; ".cmxa"; ".cmxs"; ".a"]
+ let module_library = (interface_opt @ library)
+end
+
+module Pkg : Pkg = struct
+ type builder = [ `OCamlbuild | `Other of string * string ]
+ type moves = (string * (string * string)) list
+ type field = ?cond:bool -> ?exts:string list -> ?dst:string -> string -> moves
+
+ let str = Printf.sprintf
+ let warn_unused () =
+ let keys = List.map fst Topkg.env in
+ let keys_used = List.map fst (Env.get ()) in
+ let unused = List.find_all (fun k -> not (List.mem k keys_used)) keys in
+ List.iter Topkg.warn_unused unused
+
+ let has_suffix = Filename.check_suffix
+ let build_strings ?(exec_sep = " ") btool bdir mvs =
+ let no_build = [ ".cmti"; ".cmt" ] in
+ let install = Buffer.create 1871 in
+ let exec = Buffer.create 1871 in
+ let rec add_mvs current = function
+ | (field, (src, dst)) :: mvs when field = current ->
+ if List.exists (has_suffix src) no_build then
+ Buffer.add_string install (str "\n \"?%s/%s\" {\"%s\"}" bdir src dst)
+ else begin
+ Buffer.add_string exec (str "%s%s" exec_sep src);
+ Buffer.add_string install (str "\n \"%s/%s\" {\"%s\"}" bdir src dst);
+ end;
+ add_mvs current mvs
+ | (((field, _) :: _) as mvs) ->
+ if current <> "" (* first *) then Buffer.add_string install " ]\n";
+ Buffer.add_string install (str "%s: [" field);
+ add_mvs field mvs
+ | [] -> ()
+ in
+ Buffer.add_string exec btool;
+ add_mvs "" mvs;
+ Buffer.add_string install " ]\n";
+ Buffer.contents install, Buffer.contents exec
+
+ let pr = Format.printf
+ let pr_explanation btool bdir pkg mvs =
+ let env = Env.get () in
+ let install, exec = build_strings ~exec_sep:" \\\n " btool bdir mvs in
+ pr "@[<v>";
+ pr "Package name: %s@," pkg;
+ pr "Build tool: %s@," btool;
+ pr "Build directory: %s@," bdir;
+ pr "Environment:@, ";
+ List.iter (fun (k,v) -> pr "%s=%b@, " k v) (List.sort compare env);
+ pr "@,Build invocation:@,";
+ pr " %s@,@," exec;
+ pr "Install file:@,";
+ pr "%s@," install;
+ pr "@]";
+ ()
+
+ let pr_help () =
+ pr "Usage example:@\n %s" Sys.argv.(0);
+ List.iter (fun (k,v) -> pr " %s=%b" k v) (List.sort compare (Env.get ()));
+ pr "@."
+
+ let build btool bdir pkg mvs =
+ let install, exec = build_strings btool bdir mvs in
+ let e = Sys.command exec in
+ if e <> 0 then exit e else
+ let install_file = pkg ^ ".install" in
+ try
+ let oc = open_out install_file in
+ output_string oc install; flush oc; close_out oc
+ with Sys_error e -> Topkg.err_file install_file e
+
+ let mvs ?(drop_exts = []) field ?(cond = true) ?(exts = []) ?dst src =
+ if not cond then [] else
+ let mv src dst = (field, (src, dst)) in
+ let expand exts s d = List.map (fun e -> mv (s ^ e) (d ^ e)) exts in
+ let dst = match dst with None -> Filename.basename src | Some dst -> dst in
+ let files = if exts = [] then [mv src dst] else expand exts src dst in
+ let keep (_, (src, _)) = not (List.exists (has_suffix src) drop_exts) in
+ List.find_all keep files
+
+ let lib =
+ let drop_exts =
+ if Env.native && not Env.native_dynlink then [ ".cmxs" ] else
+ if not Env.native then [ ".a"; ".cmx"; ".cmxa"; ".cmxs" ] else []
+ in
+ mvs ~drop_exts "lib"
+
+ let share = mvs "share"
+ let share_root = mvs "share_root"
+ let etc = mvs "etc"
+ let toplevel = mvs "toplevel"
+ let doc = mvs "doc"
+ let misc = mvs "misc"
+ let stublibs = mvs "stublibs"
+ let man = mvs "man"
+
+ let bin_drops = if not Env.native then [ ".native" ] else []
+ let bin_mvs field ?(auto = false) ?cond ?exts ?dst src =
+ let src, dst =
+ if not auto then src, dst else
+ let dst = match dst with
+ | None -> Some (Filename.basename src)
+ | Some _ as dst -> dst
+ in
+ let src = if Env.native then src ^ ".native" else src ^ ".byte" in
+ src, dst
+ in
+ mvs ~drop_exts:bin_drops field ?cond ?dst src
+
+ let bin = bin_mvs "bin"
+ let sbin = bin_mvs "sbin"
+
+ let describe pkg ~builder mvs =
+ let mvs = List.sort compare (List.flatten mvs) in
+ let btool, bdir = match builder with
+ | `OCamlbuild -> "ocamlbuild -use-ocamlfind -classic-display", "_build"
+ | `Other (btool, bdir) -> btool, bdir
+ in
+ match Topkg.cmd with
+ | `Explain -> pr_explanation btool bdir pkg mvs
+ | `Help -> pr_help ()
+ | `Build -> warn_unused (); build btool bdir pkg mvs
+end
+
+(*---------------------------------------------------------------------------
+ Copyright (c) 2014 Daniel C. Bünzli.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+ 3. Neither the name of Daniel C. Bünzli nor the names of
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ---------------------------------------------------------------------------*)
diff --git a/src/react.ml b/src/react.ml
new file mode 100644
index 0000000..790324d
--- /dev/null
+++ b/src/react.ml
@@ -0,0 +1,1706 @@
+(*---------------------------------------------------------------------------
+ Copyright (c) 2009 Daniel C. Bünzli. All rights reserved.
+ Distributed under a BSD3 license, see license at the end of the file.
+ react release 1.2.0
+ ---------------------------------------------------------------------------*)
+
+let err_max_rank = "maximal rank exceeded"
+let err_sig_undef = "signal value undefined yet"
+let err_fix = "trying to fix a delayed value"
+let err_retain_never = "E.never cannot retain a closure"
+let err_retain_cst_sig = "constant signals cannot retain a closure"
+let err_step_executed = "step already executed"
+let err_event_scheduled = "event already scheduled on a step"
+let err_signal_scheduled = "signal already scheduled on a step"
+
+module Wa = struct
+ type 'a t = { mutable arr : 'a Weak.t; mutable len : int }
+ (* The type for resizeable weak arrays.
+
+ For now the arrays only grow. We could try to compact and
+ downsize the array in scan_add if a threshold of empty slots is
+ exceeded. *)
+
+ let create size = { arr = Weak.create size; len = 0 }
+ let length a = a.len
+ let is_empty a =
+ try
+ for i = 0 to a.len - 1 do
+ if Weak.check a.arr i then raise Exit;
+ done;
+ true
+ with Exit -> false
+
+ let clear a = a.arr <- Weak.create 0; a.len <- 0
+ let get a i = Weak.get a.arr i
+ let set a i = Weak.set a.arr i
+ let swap a i i' =
+ let v = Weak.get a.arr i' in
+ Weak.blit a.arr i a.arr i' 1; (* blit prevents i from becoming live. *)
+ Weak.set a.arr i v
+
+ let grow a =
+ let arr' = Weak.create (2 * (a.len + 1)) in
+ Weak.blit a.arr 0 arr' 0 a.len;
+ a.arr <- arr'
+
+ let add a v = (* adds v at the end of a. *)
+ if a.len = Weak.length a.arr then grow a;
+ Weak.set a.arr a.len (Some v);
+ a.len <- a.len + 1
+
+ let scan_add a v = (* adds v to a, tries to find an empty slot, O(a.len). *)
+ try
+ for i = 0 to a.len - 1 do
+ match Weak.get a.arr i with
+ | None -> Weak.set a.arr i (Some v); raise Exit | Some _ -> ()
+ done;
+ add a v
+ with Exit -> ()
+
+ let rem_last a = let l = a.len - 1 in (a.len <- l; Weak.set a.arr l None)
+ let rem a v = (* removes v from a, uses physical equality, O(a.len). *)
+ try
+ for i = 0 to a.len - 1 do
+ match Weak.get a.arr i with
+ | Some v' when v == v' -> Weak.set a.arr i None; raise Exit
+ | _ -> ()
+ done
+ with Exit -> ()
+
+ let iter f a =
+ for i = 0 to a.len - 1 do
+ match Weak.get a.arr i with Some v -> f v | None -> ()
+ done
+
+ let fold f acc a =
+ let acc = ref acc in
+ for i = 0 to a.len - 1 do
+ match Weak.get a.arr i with Some v -> acc := f !acc v | None -> ()
+ done;
+ !acc
+end
+
+type node =
+ { mutable rank : int; (* its rank (height) in the dataflow graph. *)
+ mutable stamp : step; (* last step in which it was scheduled. *)
+ mutable retain : unit -> unit; (* retained by the node, NEVER invoked. *)
+ mutable producers : unit -> node list; (* nodes on which it depends. *)
+ mutable update : step -> unit; (* update closure. *)
+ deps : node Wa.t } (* weak references to dependent nodes. *)
+(* The type for nodes.
+
+ Each event and (non-constant) signal has an associated node. The
+ fields producers and update keep, in their closure environment,
+ references to mutables (see later) on which the node depends.
+ Defining their contents via a let rec allows the environment to be
+ shared by the two closures.
+
+ There are special nodes to represent infinitesimally delayed nodes
+ (needed for recursive definitions). These nodes all have a rank of
+ Node.delayed_rank and depend only on the node they delay. Since
+ they have the highest rank possible they are updated only at the
+ end of the step and treated specially at that point (see
+ Step.execute). *)
+
+and step =
+ { mutable over : bool; (* true when the step is over. *)
+ mutable heap : heap; (* min-heap of nodes sorted by rank. *)
+ mutable eops : (unit -> unit) list; (* end of step operations. *)
+ mutable cops : (unit -> unit) list } (* cleanup step operations. *)
+(* The type for update steps.
+
+ Note for historical reasons we use the variable names [c] and [c']
+ in the code for representing update steps.
+
+ There are four successive phases in the execution of a step c (see
+ Step.execute).
+
+ 1. Nodes are updated in topological order until c.heap is empty or
+ we reach a delayed node.
+
+ 2. End of step operations are executed. This may add new
+ dependencies (see S.diff and S.changes) and clear the occurence
+ of delayed events from a previous step (but used in this
+ step).
+
+ 3. If there are delayed nodes in c.heap, we create a new step
+ c'. Each delayed node is updated and its dependents are put in
+ c'.heap. For delayed events, an end of step operation is added
+ in c' to clear the occurence at step 2 of c'. Delayed nodes are
+ updated in any order as a delayed node updating in a step
+ cannot depend on a delayed node updating in the same step.
+
+ 4. Cleanup operations are executed. This clears the event occurences of
+ non-delayed event that occured in c.
+
+ After this, if a step c' was created in 3. the step gets executed. *)
+
+and heap = node Wa.t
+(* The type for heaps.
+
+ Weak min-heaps of nodes sorted according to their rank. Classic
+ imperative implementation with a twist to accomodate the fact
+ that nodes may disappear.
+
+ The heap property we maintain is that for any node its descendents
+ (vs. children) are either of no smaller rank or they are None. None
+ nodes need to be treated specially in percolate up and down. The
+ reason is that it blocks information about the rank of their
+ descendents. In percolate down the solution is to systematically
+ swap with None children. So do we in percolate up, however, in
+ that case we may violate the property if we swap with a None node
+ and stop right after (either because we got the root or we found a
+ parent of smaller rank), the property can however be reestablished
+ by percolating down from that point. *)
+
+type 'a emut =
+ { ev : 'a option ref; (* during steps, holds a potential occurence. *)
+ enode : node; } (* associated node. *)
+
+type 'a event = Never | Emut of 'a emut
+(* The type for events.
+
+ An event is either the never occuring event Never or a mutable
+ Emut. A mutable m has some value in m.v iff a step is being
+ executed and m has an occurence in the step. m's dependents are
+ scheduled for update iff m has a value in m.v.
+
+ Mutables that occur in a step are set back to None when the step
+ terminates with an cleanup step operation (see eupdate and
+ Step.execute). To avoid a weak reference on m in the cleanup
+ operation, the field m.v is a field on a reference instead of a
+ mutable field.
+
+ A new node n can be made dependent on a an event mutable m during a
+ step. But when n is added to m's dependents, m may already have
+ updated and scheduled its dependents. In that case n also need to
+ be scheduled (see E.add_dep). If m only occurs later in the step,
+ the n will be scheduled as usual with the others. *)
+
+type 'a smut =
+ { mutable sv : 'a option; (* signal value (None only temporary). *)
+ eq : 'a -> 'a -> bool; (* to detect signal value changes. *)
+ snode : node } (* associated node. *)
+
+type 'a signal = Const of 'a | Smut of 'a smut
+(* The type for signals.
+
+ A signal is either a constant signal Const or a mutable Smut. A
+ mutable m has a value in m.v iff m.v initialized. m's dependents
+ are scheduled for update iff m is initialized and m.v changed
+ according to m.eq in the step.
+
+ Signal initialization occurs as follows. If we have an init. value
+ we set the signal's value to this value and then :
+
+ 1. If the creation occurs outside a step, the signal's update
+ function is invoked with Step.nil. This may overwrite the
+ init. value, but no dependent will see this change as there
+ cannot be any at that time.
+
+ 2. If the creation occurs inside a step, the signal is scheduled
+ for update. Here again this may overwrite the init. value. If
+ the new value is equal to the init. value this will not schedule
+ the signals' dependents. However this is not a problem since
+ dependents are either new signals and will be scheduled via the
+ init. process or a new dependency added by S.switch in which
+ case this dependent is also be scheduled.
+
+ Note that in both cases if we had no init. value, the call to the
+ update function must unconditionaly write a concrete value for the
+ signal.
+
+ To find out whether the creation occurs in a step we walk back the
+ signal's producers recursively looking for a node stamp with an
+ unfinished step (see Step.find_unfinished). This is not in favor
+ of static signal creation but this is the price we have to pay for
+ not having global data structures.
+
+ A new node n can be made dependent on a signal mutable m during a
+ step. In contrast to events (see above) nothing special has to be
+ done. Here's the rationale :
+
+ 1. If n is the node of a new event then either the event cannot
+ happen in the same step and thus the depency addition occurs at
+ the end of the step (S.diff, S.changes) or the event cares only
+ about having an up to date value if some other event occurs
+ (S.sample, E.on) in the same step and the rank of n ensures
+ this.
+
+ 2. If n is the node of a new signal then n cares only about having
+ m's up to date values whenever n will initialize and the rank of
+ n ensures this. *)
+
+module H = struct
+ let size = Wa.length
+ let els h = Wa.fold (fun acc e -> e :: acc) [] h (* no particular order. *)
+ let compare_down h i i' = match Wa.get h i, Wa.get h i' with
+ | Some n, Some n' -> compare n.rank n'.rank
+ | Some _, None -> 1 (* None is smaller than anything. *)
+ | None, Some _ -> -1 (* None is smaller than anything. *)
+ | None, None -> 0
+
+ let rec down h i =
+ let last = size h - 1 in
+ let start = 2 * i in
+ let l = start + 1 in (* left child index. *)
+ let r = start + 2 in (* right child index. *)
+ if l > last then () (* no child, stop *) else
+ let child = (* index of smallest child. *)
+ if r > last then l else (if compare_down h l r < 0 then l else r)
+ in
+ if compare_down h i child > 0 then (Wa.swap h i child; down h child)
+
+ let up h i =
+ let rec aux h i last_none =
+ if i = 0 then (if last_none then down h 0) else
+ let p = (i - 1) / 2 in (* parent index. *)
+ match Wa.get h i, Wa.get h p with
+ | Some n, Some n' ->
+ if compare n.rank n'.rank < 0 then (Wa.swap h i p; aux h p false) else
+ (if last_none then down h i)
+ | Some _, None ->
+ Wa.swap h i p; aux h p true
+ | None, _ -> ()
+ in
+ aux h i false
+
+ let rebuild h = for i = (size h - 2) / 2 downto 0 do down h i done
+ let add h n = Wa.add h n; up h (size h - 1)
+ let rec take h =
+ let s = size h in
+ if s = 0 then None else
+ let v = Wa.get h 0 in
+ begin
+ if s > 1
+ then (Wa.set h 0 (Wa.get h (s - 1)); Wa.rem_last h; down h 0)
+ else Wa.rem_last h
+ end;
+ match v with None -> take h | v -> v
+end
+
+let delayed_rank = max_int
+
+module Step = struct (* Update steps. *)
+ type t = step
+ let nil = { over = true; heap = Wa.create 0; eops = []; cops = []}
+
+ let create () =
+ let h = Wa.create 11 in
+ { over = false; heap = h; eops = []; cops = []}
+
+ let add c n = if n.stamp == c then () else (n.stamp <- c; H.add c.heap n)
+ let add_deps c n = Wa.iter (add c) n.deps
+ let add_eop c op = c.eops <- op :: c.eops
+ let add_cop c op = c.cops <- op :: c.cops
+ let allow_reschedule n = n.stamp <- nil
+ let rebuild c = H.rebuild c.heap
+
+ let rec execute c =
+ let eops c = List.iter (fun op -> op ()) c.eops; c.eops <- [] in
+ let cops c = List.iter (fun op -> op ()) c.cops; c.cops <- [] in
+ let finish c = c.over <- true; c.heap <- Wa.create 0 in
+ let rec update c = match H.take c.heap with
+ | Some n when n.rank <> delayed_rank -> n.update c; update c
+ | Some n ->
+ let c' = create () in
+ eops c; List.iter (fun n -> n.update c') (n :: H.els c.heap); cops c;
+ finish c;
+ execute c'
+ | None -> eops c; cops c; finish c
+ in
+ update c
+
+ let execute c = if c.over then invalid_arg err_step_executed else execute c
+
+
+ let find_unfinished nl = (* find unfinished step in recursive producers. *)
+ let rec aux next = function (* zig-zag breadth-first search. *)
+ | [] -> if next = [] then nil else aux [] next
+ | [] :: todo -> aux next todo
+ | nl :: todo -> find next todo nl
+ and find next todo = function
+ | [] -> aux next todo
+ | n :: nl ->
+ if not n.stamp.over then n.stamp else
+ find (n.producers () :: next) todo nl
+ in
+ aux [] [ nl ]
+end
+
+module Node = struct
+ let delayed_rank = delayed_rank
+ let min_rank = min_int
+ let max_rank = delayed_rank - 1
+
+ let nop _ = ()
+ let no_producers () = []
+ let create r =
+ { rank = r; stamp = Step.nil; update = nop; retain = nop;
+ producers = no_producers; deps = Wa.create 0 }
+
+ let rem_dep n n' = Wa.rem n.deps n'
+ let add_dep n n' = Wa.scan_add n.deps n'
+ let has_dep n = not (Wa.is_empty n.deps)
+ let deps n = Wa.fold (fun acc d -> d :: acc) [] n.deps
+
+ let bind n p u = n.producers <- p; n.update <- u
+ let stop ?(strong = false) n =
+ if not strong then begin
+ n.producers <- no_producers; n.update <- nop; Wa.clear n.deps;
+ end else begin
+ let rec loop next to_rem = function
+ | [] ->
+ begin match next with
+ | (to_rem, prods) :: next -> loop next to_rem prods
+ | [] -> ()
+ end
+ | n :: todo ->
+ rem_dep n to_rem; (* N.B. rem_dep could be combined with has_dep *)
+ if n.rank = min_rank (* is a primitive *) || has_dep n
+ then loop next to_rem todo else
+ begin
+ let prods = n.producers () in
+ n.producers <- no_producers; n.update <- nop; Wa.clear n.deps;
+ loop ((n, prods) :: next) to_rem todo
+ end
+ in
+ let producers = n.producers () in
+ n.producers <- no_producers; n.update <- nop; Wa.clear n.deps;
+ loop [] n producers
+ end
+
+ let set_rank n r = n.rank <- r
+ let rmin = create min_rank
+ let rmax n n' = if n.rank > n'.rank then n else n'
+ let rsucc n =
+ if n.rank = delayed_rank then min_rank else
+ if n.rank < max_rank then n.rank + 1 else invalid_arg err_max_rank
+
+ let rsucc2 n n' =
+ let r = rsucc n in
+ let r' = rsucc n' in
+ if r > r' then r else r'
+
+ (* Rank updates currently only increases ranks. If this is problematic
+ udpate ranks orthodoxly by taking the succ of the max of n.producers.
+ Note that rank update stops at delayed nodes (otherwise we would
+ loop and blow the ranks). *)
+ let update_rank n r = (* returns true iff n's rank increased. *)
+ let rec aux = function
+ | [] -> ()
+ | n :: todo ->
+ let update todo d =
+ if n.rank < d.rank || n.rank = delayed_rank then todo else
+ (d.rank <- rsucc n; d :: todo)
+ in
+ aux (Wa.fold update todo n.deps)
+ in
+ if r > n.rank then (n.rank <- r; aux [ n ]; true) else false
+end
+
+(* Shortcuts *)
+
+let rsucc = Node.rsucc
+let rsucc2 = Node.rsucc2
+let rmax = Node.rmax
+
+(* Event value, creation and update *)
+
+let eval m = match !(m.ev) with Some v -> v | None -> assert false
+let emut rank = { ev = ref None; enode = Node.create rank }
+let event m p u = Node.bind m.enode p u; Emut m
+let eupdate v m c =
+ let clear v () = v := None in
+ m.ev := Some v;
+ Step.add_cop c (clear m.ev);
+ Step.add_deps c m.enode
+
+(* Signal value, creation and update *)
+
+let sval m = match m.sv with Some v -> v | None -> assert false
+let smut rank eq = { sv = None; eq = eq; snode = Node.create rank }
+let signal ?i m p u =
+ Node.bind m.snode p u;
+ begin match i with Some _ as v -> m.sv <- v | None -> () end;
+ begin match Step.find_unfinished (m.snode.producers ()) with
+ | c when c == Step.nil -> m.snode.update Step.nil
+ | c -> Step.add c m.snode
+ end;
+ Smut m
+
+let supdate v m c = match m.sv with
+| Some v' when (m.eq v v') -> ()
+| Some _ -> m.sv <- Some v; if c != Step.nil then Step.add_deps c m.snode
+| None -> m.sv <- Some v (* init. without init value. *)
+
+module E = struct
+ type 'a t = 'a event
+
+ let add_dep m n =
+ Node.add_dep m.enode n;
+ if !(m.ev) <> None then Step.add m.enode.stamp n
+
+ let send m ?step v = match step with (* sends an event occurence. *)
+ | Some c ->
+ if c.over then invalid_arg err_step_executed else
+ if not m.enode.stamp.over then invalid_arg err_event_scheduled else
+ m.enode.stamp <- c;
+ eupdate v m c
+ | None ->
+ let c = Step.create () in
+ m.enode.stamp <- c;
+ eupdate v m c;
+ Step.execute c
+
+ (* Basics *)
+
+ let never = Never
+ let create () =
+ let m = emut Node.min_rank in
+ Emut m, send m
+
+ let retain e c = match e with
+ | Never -> invalid_arg err_retain_never
+ | Emut m -> let c' = m.enode.retain in (m.enode.retain <- c); (`R c')
+
+ let stop ?strong = function Never -> () | Emut m -> Node.stop ?strong m.enode
+ let equal e e' = match e, e' with
+ | Never, Never -> true
+ | Never, _ | _, Never -> false
+ | Emut m, Emut m' -> m == m'
+
+ let trace ?(iff = Const true) t e = match iff with
+ | Const false -> e
+ | Const true ->
+ begin match e with
+ | Never -> e
+ | Emut m ->
+ let m' = emut (rsucc m.enode) in
+ let rec p () = [ m.enode ]
+ and u c = let v = eval m in t v; eupdate v m' c in
+ add_dep m m'.enode;
+ event m' p u
+ end
+ | Smut mc ->
+ match e with
+ | Never -> Never
+ | Emut m ->
+ let m' = emut (rsucc2 mc.snode m.enode) in
+ let rec p () = [mc.snode; m.enode]
+ and u c = match !(m.ev) with
+ | None -> () (* mc updated. *)
+ | Some v -> if (sval mc) then t v; eupdate v m' c
+ in
+ Node.add_dep mc.snode m'.enode;
+ add_dep m m'.enode;
+ event m' p u
+
+ (* Transforming and filtering *)
+
+ let once = function
+ | Never -> Never
+ | Emut m ->
+ let m' = emut (rsucc m.enode) in
+ let rec p () = [ m.enode ]
+ and u c =
+ Node.rem_dep m.enode m'.enode;
+ eupdate (eval m) m' c;
+ Node.stop m'.enode
+ in
+ add_dep m m'.enode;
+ event m' p u
+
+ let drop_once = function
+ | Never -> Never
+ | Emut m ->
+ let m' = emut (rsucc m.enode) in
+ let rec p () = [ m.enode ]
+ and u c = (* first update. *)
+ let u' c = eupdate (eval m) m' c in (* subsequent updates. *)
+ Node.bind m'.enode p u'
+ in
+ add_dep m m'.enode;
+ event m' p u
+
+ let app ef = function
+ | Never -> Never
+ | Emut m ->
+ match ef with
+ | Never -> Never
+ | Emut mf ->
+ let m' = emut (rsucc2 m.enode mf.enode) in
+ let rec p () = [ m.enode; mf.enode ]
+ and u c = match !(mf.ev), !(m.ev) with
+ | None, _ | _, None -> ()
+ | Some f, Some v -> eupdate (f v) m' c
+ in
+ add_dep m m'.enode;
+ add_dep mf m'.enode;
+ event m' p u
+
+ let map f = function
+ | Never -> Never
+ | Emut m ->
+ let m' = emut (rsucc m.enode) in
+ let rec p () = [ m.enode ]
+ and u c = eupdate (f (eval m)) m' c in
+ add_dep m m'.enode;
+ event m' p u
+
+ let stamp e v = match e with
+ | Never -> Never
+ | Emut m ->
+ let m' = emut (rsucc m.enode) in
+ let rec p () = [ m.enode ]
+ and u c = eupdate v m' c in
+ add_dep m m'.enode;
+ event m' p u
+
+ let filter pred = function
+ | Never -> Never
+ | Emut m ->
+ let m' = emut (rsucc m.enode) in
+ let rec p () = [ m.enode ]
+ and u c = let v = eval m in if pred v then eupdate v m' c else () in
+ add_dep m m'.enode;
+ event m' p u
+
+ let fmap fm = function
+ | Never -> Never
+ | Emut m ->
+ let m' = emut (rsucc m.enode) in
+ let rec p () = [ m.enode ]
+ and u c = match fm (eval m) with Some v -> eupdate v m' c | None -> ()
+ in
+ add_dep m m'.enode;
+ event m' p u
+
+ let diff d = function
+ | Never -> Never
+ | Emut m ->
+ let m' = emut (rsucc m.enode) in
+ let last = ref None in
+ let rec p () = [ m.enode ]
+ and u c =
+ let v = eval m in
+ match !last with
+ | None -> last := Some v
+ | Some v' -> last := Some v; eupdate (d v v') m' c
+ in
+ add_dep m m'.enode;
+ event m' p u
+
+ let changes ?(eq = ( = )) = function
+ | Never -> Never
+ | Emut m ->
+ let m' = emut (rsucc m.enode) in
+ let last = ref None in
+ let rec p () = [ m.enode ]
+ and u c =
+ let v = eval m in
+ match !last with
+ | None -> last := Some v; eupdate v m' c
+ | Some v' -> last := Some v; if eq v v' then () else eupdate v m' c
+ in
+ add_dep m m'.enode;
+ event m' p u
+
+ let on c = function
+ | Never -> Never
+ | Emut m as e ->
+ match c with
+ | Const true -> e
+ | Const false -> Never
+ | Smut mc ->
+ let m' = emut (rsucc2 m.enode mc.snode) in
+ let rec p () = [ m.enode; mc.snode ]
+ and u c = match !(m.ev) with
+ | None -> () (* mc updated. *)
+ | Some _ -> if (sval mc) then eupdate (eval m) m' c else ()
+ in
+ add_dep m m'.enode;
+ Node.add_dep mc.snode m'.enode;
+ event m' p u
+
+ let when_ = on
+
+ let dismiss c = function
+ | Never -> Never
+ | Emut m as e ->
+ match c with
+ | Never -> e
+ | Emut mc ->
+ let m' = emut (rsucc2 mc.enode m.enode) in
+ let rec p () = [ mc.enode; m.enode ]
+ and u c = match !(mc.ev) with
+ | Some _ -> ()
+ | None -> eupdate (eval m) m' c
+ in
+ add_dep mc m'.enode;
+ add_dep m m'.enode;
+ event m' p u
+
+ let until c = function
+ | Never -> Never
+ | Emut m as e ->
+ match c with
+ | Never -> e
+ | Emut mc ->
+ let m' = emut (rsucc2 m.enode mc.enode) in
+ let rec p () = [ m.enode; mc.enode] in
+ let u c = match !(mc.ev) with
+ | None -> eupdate (eval m) m' c
+ | Some _ ->
+ Node.rem_dep m.enode m'.enode;
+ Node.rem_dep mc.enode m'.enode;
+ Node.stop m'.enode
+ in
+ add_dep m m'.enode;
+ add_dep mc m'.enode;
+ event m' p u
+
+ (* Accumulating *)
+
+ let accum ef i = match ef with
+ | Never -> Never
+ | Emut m ->
+ let m' = emut (rsucc m.enode) in
+ let acc = ref i in
+ let rec p () = [ m.enode ]
+ and u c = acc := (eval m) !acc; eupdate !acc m' c in
+ add_dep m m'.enode;
+ event m' p u
+
+ let fold f i = function
+ | Never -> Never
+ | Emut m ->
+ let m' = emut (rsucc m.enode) in
+ let acc = ref i in
+ let rec p () = [ m.enode ]
+ and u c = acc := f !acc (eval m); eupdate !acc m' c in
+ add_dep m m'.enode;
+ event m' p u
+
+ (* Combining *)
+
+ let occurs m = !(m.ev) <> None
+ let find_muts_and_next_rank el =
+ let rec aux acc max = function
+ | [] -> List.rev acc, rsucc max
+ | (Emut m) :: l -> aux (m :: acc) (rmax max m.enode) l
+ | Never :: l -> aux acc max l
+ in
+ aux [] Node.rmin el
+
+ let select el =
+ let emuts, r = find_muts_and_next_rank el in
+ let m' = emut r in
+ let rec p () = List.rev_map (fun m -> m.enode) emuts
+ and u c = try eupdate (eval (List.find occurs emuts)) m' c with
+ | Not_found -> assert false
+ in
+ List.iter (fun m -> add_dep m m'.enode) emuts;
+ event m' p u
+
+ let merge f a el =
+ let rec fold f acc = function
+ | m :: l when occurs m -> fold f (f acc (eval m)) l
+ | m :: l -> fold f acc l
+ | [] -> acc
+ in
+ let emuts, r = find_muts_and_next_rank el in
+ let m' = emut r in
+ let rec p () = List.rev_map (fun m -> m.enode) emuts
+ and u c = eupdate (fold f a emuts) m' c in
+ List.iter (fun m -> add_dep m m'.enode) emuts;
+ event m' p u
+
+ let switch e = function
+ | Never -> e
+ | Emut ms ->
+ let r = match e with
+ | Emut m -> rsucc2 m.enode ms.enode | Never -> rsucc ms.enode
+ in
+ let m' = emut r in
+ let src = ref e in (* current event source. *)
+ let rec p () = match !src with
+ | Emut m -> [ m.enode; ms.enode ] | Never -> [ ms.enode ]
+ and u c = match !(ms.ev) with
+ | None -> (match !src with (* only src occurs. *)
+ | Emut m -> eupdate (eval m) m' c | Never -> assert false)
+ | Some e ->
+ begin match !src with
+ | Emut m -> Node.rem_dep m.enode m'.enode | Never -> ()
+ end;
+ src := e;
+ match e with
+ | Never -> ignore (Node.update_rank m'.enode (rsucc ms.enode))
+ | Emut m ->
+ Node.add_dep m.enode m'.enode;
+ if Node.update_rank m'.enode (rsucc2 m.enode ms.enode) then
+ begin
+ (* Rank increased because of m. Thus m may stil
+ update and we may be rescheduled. If it happens
+ we'll be in the other branch without any harm
+ but some redundant computation. *)
+ Step.allow_reschedule m'.enode;
+ Step.rebuild c;
+ end
+ else
+ (* No rank increase, m already updated if needed. *)
+ (match !(m.ev) with Some v -> eupdate v m' c | None -> ())
+ in
+ (match e with Emut m -> add_dep m m'.enode | Never -> ());
+ add_dep ms m'.enode;
+ event m' p u
+
+ let fix f =
+ let m = emut Node.delayed_rank in
+ let e = event m (fun () -> []) (fun _ -> assert false) in
+ match f e with
+ | Never, r -> r
+ | Emut m', r ->
+ if m'.enode.rank = Node.delayed_rank then invalid_arg err_fix;
+ let rec p () = [ (* avoid cyclic dep. *) ]
+ and u c = (* N.B. c is the next step. *)
+ let clear v () = v := None in
+ m.ev := Some (eval m');
+ Step.add_eop c (clear m.ev); (* vs. add_cop for regular events. *)
+ Step.add_deps c m.enode
+ in
+ Node.bind m.enode p u;
+ add_dep m' m.enode;
+ r
+
+ (* Lifting *)
+
+ let l1 = map
+ let l2 f e0 e1 = match e0, e1 with
+ | Never, _ -> Never
+ | _, Never -> Never
+ | Emut m0, Emut m1 ->
+ let r = rsucc2 m0.enode m1.enode in
+ let m' = emut r in
+ let rec p () = [ m0.enode; m1.enode ] in
+ let u c = match !(m0.ev), !(m1.ev) with
+ | None, _
+ | _, None -> ()
+ | Some v0, Some v1 -> eupdate (f v0 v1) m' c
+ in
+ add_dep m0 m'.enode;
+ add_dep m1 m'.enode;
+ event m' p u
+
+ let l3 f e0 e1 e2 = match e0, e1, e2 with
+ | Never, _, _ -> Never
+ | _, Never, _ -> Never
+ | _, _, Never -> Never
+ | Emut m0, Emut m1, Emut m2 ->
+ let r = rsucc (rmax (rmax m0.enode m1.enode) m2.enode) in
+ let m' = emut r in
+ let rec p () = [ m0.enode; m1.enode; m2.enode ] in
+ let u c = match !(m0.ev), !(m1.ev), !(m2.ev) with
+ | None, _, _
+ | _, None, _
+ | _, _, None -> ()
+ | Some v0, Some v1, Some v2 -> eupdate (f v0 v1 v2) m' c
+ in
+ add_dep m0 m'.enode;
+ add_dep m1 m'.enode;
+ add_dep m2 m'.enode;
+ event m' p u
+
+
+ let l4 f e0 e1 e2 e3 = match e0, e1, e2, e3 with
+ | Never, _, _, _ -> Never
+ | _, Never, _, _ -> Never
+ | _, _, Never, _ -> Never
+ | _, _, _, Never -> Never
+ | Emut m0, Emut m1, Emut m2, Emut m3 ->
+ let r = rsucc (rmax (rmax m0.enode m1.enode) (rmax m2.enode m3.enode)) in
+ let m' = emut r in
+ let rec p () = [ m0.enode; m1.enode; m2.enode; m3.enode ] in
+ let u c = match !(m0.ev), !(m1.ev), !(m2.ev), !(m3.ev) with
+ | None, _, _, _
+ | _, None, _, _
+ | _, _, None, _
+ | _, _, _, None -> ()
+ | Some v0, Some v1, Some v2, Some v3 -> eupdate (f v0 v1 v2 v3) m' c
+ in
+ add_dep m0 m'.enode;
+ add_dep m1 m'.enode;
+ add_dep m2 m'.enode;
+ add_dep m3 m'.enode;
+ event m' p u
+
+ let l5 f e0 e1 e2 e3 e4 = match e0, e1, e2, e3, e4 with
+ | Never, _, _, _, _ -> Never
+ | _, Never, _, _, _ -> Never
+ | _, _, Never, _, _ -> Never
+ | _, _, _, Never, _ -> Never
+ | _, _, _, _, Never -> Never
+ | Emut m0, Emut m1, Emut m2, Emut m3, Emut m4 ->
+ let r =
+ rsucc (rmax (rmax (rmax m0.enode m1.enode) (rmax m2.enode m3.enode))
+ m4.enode)
+ in
+ let m' = emut r in
+ let rec p () = [ m0.enode; m1.enode; m2.enode; m3.enode; m4.enode ] in
+ let u c = match !(m0.ev), !(m1.ev), !(m2.ev), !(m3.ev), !(m4.ev) with
+ | None, _, _, _, _
+ | _, None, _, _, _
+ | _, _, None, _, _
+ | _, _, _, None, _
+ | _, _, _, _, None -> ()
+ | Some v0, Some v1, Some v2, Some v3, Some v4 ->
+ eupdate (f v0 v1 v2 v3 v4) m' c
+ in
+ add_dep m0 m'.enode;
+ add_dep m1 m'.enode;
+ add_dep m2 m'.enode;
+ add_dep m3 m'.enode;
+ add_dep m4 m'.enode;
+ event m' p u
+
+ let l6 f e0 e1 e2 e3 e4 e5 = match e0, e1, e2, e3, e4, e5 with
+ | Never, _, _, _, _, _ -> Never
+ | _, Never, _, _, _, _ -> Never
+ | _, _, Never, _, _, _ -> Never
+ | _, _, _, Never, _, _ -> Never
+ | _, _, _, _, Never, _ -> Never
+ | _, _, _, _, _, Never -> Never
+ | Emut m0, Emut m1, Emut m2, Emut m3, Emut m4, Emut m5 ->
+ let r =
+ rsucc (rmax (rmax (rmax m0.enode m1.enode) (rmax m2.enode m3.enode))
+ (rmax m4.enode m5.enode))
+ in
+ let m' = emut r in
+ let rec p () = [ m0.enode; m1.enode; m2.enode; m3.enode; m4.enode;
+ m5.enode; ] in
+ let u c = match !(m0.ev), !(m1.ev), !(m2.ev), !(m3.ev), !(m4.ev),
+ !(m5.ev) with
+ | None, _, _, _, _, _
+ | _, None, _, _, _, _
+ | _, _, None, _, _, _
+ | _, _, _, None, _, _
+ | _, _, _, _, None, _
+ | _, _, _, _, _, None -> ()
+ | Some v0, Some v1, Some v2, Some v3, Some v4, Some v5 ->
+ eupdate (f v0 v1 v2 v3 v4 v5) m' c
+ in
+ add_dep m0 m'.enode;
+ add_dep m1 m'.enode;
+ add_dep m2 m'.enode;
+ add_dep m3 m'.enode;
+ add_dep m4 m'.enode;
+ add_dep m5 m'.enode;
+ event m' p u
+
+ (* Pervasives support *)
+
+ module Option = struct
+ let some e = map (fun v -> Some v) e
+ let value ?default e = match default with
+ | None -> fmap (fun v -> v) e
+ | Some (Const dv) -> map (function None -> dv | Some v -> v) e
+ | Some (Smut ms) ->
+ match e with
+ | Never -> Never
+ | Emut m ->
+ let m' = emut (rsucc2 m.enode ms.snode) in
+ let rec p () = [ m.enode; ms.snode ]
+ and u c = match !(m.ev) with
+ | None -> () (* ms updated. *)
+ | Some None -> eupdate (sval ms) m' c
+ | Some Some v -> eupdate v m' c
+ in
+ add_dep m m'.enode;
+ Node.add_dep ms.snode m'.enode;
+ event m' p u
+ end
+end
+
+module S = struct
+ type 'a t = 'a signal
+
+ let set_sval v m c = m.sv <- Some v; Step.add_deps c m.snode
+ let set m ?step v = (* starts an update step. *)
+ if m.eq (sval m) v then () else
+ match step with
+ | Some c ->
+ if c.over then invalid_arg err_step_executed else
+ if not m.snode.stamp.over then invalid_arg err_signal_scheduled else
+ m.snode.stamp <- c;
+ m.sv <- Some v;
+ Step.add_deps c m.snode
+ | None ->
+ let c = Step.create () in
+ m.snode.stamp <- c;
+ m.sv <- Some v;
+ Step.add_deps c m.snode;
+ Step.execute c
+
+ let end_of_step_add_dep ?(post_add_op = fun () -> ()) ~stop_if_stopped m m' =
+ (* In some combinators, when the semantics of event m' is such
+ that it should not occur in the (potential) step it is created,
+ we add the dependency [m'] to signal [m] only via an end of
+ step operation to avoid being scheduled in the step. *)
+ match Step.find_unfinished (m.snode.producers ()) with
+ | c when c == Step.nil ->
+ Node.add_dep m.snode m'.enode;
+ post_add_op ();
+ | c ->
+ let add_dep () =
+ if m.snode.update == Node.nop then
+ (* m stopped in step *)
+ (if stop_if_stopped then Node.stop m'.enode)
+ else
+ begin
+ ignore (Node.update_rank m'.enode (rsucc m.snode));
+ Node.add_dep m.snode m'.enode;
+ post_add_op ();
+ end
+ in
+ Step.add_eop c add_dep
+
+ (* Basics *)
+
+ let const v = Const v
+ let create ?(eq = ( = )) v =
+ let m = smut Node.min_rank eq in
+ m.sv <- Some v;
+ Smut m, set m
+
+ let retain s c = match s with
+ | Const _ -> invalid_arg err_retain_cst_sig
+ | Smut m -> let c' = m.snode.retain in m.snode.retain <- c; (`R c')
+
+ let eq_fun = function Const _ -> None | Smut m -> Some m.eq
+
+ let value = function
+ | Const v | Smut { sv = Some v } -> v
+ | Smut { sv = None } -> failwith err_sig_undef
+
+ let stop ?strong =
+ function Const _ -> () | Smut m -> Node.stop ?strong m.snode
+
+ let equal ?(eq = ( = )) s s' = match s, s' with
+ | Const v, Const v' -> eq v v'
+ | Const _, _ | _, Const _ -> false
+ | Smut m, Smut m' -> m == m'
+
+ let trace ?(iff = const true) t s = match iff with
+ | Const false -> s
+ | Const true ->
+ begin match s with
+ | Const v -> t v; s
+ | Smut m ->
+ let m' = smut (rsucc m.snode) m.eq in
+ let rec p () = [ m.snode ] in
+ let u c = let v = sval m in t v; supdate v m' c in
+ Node.add_dep m.snode m'.snode;
+ signal m' p u
+ end
+ | Smut mc ->
+ match s with
+ | Const v ->
+ let m' = smut (rsucc mc.snode) ( = ) (* we don't care about eq *) in
+ let rec p () = [ mc.snode ]
+ and u c =
+ if (sval mc) then t v;
+ Node.rem_dep mc.snode m'.snode;
+ Node.stop m'.snode;
+ in
+ Node.add_dep mc.snode m'.snode;
+ signal ~i:v m' p u
+ | Smut m ->
+ let m' = smut (rsucc2 mc.snode m.snode) m.eq in
+ let rec p () = [ mc.snode; m.snode ]
+ and u c =
+ let v = sval m in
+ match m'.sv with
+ | Some v' when m'.eq v v' -> () (* mc updated. *)
+ | _ -> if (sval mc) then t v; supdate v m' c (* init or diff. *)
+ in
+ Node.add_dep mc.snode m'.snode;
+ Node.add_dep m.snode m'.snode;
+ signal m' p u
+
+ (* From events *)
+
+ let hold ?(eq = ( = )) i = function
+ | Never -> Const i
+ | Emut m ->
+ let m' = smut (rsucc m.enode) eq in
+ let rec p () = [ m.enode ]
+ and u c = match !(m.ev) with
+ | None -> () (* init. only. *)
+ | Some v -> supdate v m' c
+ in
+ E.add_dep m m'.snode;
+ signal ~i m' p u
+
+ (* Filtering and transforming *)
+
+ let map ?(eq = ( = )) f = function
+ | Const v -> Const (f v)
+ | Smut m ->
+ let m' = smut (rsucc m.snode) eq in
+ let rec p () = [ m.snode ]
+ and u c = supdate (f (sval m)) m' c in
+ Node.add_dep m.snode m'.snode;
+ signal m' p u
+
+ let app ?(eq = ( = )) sf sv = match sf, sv with
+ | Smut mf, Smut mv ->
+ let m' = smut (rsucc2 mf.snode mv.snode) eq in
+ let rec p () = [ mf.snode; mv.snode ]
+ and u c = supdate ((sval mf) (sval mv)) m' c in
+ Node.add_dep mf.snode m'.snode;
+ Node.add_dep mv.snode m'.snode;
+ signal m' p u
+ | Const f, Const v -> Const (f v)
+ | Const f, sv -> map ~eq f sv
+ | Smut mf, Const v ->
+ let m' = smut (rsucc mf.snode) eq in
+ let rec p () = [ mf.snode ]
+ and u c = supdate ((sval mf) v) m' c in
+ Node.add_dep mf.snode m'.snode;
+ signal m' p u
+
+ let filter ?(eq = ( = )) pred i = function
+ | Const v as s -> if pred v then s else Const i
+ | Smut m ->
+ let m' = smut (rsucc m.snode) eq in
+ let rec p () = [ m.snode ]
+ and u c = let v = sval m in if pred v then supdate v m' c else () in
+ Node.add_dep m.snode m'.snode;
+ signal ~i m' p u
+
+ let fmap ?(eq = ( = )) fm i = function
+ | Const v -> (match fm v with Some v' -> Const v' | None -> Const i)
+ | Smut m ->
+ let m' = smut (rsucc m.snode) eq in
+ let rec p () = [ m.snode ]
+ and u c = match fm (sval m) with Some v -> supdate v m' c | None -> ()
+ in
+ Node.add_dep m.snode m'.snode;
+ signal ~i m' p u
+
+ let diff d = function
+ | Const _ -> Never
+ | Smut m ->
+ let m' = emut (rsucc m.snode) in
+ let last = ref None in
+ let rec p () = [ m.snode ]
+ and u c =
+ let v = sval m in
+ match !last with
+ | Some v' -> last := Some v; eupdate (d v v') m' c
+ | None -> assert false
+ in
+ let post_add_op () = last := Some (sval m) in
+ end_of_step_add_dep ~post_add_op ~stop_if_stopped:true m m';
+ event m' p u
+
+ let changes = function
+ | Const _ -> Never
+ | Smut m ->
+ let m' = emut (rsucc m.snode) in
+ let rec p () = [ m.snode ]
+ and u c = eupdate (sval m) m' c in
+ end_of_step_add_dep ~stop_if_stopped:true m m';
+ event m' p u
+
+ let sample f e = function
+ | Const v -> E.map (fun ev -> f ev v) e
+ | Smut ms ->
+ match e with
+ | Never -> Never
+ | Emut me ->
+ let m' = emut (rsucc2 me.enode ms.snode) in
+ let rec p () = [ me.enode; ms.snode ]
+ and u c = match !(me.ev) with
+ | None -> () (* ms updated *)
+ | Some v -> eupdate (f v (sval ms)) m' c
+ in
+ E.add_dep me m'.enode;
+ Node.add_dep ms.snode m'.enode;
+ event m' p u
+
+ let on ?(eq = ( = )) c i s = match c with
+ | Const true -> s
+ | Const false -> Const i
+ | Smut mc ->
+ match s with
+ | Const v ->
+ let m' = smut (rsucc mc.snode) eq in
+ let rec p () = [ mc.snode ]
+ and u c = if (sval mc) then supdate v m' c else () in
+ Node.add_dep mc.snode m'.snode;
+ signal ~i m' p u
+ | Smut ms ->
+ let m' = smut (rsucc2 mc.snode ms.snode) eq in
+ let rec p () = [ mc.snode; ms.snode ]
+ and u c = if (sval mc) then supdate (sval ms) m' c else () in
+ Node.add_dep mc.snode m'.snode;
+ Node.add_dep ms.snode m'.snode;
+ signal ~i m' p u
+
+ let when_ = on
+
+ let dismiss ?(eq = ( = )) c i s = match c with
+ | Never -> s
+ | Emut mc ->
+ match s with
+ | Const v ->
+ let m' = smut (rsucc mc.enode) eq in
+ let rec p () = [ mc.enode ]
+ and u c = match !(mc.ev) with
+ | Some _ -> () | None -> supdate v m' c
+ in
+ Node.add_dep mc.enode m'.snode;
+ signal ~i m' p u
+ | Smut ms ->
+ let m' = smut (rsucc2 mc.enode ms.snode) eq in
+ let rec p () = [ mc.enode; ms.snode ]
+ and u c = match !(mc.ev) with
+ | Some _ -> () | None -> supdate (sval ms) m' c
+ in
+ Node.add_dep mc.enode m'.snode;
+ Node.add_dep ms.snode m'.snode;
+ signal ~i m' p u
+
+ (* Accumulating *)
+
+ let accum ?(eq = ( = )) ef i = match ef with
+ | Never -> Const i
+ | Emut m ->
+ let m' = smut (rsucc m.enode) eq in
+ let rec p () = [ m.enode ]
+ and u c = match !(m.ev) with
+ | None -> () (* init only. *)
+ | Some v -> supdate (v (sval m')) m' c
+ in
+ E.add_dep m m'.snode;
+ signal ~i m' p u
+
+ let fold ?(eq = ( = )) f i = function
+ | Never -> Const i
+ | Emut m ->
+ let m' = smut (rsucc m.enode) eq in
+ let rec p () = [ m.enode ]
+ and u c = match !(m.ev) with
+ | None -> () (* init only. *)
+ | Some v -> supdate (f (sval m') v) m' c in
+ E.add_dep m m'.snode;
+ signal ~i m' p u
+
+ (* Combining *)
+
+ let merge ?(eq = ( = )) f a sl =
+ let rmax' acc = function Const _ -> acc | Smut m -> rmax acc m.snode in
+ let nodes acc = function Const _ -> acc | Smut m -> m.snode :: acc in
+ let merger f a = function Const v -> f a v | Smut m -> f a (sval m) in
+ let m' = smut (rsucc (List.fold_left rmax' Node.rmin sl)) eq in
+ let rec p () = List.fold_left nodes [] sl
+ and u c = supdate (List.fold_left (merger f) a sl) m' c in
+ let dep = function Const _ -> ()| Smut m -> Node.add_dep m.snode m'.snode in
+ List.iter dep sl;
+ signal m' p u
+
+ let switch ?(eq = ( = )) = function
+ | Const s -> s
+ | Smut mss ->
+ let dummy = smut Node.min_rank eq in
+ let src = ref (Smut dummy) in (* dummy is overwritten by sig. init *)
+ let m' = smut (rsucc mss.snode) eq in
+ let rec p () = match !src with
+ | Smut m -> [ mss.snode; m.snode] | Const _ -> [ mss.snode ]
+ and u c =
+ if (sval mss) == !src then (* ss didn't change, !src did *)
+ begin match !src with
+ | Smut m -> supdate (sval m) m' c
+ | Const _ -> () (* init only. *)
+ end
+ else (* ss changed *)
+ begin
+ begin match !src with
+ | Smut m -> Node.rem_dep m.snode m'.snode
+ | Const _ -> ()
+ end;
+ let new_src = sval mss in
+ src := new_src;
+ match new_src with
+ | Const v ->
+ ignore (Node.update_rank m'.snode (rsucc mss.snode));
+ supdate v m' c
+ | Smut m ->
+ Node.add_dep m.snode m'.snode;
+ if c == Step.nil then
+ begin
+ ignore (Node.update_rank m'.snode
+ (rsucc2 m.snode mss.snode));
+ (* Check if the init src is in a step. *)
+ match Step.find_unfinished [m.snode] with
+ | c when c == Step.nil -> supdate (sval m) m' c
+ | c -> Step.add c m'.snode
+ end
+ else
+ if Node.update_rank m'.snode (rsucc2 m.snode mss.snode) then
+ begin
+ (* Rank increased because of m. Thus m may still
+ update and we need to reschedule. Next time we
+ will be in the other branch. *)
+ Step.allow_reschedule m'.snode;
+ Step.rebuild c;
+ Step.add c m'.snode
+ end
+ else
+ (* No rank increase. m already updated if needed, no need
+ to reschedule and rebuild the queue. *)
+ supdate (sval m) m' c
+ end
+ in
+ Node.add_dep mss.snode m'.snode;
+ (* We add a dep to dummy to avoid a long scan of Wa.rem when we remove
+ the dep in the [u] function during static init. *)
+ Node.add_dep dummy.snode m'.snode;
+ signal m' p u
+
+ let bind ?eq s sf = switch ?eq (map ~eq:( == ) sf s)
+
+ let fix ?(eq = ( = )) i f =
+ let update_delayed n p u nl =
+ Node.bind n p u;
+ match Step.find_unfinished nl with
+ | c when c == Step.nil ->
+ (* no pertinent occuring step, create a step for update. *)
+ let c = Step.create () in
+ n.update c;
+ Step.execute c
+ | c -> Step.add c n
+ in
+ let m = smut Node.delayed_rank eq in
+ let s = signal ~i m (fun () -> []) (fun _ -> ()) in
+ match f s with
+ | Const v, r ->
+ let rec p () = []
+ and u c = supdate v m c in
+ update_delayed m.snode p u (Node.deps m.snode);
+ r
+ | Smut m', r ->
+ if m'.snode.rank = Node.delayed_rank then invalid_arg err_fix;
+ let rec p () = [ (* avoid cyclic dep. *) ]
+ and u c = supdate (sval m') m c in (* N.B. c is the next step. *)
+ Node.add_dep m'.snode m.snode;
+ update_delayed m.snode p u (m'.snode :: Node.deps m.snode);
+ r
+
+ (* Lifting *)
+
+ let l1 = map
+ let l2 ?(eq = ( = )) f s s' = match s, s' with
+ | Smut m0, Smut m1 ->
+ let m' = smut (rsucc2 m0.snode m1.snode) eq in
+ let rec p () = [ m0.snode; m1.snode ]
+ and u c = supdate (f (sval m0) (sval m1)) m' c in
+ Node.add_dep m0.snode m'.snode;
+ Node.add_dep m1.snode m'.snode;
+ signal m' p u
+ | Const v, Const v' -> Const (f v v')
+ | Const v, Smut m ->
+ let m' = smut (rsucc m.snode) eq in
+ let rec p () = [ m.snode ]
+ and u c = supdate (f v (sval m)) m' c in
+ Node.add_dep m.snode m'.snode;
+ signal m' p u
+ | Smut m, Const v ->
+ let m' = smut (rsucc m.snode) eq in
+ let rec p () = [ m.snode ]
+ and u c = supdate (f (sval m) v) m' c in
+ Node.add_dep m.snode m'.snode;
+ signal m' p u
+
+ let l3 ?(eq = ( = )) f s0 s1 s2 = match s0, s1, s2 with
+ | Smut m0, Smut m1, Smut m2 ->
+ let r = rsucc (rmax (rmax m0.snode m1.snode) m2.snode) in
+ let m' = smut r eq in
+ let rec p () = [ m0.snode; m1.snode; m2.snode ]
+ and u c = supdate (f (sval m0) (sval m1) (sval m2)) m' c in
+ Node.add_dep m0.snode m'.snode;
+ Node.add_dep m1.snode m'.snode;
+ Node.add_dep m2.snode m'.snode;
+ signal m' p u
+ | Const v0, Const v1, Const v2 -> Const (f v0 v1 v2)
+ | s0, s1, s2 -> app ~eq (l2 ~eq:( == ) f s0 s1) s2
+
+ let l4 ?(eq = ( = )) f s0 s1 s2 s3 = match s0, s1, s2, s3 with
+ | Smut m0, Smut m1, Smut m2, Smut m3 ->
+ let r = rsucc (rmax (rmax m0.snode m1.snode) (rmax m2.snode m3.snode)) in
+ let m' = smut r eq in
+ let rec p () = [ m0.snode; m1.snode; m2.snode; m3.snode ]
+ and u c = supdate (f (sval m0) (sval m1) (sval m2) (sval m3)) m' c in
+ Node.add_dep m0.snode m'.snode;
+ Node.add_dep m1.snode m'.snode;
+ Node.add_dep m2.snode m'.snode;
+ Node.add_dep m3.snode m'.snode;
+ signal m' p u
+ | Const v0, Const v1, Const v2, Const v3 -> Const (f v0 v1 v2 v3)
+ | s0, s1, s2, s3 -> app ~eq (l3 ~eq:( == ) f s0 s1 s2) s3
+
+ let l5 ?(eq = ( = )) f s0 s1 s2 s3 s4 = match s0, s1, s2, s3, s4 with
+ | Smut m0, Smut m1, Smut m2, Smut m3, Smut m4 ->
+ let m = rmax in
+ let r = rsucc (m (m m0.snode m1.snode)
+ (m m2.snode (m m3.snode m4.snode)))
+ in
+ let m' = smut r eq in
+ let rec p () = [ m0.snode; m1.snode; m2.snode; m3.snode; m4.snode ]
+ and u c =
+ let v = f (sval m0) (sval m1) (sval m2) (sval m3) (sval m4) in
+ supdate v m' c
+ in
+ Node.add_dep m0.snode m'.snode;
+ Node.add_dep m1.snode m'.snode;
+ Node.add_dep m2.snode m'.snode;
+ Node.add_dep m3.snode m'.snode;
+ Node.add_dep m4.snode m'.snode;
+ signal m' p u
+ | Const v0, Const v1, Const v2, Const v3, Const v4 -> Const (f v0 v1 v2 v3 v4)
+ | s0, s1, s2, s3, s4 -> app ~eq (l4 ~eq:( == ) f s0 s1 s2 s3) s4
+
+ let l6 ?(eq = ( = )) f s0 s1 s2 s3 s4 s5 = match s0, s1, s2, s3, s4, s5 with
+ | Smut m0, Smut m1, Smut m2, Smut m3, Smut m4, Smut m5 ->
+ let m = rmax in
+ let m = m (m m0.snode (m m1.snode m2.snode))
+ (m m3.snode (m m4.snode m5.snode))
+ in
+ let m' = smut (rsucc m) eq in
+ let rec p () =
+ [ m0.snode; m1.snode; m2.snode; m3.snode; m4.snode; m5.snode ]
+ and u c =
+ let v = f (sval m0) (sval m1) (sval m2) (sval m3) (sval m4) (sval m5) in
+ supdate v m' c
+ in
+ Node.add_dep m0.snode m'.snode;
+ Node.add_dep m1.snode m'.snode;
+ Node.add_dep m2.snode m'.snode;
+ Node.add_dep m3.snode m'.snode;
+ Node.add_dep m4.snode m'.snode;
+ Node.add_dep m5.snode m'.snode;
+ signal m' p u
+ | Const v0, Const v1, Const v2, Const v3, Const v4, Const v5->
+ Const (f v0 v1 v2 v3 v4 v5)
+ | s0, s1, s2, s3, s4, s5 -> app ~eq (l5 ~eq:( == ) f s0 s1 s2 s3 s4) s5
+
+ module Bool = struct
+ let one = Const true
+ let zero = Const false
+ let eq : bool -> bool -> bool = ( = )
+ let not s = l1 ~eq not s
+ let ( && ) s s' = l2 ~eq ( && ) s s'
+ let ( || ) s s' = l2 ~eq ( || ) s s'
+
+ let edge s = changes s
+ let edge_detect edge = function
+ | Const _ -> Never
+ | Smut m ->
+ let m' = emut (rsucc m.snode) in
+ let rec p () = [ m.snode ]
+ and u c = if (sval m) = edge then eupdate () m' c in
+ end_of_step_add_dep ~stop_if_stopped:true m m';
+ event m' p u
+
+ let rise s = edge_detect true s
+ let fall s = edge_detect false s
+ let flip b = function
+ | Never -> Const b
+ | Emut m ->
+ let m' = smut (rsucc m.enode) ( = ) in
+ let rec p () = [ m.enode ]
+ and u c = supdate (Pervasives.not (sval m')) m' c in
+ E.add_dep m m'.snode;
+ (* can't use [signal] here because of semantics. *)
+ Node.bind m'.snode p u;
+ m'.sv <- Some b;
+ begin match Step.find_unfinished [m.enode] with
+ | c when c == Step.nil -> ()
+ | c -> Step.add c m'.snode
+ end;
+ Smut m'
+
+ end
+
+ module Int = struct
+ let zero = Const 0
+ let one = Const 1
+ let minus_one = Const (-1)
+ let eq : int -> int -> bool = ( = )
+ let ( ~- ) s = l1 ~eq ( ~- ) s
+ let succ s = l1 ~eq succ s
+ let pred s = l1 ~eq pred s
+ let ( + ) s s' = l2 ~eq ( + ) s s'
+ let ( - ) s s' = l2 ~eq ( - ) s s'
+ let ( * ) s s' = l2 ~eq ( * ) s s'
+ let ( mod ) s s' = l2 ~eq ( mod ) s s'
+ let abs s = l1 ~eq abs s
+ let max_int = const max_int
+ let min_int = const min_int
+ let ( land ) s s' = l2 ~eq ( land ) s s'
+ let ( lor ) s s' = l2 ~eq ( lor ) s s'
+ let ( lxor ) s s' = l2 ~eq ( lxor ) s s'
+ let lnot s = l1 ~eq lnot s
+ let ( lsl ) s s' = l2 ~eq ( lsl ) s s'
+ let ( lsr ) s s' = l2 ~eq ( lsr ) s s'
+ let ( asr ) s s' = l2 ~eq ( asr ) s s'
+ end
+
+ module Float = struct
+ let zero = Const 0.
+ let one = Const 1.
+ let minus_one = Const (-1.)
+ let eq : float -> float -> bool = ( = )
+ let ( ~-. ) s = l1 ~eq ( ~-. ) s
+ let ( +. ) s s' = l2 ~eq ( +. ) s s'
+ let ( -. ) s s' = l2 ~eq ( -. ) s s'
+ let ( *. ) s s' = l2 ~eq ( *. ) s s'
+ let ( /. ) s s' = l2 ~eq ( /. ) s s'
+ let ( ** ) s s' = l2 ~eq ( ** ) s s'
+ let sqrt s = l1 ~eq sqrt s
+ let exp s = l1 ~eq exp s
+ let log s = l1 ~eq log s
+ let log10 s = l1 ~eq log10 s
+ let cos s = l1 ~eq cos s
+ let sin s = l1 ~eq sin s
+ let tan s = l1 ~eq tan s
+ let acos s = l1 ~eq acos s
+ let asin s = l1 ~eq asin s
+ let atan s = l1 ~eq atan s
+ let atan2 s s' = l2 ~eq atan2 s s'
+ let cosh s = l1 ~eq cosh s
+ let sinh s = l1 ~eq sinh s
+ let tanh s = l1 ~eq tanh s
+ let ceil s = l1 ~eq ceil s
+ let floor s = l1 ~eq floor s
+ let abs_float s = l1 ~eq abs_float s
+ let mod_float s s' = l2 ~eq mod_float s s'
+ let frexp s = l1 ~eq:( = ) frexp s
+ let ldexp s s' = l2 ~eq ldexp s s'
+ let modf s = l1 ~eq:( = ) modf s
+ let float s = l1 ~eq float s
+ let float_of_int s = l1 ~eq float_of_int s
+ let truncate s = l1 ~eq:Int.eq truncate s
+ let int_of_float s = l1 ~eq:Int.eq int_of_float s
+ let infinity = const infinity
+ let neg_infinity = const neg_infinity
+ let nan = const nan
+ let max_float = const max_float
+ let min_float = const min_float
+ let epsilon_float = const epsilon_float
+ let classify_float s = l1 ~eq:( = ) classify_float s
+ end
+
+ module Pair = struct
+ let pair ?eq s s' = l2 ?eq (fun x y -> x, y) s s'
+ let fst ?eq s = l1 ?eq fst s
+ let snd ?eq s = l1 ?eq snd s
+ end
+
+ module Option = struct
+ let none = Const None
+ let some s =
+ let eq = match eq_fun s with
+ | None -> None
+ | Some eq ->
+ let eq v v' = match v, v' with
+ | Some v, Some v' -> eq v v'
+ | _ -> assert false
+ in
+ Some eq
+ in
+ map ?eq (fun v -> Some v) s
+
+ let value ?(eq = ( = )) ~default s = match s with
+ | Const (Some v) -> Const v
+ | Const None ->
+ let d = match default with `Init d -> d | `Always d -> d in
+ begin match d with
+ | Const d -> Const d
+ | Smut md ->
+ match Step.find_unfinished [md.snode] with
+ | c when c == Step.nil -> Const (sval md)
+ | c ->
+ let m' = smut (rsucc md.snode) eq in
+ let rec p () = [ md.snode ]
+ and u c =
+ Node.rem_dep md.snode m'.snode;
+ supdate (sval md) m' c;
+ Node.stop m'.snode
+ in
+ Node.add_dep md.snode m'.snode;
+ signal m' p u
+ end
+ | Smut m ->
+ match default with
+ | `Init (Const d) -> fmap ~eq (fun v -> v) d s
+ | `Always (Const d) -> map ~eq (function None -> d | Some v -> v) s
+ | `Init (Smut md) ->
+ begin match Step.find_unfinished [md.snode] with
+ | c when c == Step.nil ->
+ let m' = smut (rsucc m.snode) eq in
+ let rec p () = [ m.snode ]
+ and u c = match sval m with
+ | Some v -> supdate v m' c | None -> ()
+ in
+ Node.add_dep m.snode m'.snode;
+ signal ~i:(sval md) m' p u
+ | c ->
+ let m' = smut (rsucc2 m.snode md.snode) eq in
+ let rec p () = [ m.snode ] in (* subsequent updates *)
+ let u c = match sval m with
+ | Some v -> supdate v m' c | None -> ()
+ in
+ let rec p_first () = [ m.snode; md.snode ] in (* first update *)
+ let u_first c =
+ Node.rem_dep md.snode m'.snode;
+ begin match sval m with
+ | None -> supdate (sval md) m' c
+ | Some v -> supdate v m' c
+ end;
+ Node.bind m'.snode p u
+ in
+ Node.add_dep m.snode m'.snode;
+ Node.add_dep md.snode m'.snode;
+ signal m' p_first u_first
+ end
+ | `Always (Smut md) ->
+ let m' = smut (rsucc2 m.snode md.snode) eq in
+ let rec p () = [ m.snode; md.snode ] in
+ let u c = match sval m with
+ | Some v -> supdate v m' c
+ | None -> supdate (sval md) m' c
+ in
+ Node.add_dep m.snode m'.snode;
+ Node.add_dep md.snode m'.snode;
+ signal m' p u
+ end
+
+ module Compare = struct
+ let eq = Bool.eq
+ let ( = ) s s' = l2 ~eq ( = ) s s'
+ let ( <> ) s s' = l2 ~eq ( <> ) s s'
+ let ( < ) s s' = l2 ~eq ( < ) s s'
+ let ( > ) s s' = l2 ~eq ( > ) s s'
+ let ( <= ) s s' = l2 ~eq ( <= ) s s'
+ let ( >= ) s s' = l2 ~eq ( >= ) s s'
+ let compare s s' = l2 ~eq:Int.eq compare s s'
+ let ( == ) s s' = l2 ~eq ( == ) s s'
+ let ( != ) s s' = l2 ~eq ( != ) s s'
+ end
+
+ (* Combinator specialization *)
+
+ module type EqType = sig
+ type 'a t
+ val equal : 'a t -> 'a t -> bool
+ end
+
+ module type S = sig
+ type 'a v
+ val create : 'a v -> 'a v signal * (?step:step -> 'a v -> unit)
+ val equal : 'a v signal -> 'a v signal -> bool
+ val hold : 'a v -> 'a v event -> 'a v signal
+ val app : ('a -> 'b v) signal -> 'a signal -> 'b v signal
+ val map : ('a -> 'b v) -> 'a signal -> 'b v signal
+ val filter : ('a v -> bool) -> 'a v -> 'a v signal -> 'a v signal
+ val fmap : ('a -> 'b v option) -> 'b v -> 'a signal -> 'b v signal
+ val when_ : bool signal -> 'a v -> 'a v signal -> 'a v signal
+ val dismiss : 'b event -> 'a v -> 'a v signal -> 'a v signal
+ val accum : ('a v -> 'a v) event -> 'a v -> 'a v signal
+ val fold : ('a v -> 'b -> 'a v) -> 'a v -> 'b event -> 'a v signal
+ val merge : ('a v -> 'b -> 'a v) -> 'a v -> 'b signal list -> 'a v signal
+ val switch : 'a v signal signal -> 'a v signal
+ val bind : 'b signal -> ('b -> 'a v signal) -> 'a v signal
+ val fix : 'a v -> ('a v signal -> 'a v signal * 'b) -> 'b
+ val l1 : ('a -> 'b v) -> ('a signal -> 'b v signal)
+ val l2 : ('a -> 'b -> 'c v) -> ('a signal -> 'b signal -> 'c v signal)
+ val l3 : ('a -> 'b -> 'c -> 'd v) -> ('a signal -> 'b signal -> 'c signal
+ -> 'd v signal)
+ val l4 : ('a -> 'b -> 'c -> 'd -> 'e v) ->
+ ('a signal -> 'b signal -> 'c signal -> 'd signal -> 'e v signal)
+ val l5 : ('a -> 'b -> 'c -> 'd -> 'e -> 'f v) ->
+ ('a signal -> 'b signal -> 'c signal -> 'd signal -> 'e signal ->
+ 'f v signal)
+ val l6 : ('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g v) ->
+ ('a signal -> 'b signal -> 'c signal -> 'd signal -> 'e signal ->
+ 'f signal -> 'g v signal)
+ end
+
+ module Make (Eq : EqType) = struct
+ type 'a v = 'a Eq.t
+ let eq = Eq.equal
+ let create v = create ~eq v
+ let equal s s' = equal ~eq s s'
+ let hold v e = hold ~eq v e
+ let app sf sv = app ~eq sf sv
+ let map f s = map ~eq f s
+ let filter pred i = filter ~eq pred i
+ let fmap fm i = fmap ~eq fm i
+ let when_ c i s = when_ ~eq c i s
+ let dismiss c s = dismiss ~eq c s
+ let accum ef i = accum ~eq ef i
+ let fold f i = fold ~eq f i
+ let merge f a sl = merge ~eq f a sl
+ let switch s = switch ~eq s
+ let bind s sf = bind ~eq s sf
+ let fix f = fix ~eq f
+ let l1 = map
+ let l2 f s s' = l2 ~eq f s s'
+ let l3 f s0 s1 s2 = l3 ~eq f s0 s1 s2
+ let l4 f s0 s1 s2 s3 = l4 ~eq f s0 s1 s2 s3
+ let l5 f s0 s1 s2 s3 s4 = l5 ~eq f s0 s1 s2 s3 s4
+ let l6 f s0 s1 s2 s3 s4 s5 = l6 ~eq f s0 s1 s2 s3 s4 s5
+ end
+
+ module Special = struct
+ module Sb = Make (struct type 'a t = bool let equal = Bool.eq end)
+ module Si = Make (struct type 'a t = int let equal = Int.eq end)
+ module Sf = Make (struct type 'a t = float let equal = Float.eq end)
+ end
+end
+
+(*---------------------------------------------------------------------------
+ Copyright (c) 2009 Daniel C. Bünzli
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the
+ distribution.
+
+ 3. Neither the name of Daniel C. Bünzli nor the names of
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ---------------------------------------------------------------------------*)
diff --git a/src/react.mli b/src/react.mli
new file mode 100644
index 0000000..90fb6cf
--- /dev/null
+++ b/src/react.mli
@@ -0,0 +1,1131 @@
+(*---------------------------------------------------------------------------
+ Copyright (c) 2009 Daniel C. Bünzli. All rights reserved.
+ Distributed under a BSD3 license, see license at the end of the file.
+ react release 1.2.0
+ ---------------------------------------------------------------------------*)
+
+(** Declarative events and signals.
+
+ React is a module for functional reactive programming (frp). It
+ provides support to program with time varying values : declarative
+ {{!E}events} and {{!S}signals}. React
+ doesn't define any primitive event or signal, this lets the client
+ choose the concrete timeline.
+
+ Consult the {{!sem}semantics}, the {{!basics}basics} and
+ {{!ex}examples}. Open the module to use it, this defines only two
+ types and modules in your scope.
+
+ {e Release 1.2.0 - Daniel Bünzli <daniel.buenzl i\@erratique.ch> } *)
+
+(** {1 Interface} *)
+
+type 'a event
+(** The type for events of type ['a]. *)
+
+type 'a signal
+(** The type for signals of type ['a]. *)
+
+type step
+(** The type for update steps. *)
+
+(** Event combinators.
+
+ Consult their {{!evsem}semantics.} *)
+module E : sig
+ (** {1:prim Primitive and basics} *)
+
+ type 'a t = 'a event
+ (** The type for events with occurrences of type ['a]. *)
+
+ val never : 'a event
+ (** A never occuring event. For all t, \[[never]\]{_t} [= None]. *)
+
+ val create : unit -> 'a event * (?step:step -> 'a -> unit)
+ (** [create ()] is a primitive event [e] and a [send] function. The
+ function [send] is such that:
+ {ul
+ {- [send v] generates an occurrence [v] of [e] at the time it is called
+ and triggers an {{!steps}update step}.}
+ {- [send ~step v] generates an occurence [v] of [e] on the step [step]
+ when [step] is {{!Step.execute}executed}.}
+ {- [send ~step v] raises [Invalid_argument] if it was previously
+ called with a step and this step has not executed yet or if
+ the given [step] was already executed.}}
+
+ {b Warning.} [send] must not be executed inside an update step. *)
+
+ val retain : 'a event -> (unit -> unit) -> [ `R of (unit -> unit) ]
+ (** [retain e c] keeps a reference to the closure [c] in [e] and
+ returns the previously retained value. [c] will {e never} be
+ invoked.
+
+ {b Raises.} [Invalid_argument] on {!E.never}. *)
+
+ val stop : ?strong:bool -> 'a event -> unit
+ (** [stop e] stops [e] from occuring. It conceptually becomes
+ {!never} and cannot be restarted. Allows to
+ disable {{!sideeffects}effectful} events.
+
+ The [strong] argument should only be used on platforms
+ where weak arrays have a strong semantics (i.e. JavaScript).
+ See {{!strongstop}details}.
+
+ {b Note.} If executed in an {{!steps}update step}
+ the event may still occur in the step. *)
+
+ val equal : 'a event -> 'a event -> bool
+ (** [equal e e'] is [true] iff [e] and [e'] are equal. If both events are
+ different from {!never}, physical equality is used. *)
+
+ val trace : ?iff:bool signal -> ('a -> unit) -> 'a event -> 'a event
+ (** [trace iff tr e] is [e] except [tr] is invoked with e's
+ occurence when [iff] is [true] (defaults to [S.const true]).
+ For all t where \[[e]\]{_t} [= Some v] and \[[iff]\]{_t} =
+ [true], [tr] is invoked with [v]. *)
+
+ (** {1:transf Transforming and filtering} *)
+
+ val once : 'a event -> 'a event
+ (** [once e] is [e] with only its next occurence.
+ {ul
+ {- \[[once e]\]{_t} [= Some v] if \[[e]\]{_t} [= Some v] and
+ \[[e]\]{_<t} [= None].}
+ {- \[[once e]\]{_t} [= None] otherwise.}} *)
+
+ val drop_once : 'a event -> 'a event
+ (** [drop_once e] is [e] without its next occurrence.
+ {ul
+ {- \[[drop_once e]\]{_t} [= Some v] if \[[e]\]{_t} [= Some v] and
+ \[[e]\]{_<t} [= Some _].}
+ {- \[[drop_once e]\]{_t} [= None] otherwise.}} *)
+
+ val app : ('a -> 'b) event -> 'a event -> 'b event
+ (** [app ef e] occurs when both [ef] and [e] occur
+ {{!simultaneity}simultaneously}.
+ The value is [ef]'s occurence applied to [e]'s one.
+ {ul
+ {- \[[app ef e]\]{_t} [= Some v'] if \[[ef]\]{_t} [= Some f] and
+ \[[e]\]{_t} [= Some v] and [f v = v'].}
+ {- \[[app ef e]\]{_t} [= None] otherwise.}} *)
+
+ val map : ('a -> 'b) -> 'a event -> 'b event
+ (** [map f e] applies [f] to [e]'s occurrences.
+ {ul
+ {- \[[map f e]\]{_t} [= Some (f v)] if \[[e]\]{_t} [= Some v].}
+ {- \[[map f e]\]{_t} [= None] otherwise.}} *)
+
+ val stamp : 'b event -> 'a -> 'a event
+ (** [stamp e v] is [map (fun _ -> v) e]. *)
+
+ val filter : ('a -> bool) -> 'a event -> 'a event
+ (** [filter p e] are [e]'s occurrences that satisfy [p].
+ {ul
+ {- \[[filter p e]\]{_t} [= Some v] if \[[e]\]{_t} [= Some v] and
+ [p v = true]}
+ {- \[[filter p e]\]{_t} [= None] otherwise.}} *)
+
+ val fmap : ('a -> 'b option) -> 'a event -> 'b event
+ (** [fmap fm e] are [e]'s occurrences filtered and mapped by [fm].
+ {ul
+ {- \[[fmap fm e]\]{_t} [= Some v] if [fm] \[[e]\]{_t} [= Some v]}
+ {- \[[fmap fm e]\]{_t} [= None] otherwise.}} *)
+
+ val diff : ('a -> 'a -> 'b) -> 'a event -> 'b event
+ (** [diff f e] occurs whenever [e] occurs except on the next occurence.
+ Occurences are [f v v'] where [v] is [e]'s current
+ occurrence and [v'] the previous one.
+ {ul
+ {- \[[diff f e]\]{_t} [= Some r] if \[[e]\]{_t} [= Some v],
+ \[[e]\]{_<t} [= Some v'] and [f v v' = r].}
+ {- \[[diff f e]\]{_t} [= None] otherwise.}} *)
+
+ val changes : ?eq:('a -> 'a -> bool) -> 'a event -> 'a event
+ (** [changes eq e] is [e]'s occurrences with occurences equal to
+ the previous one dropped. Equality is tested with [eq] (defaults to
+ structural equality).
+ {ul
+ {- \[[changes eq e]\]{_t} [= Some v] if \[[e]\]{_t} [= Some v]
+ and either \[[e]\]{_<t} [= None] or \[[e]\]{_<t} [= Some v'] and
+ [eq v v' = false].}
+ {- \[[changes eq e]\]{_t} [= None] otherwise.}} *)
+
+ val on : bool signal -> 'a event -> 'a event
+ (** [on c e] is the occurrences of [e] when [c] is [true].
+ {ul
+ {- \[[on c e]\]{_t} [= Some v]
+ if \[[c]\]{_t} [= true] and \[[e]\]{_t} [= Some v].}
+ {- \[[on c e]\]{_t} [= None] otherwise.}} *)
+
+ val when_ : bool signal -> 'a event -> 'a event
+ (** @deprecated Use {!on}. *)
+
+ val dismiss : 'b event -> 'a event -> 'a event
+ (** [dismiss c e] is the occurences of [e] except the ones when [c] occurs.
+ {ul
+ {- \[[dimiss c e]\]{_t} [= Some v]
+ if \[[c]\]{_t} [= None] and \[[e]\]{_t} [= Some v].}
+ {- \[[dimiss c e]\]{_t} [= None] otherwise.}} *)
+
+ val until : 'a event -> 'b event -> 'b event
+ (** [until c e] is [e]'s occurences until [c] occurs.
+ {ul
+ {- \[[until c e]\]{_t} [= Some v] if \[[e]\]{_t} [= Some v] and
+ \[[c]\]{_<=t} [= None]}
+ {- \[[until c e]\]{_t} [= None] otherwise.}} *)
+
+ (** {1:accum Accumulating} *)
+
+ val accum : ('a -> 'a) event -> 'a -> 'a event
+ (** [accum ef i] accumulates a value, starting with [i], using [e]'s
+ functional occurrences.
+ {ul
+ {- \[[accum ef i]\]{_t} [= Some (f i)] if \[[ef]\]{_t} [= Some f]
+ and \[[ef]\]{_<t} [= None].
+ }
+ {- \[[accum ef i]\]{_t} [= Some (f acc)] if \[[ef]\]{_t} [= Some f]
+ and \[[accum ef i]\]{_<t} [= Some acc].}
+ {- \[[accum ef i]\] [= None] otherwise.}} *)
+
+ val fold : ('a -> 'b -> 'a) -> 'a -> 'b event -> 'a event
+ (** [fold f i e] accumulates [e]'s occurrences with [f] starting with [i].
+ {ul
+ {- \[[fold f i e]\]{_t} [= Some (f i v)] if
+ \[[e]\]{_t} [= Some v] and \[[e]\]{_<t} [= None].}
+ {- \[[fold f i e]\]{_t} [= Some (f acc v)] if
+ \[[e]\]{_t} [= Some v] and \[[fold f i e]\]{_<t} [= Some acc].}
+ {- \[[fold f i e]\]{_t} [= None] otherwise.}} *)
+
+ (** {1:combine Combining} *)
+
+ val select : 'a event list -> 'a event
+ (** [select el] is the occurrences of every event in [el].
+ If more than one event occurs {{!simultaneity}simultaneously}
+ the leftmost is taken and the others are lost.
+ {ul
+ {- \[[select el]\]{_ t} [=] \[[List.find (fun e -> ]\[[e]\]{_t}
+ [<> None) el]\]{_t}}.
+ {- \[[select el]\]{_ t} [= None] otherwise.}} *)
+
+ val merge : ('a -> 'b -> 'a) -> 'a -> 'b event list -> 'a event
+ (** [merge f a el] merges the {{!simultaneity}simultaneous}
+ occurrences of every event in [el] using [f] and the accumulator [a].
+
+ \[[merge f a el]\]{_ t}
+ [= List.fold_left f a (List.filter (fun o -> o <> None)
+ (List.map] \[\]{_t}[ el))]. *)
+
+ val switch : 'a event -> 'a event event -> 'a event
+ (** [switch e ee] is [e]'s occurrences until there is an
+ occurrence [e'] on [ee], the occurrences of [e'] are then used
+ until there is a new occurrence on [ee], etc..
+ {ul
+ {- \[[switch e ee]\]{_ t} [=] \[[e]\]{_t} if \[[ee]\]{_<=t} [= None].}
+ {- \[[switch e ee]\]{_ t} [=] \[[e']\]{_t} if \[[ee]\]{_<=t}
+ [= Some e'].}} *)
+
+ val fix : ('a event -> 'a event * 'b) -> 'b
+ (** [fix ef] allows to refer to the value an event had an
+ infinitesimal amount of time before.
+
+ In [fix ef], [ef] is called with an event [e] that represents
+ the event returned by [ef] delayed by an infinitesimal amount of
+ time. If [e', r = ef e] then [r] is returned by [fix] and [e]
+ is such that :
+ {ul
+ {- \[[e]\]{_ t} [=] [None] if t = 0 }
+ {- \[[e]\]{_ t} [=] \[[e']\]{_t-dt} otherwise}}
+
+ {b Raises.} [Invalid_argument] if [e'] is directly a delayed event (i.e.
+ an event given to a fixing function). *)
+
+ (** {1 Lifting}
+
+ Lifting combinators. For a given [n] the semantics is:
+ {ul
+ {- \[[ln f e1 ... en]\]{_t} [= Some (f v1 ... vn)] if for all
+ i : \[[ei]\]{_t} [= Some vi].}
+ {- \[[ln f e1 ... en]\]{_t} [= None] otherwise.}} *)
+
+ val l1 : ('a -> 'b) -> 'a event -> 'b event
+ val l2 : ('a -> 'b -> 'c) -> 'a event -> 'b event -> 'c event
+ val l3 : ('a -> 'b -> 'c -> 'd) -> 'a event -> 'b event -> 'c event ->
+ 'd event
+ val l4 : ('a -> 'b -> 'c -> 'd -> 'e) -> 'a event -> 'b event -> 'c event ->
+ 'd event -> 'e event
+ val l5 : ('a -> 'b -> 'c -> 'd -> 'e -> 'f) -> 'a event -> 'b event ->
+ 'c event -> 'd event -> 'e event -> 'f event
+ val l6 : ('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g) -> 'a event -> 'b event ->
+ 'c event -> 'd event -> 'e event -> 'f event -> 'g event
+
+ (** {1 Pervasives support} *)
+
+ (** Events with option occurences. *)
+ module Option : sig
+ val some : 'a event -> 'a option event
+ (** [some e] is [map (fun v -> Some v) e]. *)
+
+ val value : ?default:'a signal -> 'a option event -> 'a event
+ (** [value default e] either silences [None] occurences if [default] is
+ unspecified or replaces them by the value of [default] at the occurence
+ time.
+ {ul
+ {- \[[value ~default e]\]{_t}[ = v] if \[[e]\]{_t} [= Some (Some v)].}
+ {- \[[value ?default:None e]\]{_t}[ = None] if \[[e]\]{_t} = [None].}
+ {- \[[value ?default:(Some s) e]\]{_t}[ = v]
+ if \[[e]\]{_t} = [None] and \[[s]\]{_t} [= v].}} *)
+ end
+end
+
+(** Signal combinators.
+
+ Consult their {{!sigsem}semantics.} *)
+module S : sig
+ (** {1:prim Primitive and basics} *)
+
+ type 'a t = 'a signal
+ (** The type for signals of type ['a]. *)
+
+ val const : 'a -> 'a signal
+ (** [const v] is always [v], \[[const v]\]{_t} [= v]. *)
+
+ val create : ?eq:('a -> 'a -> bool) -> 'a ->
+ 'a signal * (?step:step -> 'a -> unit)
+ (** [create i] is a primitive signal [s] set to [i] and a
+ [set] function. The function [set] is such that:
+ {ul
+ {- [set v] sets the signal's value to [v] at the time it is called and
+ triggers an {{!steps}update step}.}
+ {- [set ~step v] sets the signal's value to [v] at the time it is
+ called and updates it dependencies when [step] is
+ {{!Step.execute}executed}}
+ {- [set ~step v] raises [Invalid_argument] if it was previously
+ called with a step and this step has not executed yet or if
+ the given [step] was already executed.}}
+ {b Warning.} [set] must not be executed inside an update step. *)
+
+ val value : 'a signal -> 'a
+ (** [value s] is [s]'s current value.
+
+ {b Warning.} If executed in an {{!steps}update
+ step} may return a non up-to-date value or raise [Failure] if
+ the signal is not yet initialized. *)
+
+ val retain : 'a signal -> (unit -> unit) -> [ `R of (unit -> unit) ]
+ (** [retain s c] keeps a reference to the closure [c] in [s] and
+ returns the previously retained value. [c] will {e never} be
+ invoked.
+
+ {b Raises.} [Invalid_argument] on constant signals. *)
+
+ (**/**)
+ val eq_fun : 'a signal -> ('a -> 'a -> bool) option
+ (**/**)
+
+ val stop : ?strong:bool -> 'a signal -> unit
+ (** [stop s], stops updating [s]. It conceptually becomes {!const}
+ with the signal's last value and cannot be restarted. Allows to
+ disable {{!sideeffects}effectful} signals.
+
+ The [strong] argument should only be used on platforms
+ where weak arrays have a strong semantics (i.e. JavaScript).
+ See {{!strongstop}details}.
+
+ {b Note.} If executed in an update step the signal may
+ still update in the step. *)
+
+ val equal : ?eq:('a -> 'a -> bool) -> 'a signal -> 'a signal -> bool
+ (** [equal s s'] is [true] iff [s] and [s'] are equal. If both
+ signals are {!const}ant [eq] is used between their value
+ (defauts to structural equality). If both signals are not
+ {!const}ant, physical equality is used.*)
+
+ val trace : ?iff:bool t -> ('a -> unit) -> 'a signal -> 'a signal
+ (** [trace iff tr s] is [s] except [tr] is invoked with [s]'s
+ current value and on [s] changes when [iff] is [true] (defaults
+ to [S.const true]). For all t where \[[s]\]{_t} [= v] and (t = 0
+ or (\[[s]\]{_t-dt}[= v'] and [eq v v' = false])) and
+ \[[iff]\]{_t} = [true], [tr] is invoked with [v]. *)
+
+ (** {1 From events} *)
+
+ val hold : ?eq:('a -> 'a -> bool) -> 'a -> 'a event -> 'a signal
+ (** [hold i e] has the value of [e]'s last occurrence or [i] if there
+ wasn't any.
+ {ul
+ {- \[[hold i e]\]{_t} [= i] if \[[e]\]{_<=t} [= None]}
+ {- \[[hold i e]\]{_t} [= v] if \[[e]\]{_<=t} [= Some v]}} *)
+
+ (** {1:tr Transforming and filtering} *)
+
+ val app : ?eq:('b -> 'b -> bool) -> ('a -> 'b) signal -> 'a signal ->
+ 'b signal
+ (** [app sf s] holds the value of [sf] applied
+ to the value of [s], \[[app sf s]\]{_t}
+ [=] \[[sf]\]{_t} \[[s]\]{_t}. *)
+
+ val map : ?eq:('b -> 'b -> bool) -> ('a -> 'b) -> 'a signal -> 'b signal
+ (** [map f s] is [s] transformed by [f], \[[map f s]\]{_t} = [f] \[[s]\]{_t}.
+ *)
+
+ val filter : ?eq:('a -> 'a -> bool) -> ('a -> bool) -> 'a -> 'a signal ->
+ 'a signal
+ (** [filter f i s] is [s]'s values that satisfy [p]. If a value does not
+ satisfy [p] it holds the last value that was satisfied or [i] if
+ there is none.
+ {ul
+ {- \[[filter p s]\]{_t} [=] \[[s]\]{_t} if [p] \[[s]\]{_t}[ = true].}
+ {- \[[filter p s]\]{_t} [=] \[[s]\]{_t'} if [p] \[[s]\]{_t}[ = false]
+ and t' is the greatest t' < t with [p] \[[s]\]{_t'}[ = true].}
+ {- \[[filter p e]\]{_t} [= i] otherwise.}} *)
+
+ val fmap : ?eq:('b -> 'b -> bool) -> ('a -> 'b option) -> 'b -> 'a signal ->
+ 'b signal
+ (** [fmap fm i s] is [s] filtered and mapped by [fm].
+ {ul
+ {- \[[fmap fm i s]\]{_t} [=] v if [fm] \[[s]\]{_t}[ = Some v].}
+ {- \[[fmap fm i s]\]{_t} [=] \[[fmap fm i s]\]{_t'} if [fm]
+ \[[s]\]{_t} [= None] and t' is the greatest t' < t with [fm]
+ \[[s]\]{_t'} [<> None].}
+ {- \[[fmap fm i s]\]{_t} [= i] otherwise.}} *)
+
+ val diff : ('a -> 'a -> 'b) -> 'a signal -> 'b event
+ (** [diff f s] is an event with occurrences whenever [s] changes from
+ [v'] to [v] and [eq v v'] is [false] ([eq] is the signal's equality
+ function). The value of the occurrence is [f v v'].
+ {ul
+ {- \[[diff f s]\]{_t} [= Some d]
+ if \[[s]\]{_t} [= v] and \[[s]\]{_t-dt} [= v'] and [eq v v' = false]
+ and [f v v' = d].}
+ {- \[[diff f s]\]{_t} [= None] otherwise.}} *)
+
+ val changes : 'a signal -> 'a event
+ (** [changes s] is [diff (fun v _ -> v) s]. *)
+
+ val sample : ('b -> 'a -> 'c) -> 'b event -> 'a signal -> 'c event
+ (** [sample f e s] samples [s] at [e]'s occurrences.
+ {ul
+ {- \[[sample f e s]\]{_t} [= Some (f ev sv)] if \[[e]\]{_t} [= Some ev]
+ and \[[s]\]{_t} [= sv].}
+ {- \[[sample e s]\]{_t} [= None] otherwise.}} *)
+
+ val on : ?eq:('a -> 'a -> bool) -> bool signal -> 'a -> 'a signal ->
+ 'a signal
+ (** [on c i s] is the signal [s] whenever [c] is [true].
+ When [c] is [false] it holds the last value [s] had when
+ [c] was the last time [true] or [i] if it never was.
+ {ul
+ {- \[[on c i s]\]{_t} [=] \[[s]\]{_t} if \[[c]\]{_t} [= true]}
+ {- \[[on c i s]\]{_t} [=] \[[s]\]{_t'} if \[[c]\]{_t} [= false]
+ where t' is the greatest t' < t with \[[c]\]{_t'} [= true].}
+ {- \[[on c i s]\]{_t} [=] [i] otherwise.}} *)
+
+ val when_ : ?eq:('a -> 'a -> bool) -> bool signal -> 'a -> 'a signal ->
+ 'a signal
+ (** @deprecated Use {!on}. *)
+
+ val dismiss : ?eq:('a -> 'a -> bool) -> 'b event -> 'a -> 'a signal ->
+ 'a signal
+ (** [dismiss c i s] is the signal [s] except changes when [c] occurs
+ are ignored. If [c] occurs initially [i] is used.
+ {ul
+ {- \[[dismiss c i s]\]{_t} [=] \[[s]\]{_t'}
+ where t' is the greatest t' <= t with \[[c]\]{_t'} [= None] and
+ \[[s]\]{_t'-dt} [<>] \[[s]\]{_t'}}
+ {- \[[dismiss_ c i s]\]{_0} [=] [v] where [v = i] if
+ \[[c]\]{_0} [= Some _] and [v =] \[[s]\]{_0} otherwise.}} *)
+
+ (** {1:acc Accumulating} *)
+
+ val accum : ?eq:('a -> 'a -> bool) -> ('a -> 'a) event -> 'a -> 'a signal
+ (** [accum e i] is [S.hold i (]{!E.accum}[ e i)]. *)
+
+ val fold : ?eq:('a -> 'a -> bool) -> ('a -> 'b -> 'a) -> 'a -> 'b event ->
+ 'a signal
+ (** [fold f i e] is [S.hold i (]{!E.fold}[ f i e)]. *)
+
+ (** {1:combine Combining} *)
+
+ val merge : ?eq:('a -> 'a -> bool) -> ('a -> 'b -> 'a) -> 'a ->
+ 'b signal list -> 'a signal
+ (** [merge f a sl] merges the value of every signal in [sl]
+ using [f] and the accumulator [a].
+
+ \[[merge f a sl]\]{_ t}
+ [= List.fold_left f a (List.map] \[\]{_t}[ sl)]. *)
+
+ val switch : ?eq:('a -> 'a -> bool) -> 'a signal signal -> 'a signal
+ (** [switch ss] is the inner signal of [ss].
+ {ul
+ {- \[[switch ss]\]{_ t} [=] \[\[[ss]\]{_t}\]{_t}.}} *)
+
+ val bind : ?eq:('b -> 'b -> bool) -> 'a signal -> ('a -> 'b signal) ->
+ 'b signal
+ (** [bind s sf] is [switch (map ~eq:( == ) sf s)]. *)
+
+ val fix : ?eq:('a -> 'a -> bool) -> 'a -> ('a signal -> 'a signal * 'b) -> 'b
+ (** [fix i sf] allow to refer to the value a signal had an
+ infinitesimal amount of time before.
+
+ In [fix sf], [sf] is called with a signal [s] that represents
+ the signal returned by [sf] delayed by an infinitesimal amount
+ time. If [s', r = sf s] then [r] is returned by [fix] and [s]
+ is such that :
+ {ul
+ {- \[[s]\]{_ t} [=] [i] for t = 0. }
+ {- \[[s]\]{_ t} [=] \[[s']\]{_t-dt} otherwise.}}
+
+ [eq] is the equality used by [s].
+
+ {b Raises.} [Invalid_argument] if [s'] is directly a delayed signal (i.e.
+ a signal given to a fixing function).
+
+ {b Note.} Regarding values depending on the result [r] of
+ [s', r = sf s] the following two cases need to be distinguished :
+ {ul
+ {- After [sf s] is applied, [s'] does not depend on
+ a value that is in a step and [s] has no dependents in a step (e.g
+ in the simple case where [fix] is applied outside a step).
+
+ In that case if the initial value of [s'] differs from [i],
+ [s] and its dependents need to be updated and a special
+ update step will be triggered for this. Values
+ depending on the result [r] will be created only after this
+ special update step has finished (e.g. they won't see
+ the [i] of [s] if [r = s]).}
+ {- Otherwise, values depending on [r] will be created in the same
+ step as [s] and [s'] (e.g. they will see the [i] of [s] if [r = s]).}}
+ *)
+
+ (** {1:lifting Lifting}
+
+ Lifting combinators. For a given [n] the semantics is :
+
+ \[[ln f a1] ... [an]\]{_t} = f \[[a1]\]{_t} ... \[[an]\]{_t} *)
+
+ val l1 : ?eq:('b -> 'b -> bool) -> ('a -> 'b) -> ('a signal -> 'b signal)
+ val l2 : ?eq:('c -> 'c -> bool) ->
+ ('a -> 'b -> 'c) -> ('a signal -> 'b signal -> 'c signal)
+ val l3 : ?eq:('d -> 'd -> bool) ->
+ ('a -> 'b -> 'c -> 'd) -> ('a signal -> 'b signal -> 'c signal -> 'd signal)
+ val l4 : ?eq:('e -> 'e -> bool) ->
+ ('a -> 'b -> 'c -> 'd -> 'e) ->
+ ('a signal -> 'b signal -> 'c signal -> 'd signal -> 'e signal)
+ val l5 : ?eq:('f -> 'f -> bool) ->
+ ('a -> 'b -> 'c -> 'd -> 'e -> 'f) ->
+ ('a signal -> 'b signal -> 'c signal -> 'd signal -> 'e signal ->
+ 'f signal)
+ val l6 : ?eq:('g -> 'g -> bool) ->
+ ('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g) ->
+ ('a signal -> 'b signal -> 'c signal -> 'd signal -> 'e signal ->
+ 'f signal -> 'g signal)
+
+ (** The following modules lift some of [Pervasives] functions and
+ operators. *)
+
+ module Bool : sig
+ val zero : bool signal
+ val one : bool signal
+ val not : bool signal -> bool signal
+ val ( && ) : bool signal -> bool signal -> bool signal
+ val ( || ) : bool signal -> bool signal -> bool signal
+
+ val edge : bool signal -> bool event
+ (** [edge s] is [changes s]. *)
+
+ val rise : bool signal -> unit event
+ (** [rise s] is [E.fmap (fun b -> if b then Some () else None) (edge s)].*)
+
+ val fall : bool signal -> unit event
+ (** [fall s] is [E.fmap (fun b -> if b then None else Some ()) (edge s)].*)
+
+ val flip : bool -> 'a event -> bool signal
+ (** [flip b e] is a signal whose boolean value flips each time
+ [e] occurs. [b] is the initial signal value.
+ {ul
+ {- \[[flip b e]\]{_0} [= not b] if \[[e]\]{_0} [= Some _]}
+ {- \[[flip b e]\]{_t} [= b] if \[[e]\]{_<=t} [= None]}
+ {- \[[flip b e]\]{_t} [=] [not] \[[flip b e]\]{_t-dt}
+ if \[[e]\]{_t} [= Some _]}}
+*)
+ end
+
+ module Int : sig
+ val zero : int signal
+ val one : int signal
+ val minus_one : int signal
+ val ( ~- ) : int signal -> int signal
+ val succ : int signal -> int signal
+ val pred : int signal -> int signal
+ val ( + ) : int signal -> int signal -> int signal
+ val ( - ) : int signal -> int signal -> int signal
+ val ( * ) : int signal -> int signal -> int signal
+ val ( mod ) : int signal -> int signal -> int signal
+ val abs : int signal -> int signal
+ val max_int : int signal
+ val min_int : int signal
+ val ( land ) : int signal -> int signal -> int signal
+ val ( lor ) : int signal -> int signal -> int signal
+ val ( lxor ) : int signal -> int signal -> int signal
+ val lnot : int signal -> int signal
+ val ( lsl ) : int signal -> int signal -> int signal
+ val ( lsr ) : int signal -> int signal -> int signal
+ val ( asr ) : int signal -> int signal -> int signal
+ end
+
+ module Float : sig
+ val zero : float signal
+ val one : float signal
+ val minus_one : float signal
+ val ( ~-. ) : float signal -> float signal
+ val ( +. ) : float signal -> float signal -> float signal
+ val ( -. ) : float signal -> float signal -> float signal
+ val ( *. ) : float signal -> float signal -> float signal
+ val ( /. ) : float signal -> float signal -> float signal
+ val ( ** ) : float signal -> float signal -> float signal
+ val sqrt : float signal -> float signal
+ val exp : float signal -> float signal
+ val log : float signal -> float signal
+ val log10 : float signal -> float signal
+ val cos : float signal -> float signal
+ val sin : float signal -> float signal
+ val tan : float signal -> float signal
+ val acos : float signal -> float signal
+ val asin : float signal -> float signal
+ val atan : float signal -> float signal
+ val atan2 : float signal -> float signal -> float signal
+ val cosh : float signal -> float signal
+ val sinh : float signal -> float signal
+ val tanh : float signal -> float signal
+ val ceil : float signal -> float signal
+ val floor : float signal -> float signal
+ val abs_float : float signal -> float signal
+ val mod_float : float signal -> float signal -> float signal
+ val frexp : float signal -> (float * int) signal
+ val ldexp : float signal -> int signal -> float signal
+ val modf : float signal -> (float * float) signal
+ val float : int signal -> float signal
+ val float_of_int : int signal -> float signal
+ val truncate : float signal -> int signal
+ val int_of_float : float signal -> int signal
+ val infinity : float signal
+ val neg_infinity : float signal
+ val nan : float signal
+ val max_float : float signal
+ val min_float : float signal
+ val epsilon_float : float signal
+ val classify_float : float signal -> fpclass signal
+ end
+
+ module Pair : sig
+ val pair : ?eq:(('a * 'b) -> ('a * 'b) -> bool)->
+ 'a signal -> 'b signal -> ('a * 'b) signal
+ val fst : ?eq:('a -> 'a -> bool) -> ('a * 'b) signal -> 'a signal
+ val snd : ?eq:('a -> 'a -> bool) -> ('b * 'a) signal -> 'a signal
+ end
+
+ module Option : sig
+ val none : 'a option signal
+ (** [none] is [S.const None]. *)
+
+ val some : 'a signal -> 'a option signal
+ (** [some s] is [S.map ~eq (fun v -> Some v) None], where [eq] uses
+ [s]'s equality function to test the [Some v]'s equalities. *)
+
+ val value : ?eq:('a -> 'a -> bool) ->
+ default:[`Init of 'a signal | `Always of 'a signal ] ->
+ 'a option signal -> 'a signal
+ (** [value default s] is [s] with only its [Some v] values.
+ Whenever [s] is [None], if [default] is [`Always dv] then
+ the current value of [dv] is used instead. If [default]
+ is [`Init dv] the current value of [dv] is only used
+ if there's no value at creation time, otherwise the last
+ [Some v] value of [s] is used.
+ {ul
+ {- \[[value ~default s]\]{_t} [= v] if \[[s]\]{_t} [= Some v]}
+ {- \[[value ~default:(`Always d) s]\]{_t} [=] \[[d]\]{_t}
+ if \[[s]\]{_t} [= None]}
+ {- \[[value ~default:(`Init d) s]\]{_0} [=] \[[d]\]{_0}
+ if \[[s]\]{_0} [= None]}
+ {- \[[value ~default:(`Init d) s]\]{_t} [=]
+ \[[value ~default:(`Init d) s]\]{_t'}
+ if \[[s]\]{_t} [= None] and t' is the greatest t' < t
+ with \[[s]\]{_t'} [<> None] or 0 if there is no such [t'].}} *)
+ end
+
+ module Compare : sig
+ val ( = ) : 'a signal -> 'a signal -> bool signal
+ val ( <> ) : 'a signal -> 'a signal -> bool signal
+ val ( < ) : 'a signal -> 'a signal -> bool signal
+ val ( > ) : 'a signal -> 'a signal -> bool signal
+ val ( <= ) : 'a signal -> 'a signal -> bool signal
+ val ( >= ) : 'a signal -> 'a signal -> bool signal
+ val compare : 'a signal -> 'a signal -> int signal
+ val ( == ) : 'a signal -> 'a signal -> bool signal
+ val ( != ) : 'a signal -> 'a signal -> bool signal
+ end
+
+ (** {1:special Combinator specialization}
+
+ Given an equality function [equal] and a type [t], the functor
+ {!Make} automatically applies the [eq] parameter of the combinators.
+ The outcome is combinators whose {e results} are signals with
+ values in [t].
+
+ Basic types are already specialized in the module {!Special}, open
+ this module to use them. *)
+
+ (** Input signature of {!S.Make} *)
+ module type EqType = sig
+ type 'a t
+ val equal : 'a t -> 'a t -> bool
+ end
+
+ (** Output signature of {!S.Make} *)
+ module type S = sig
+ type 'a v
+ val create : 'a v -> 'a v signal * (?step:step -> 'a v -> unit)
+ val equal : 'a v signal -> 'a v signal -> bool
+ val hold : 'a v -> 'a v event -> 'a v signal
+ val app : ('a -> 'b v) signal -> 'a signal -> 'b v signal
+ val map : ('a -> 'b v) -> 'a signal -> 'b v signal
+ val filter : ('a v -> bool) -> 'a v -> 'a v signal -> 'a v signal
+ val fmap : ('a -> 'b v option) -> 'b v -> 'a signal -> 'b v signal
+ val when_ : bool signal -> 'a v -> 'a v signal -> 'a v signal
+ val dismiss : 'b event -> 'a v -> 'a v signal -> 'a v signal
+ val accum : ('a v -> 'a v) event -> 'a v -> 'a v signal
+ val fold : ('a v -> 'b -> 'a v) -> 'a v -> 'b event -> 'a v signal
+ val merge : ('a v -> 'b -> 'a v) -> 'a v -> 'b signal list -> 'a v signal
+ val switch : 'a v signal signal -> 'a v signal
+ val bind : 'b signal -> ('b -> 'a v signal) -> 'a v signal
+ val fix : 'a v -> ('a v signal -> 'a v signal * 'b) -> 'b
+ val l1 : ('a -> 'b v) -> ('a signal -> 'b v signal)
+ val l2 : ('a -> 'b -> 'c v) -> ('a signal -> 'b signal -> 'c v signal)
+ val l3 : ('a -> 'b -> 'c -> 'd v) -> ('a signal -> 'b signal ->
+ 'c signal -> 'd v signal)
+ val l4 : ('a -> 'b -> 'c -> 'd -> 'e v) ->
+ ('a signal -> 'b signal -> 'c signal -> 'd signal -> 'e v signal)
+ val l5 : ('a -> 'b -> 'c -> 'd -> 'e -> 'f v) ->
+ ('a signal -> 'b signal -> 'c signal -> 'd signal -> 'e signal ->
+ 'f v signal)
+ val l6 : ('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g v) ->
+ ('a signal -> 'b signal -> 'c signal -> 'd signal -> 'e signal ->
+ 'f signal -> 'g v signal)
+ end
+
+ (** Functor specializing the combinators for the given signal value type *)
+ module Make (Eq : EqType) : S with type 'a v = 'a Eq.t
+
+
+ (** Specialization for booleans, integers and floats.
+
+ Open this module to use it. *)
+ module Special : sig
+
+ (** Specialization for booleans. *)
+ module Sb : S with type 'a v = bool
+
+ (** Specialization for integers. *)
+ module Si : S with type 'a v = int
+
+ (** Specialization for floats. *)
+ module Sf : S with type 'a v = float
+ end
+end
+
+(** Update steps.
+
+ Update functions returned by {!S.create} and {!E.create}
+ implicitely create and execute update steps when used without
+ specifying their [step] argument.
+
+ Using explicit {!step} values with these functions gives more control on
+ the time when the update step is perfomed and allows to perform
+ simultaneous {{!primitives}primitive} signal updates and event
+ occurences. See also the documentation about {{!steps}update steps} and
+ {{!simultaneity}simultaneous events}. *)
+module Step : sig
+
+ (** {1 Steps} *)
+
+ type t = step
+ (** The type for update steps. *)
+
+ val create : unit -> step
+ (** [create ()] is a new update step. *)
+
+ val execute : step -> unit
+ (** [execute step] executes the update step.
+
+ @raise Invalid_argument if [step] was already executed. *)
+end
+
+(** {1:sem Semantics}
+
+ The following notations are used to give precise meaning to the
+ combinators. It is important to note that in these semantic
+ descriptions the origin of time t = 0 is {e always} fixed at
+ the time at which the combinator creates the event or the signal and
+ the semantics of the dependents is evaluated relative to this timeline.
+
+ We use dt to denote an infinitesimal amount of time.
+ {2:evsem Events}
+
+ An event is a value with discrete occurrences over time.
+
+ The semantic function \[\] [: 'a event -> time -> 'a option] gives
+ meaning to an event [e] by mapping it to a function of time
+ \[[e]\] returning [Some v] whenever the event occurs with value
+ [v] and [None] otherwise. We write \[[e]\]{_t} the evaluation of
+ this {e semantic} function at time t.
+
+ As a shortcut notation we also define []{_<t} [: 'a event -> 'a option]
+ (resp. \[\]{_<=t}) to denote the last occurrence, if any, of an
+ event before (resp. before or at) [t]. More precisely :
+ {ul
+ {- \[[e]\]{_<t} [=] \[[e]\]{_t'} with t' the greatest t' < t
+ (resp. [<=]) such that
+ \[[e]\]{_t'} [<> None].}
+ {- \[[e]\]{_<t} [= None] if there is no such t'.}}
+
+ {2:sigsem Signals}
+
+ A signal is a value that varies continuously over time. In
+ contrast to {{!evsem}events} which occur at specific point
+ in time, a signal has a value at every point in time.
+
+ The semantic function \[\] [: 'a signal -> time -> 'a] gives
+ meaning to a signal [s] by mapping it to a function of time
+ \[[s]\] that returns its value at a given time. We write \[[s]\]{_t}
+ the evaluation of this {e semantic} function at time t.
+ {3:sigeq Equality}
+
+ Most signal combinators have an optional [eq] parameter that
+ defaults to structural equality. [eq] specifies the equality
+ function used to detect changes in the value of the resulting
+ signal. This function is needed for the efficient update of
+ signals and to deal correctly with signals that perform
+ {{!sideeffects}side effects}.
+
+ Given an equality function on a type the combinators can be automatically
+ {{!S.special}specialized} via a functor.
+
+ {3:sigcont Continuity}
+
+ Ultimately signal updates depend on
+ {{!primitives}primitives} updates. Thus a signal can
+ only approximate a real continuous signal. The accuracy of the
+ approximation depends on the variation rate of the real signal and
+ the primitive's update frequency.
+
+ {1:basics Basics}
+
+ {2:primitives Primitive events and signals}
+
+ React doesn't define primitive events and signals, they must be
+ created and updated by the client.
+
+ Primitive events are created with {!E.create}. This function
+ returns a new event and an update function that generates an
+ occurrence for the event at the time it is called. The following
+ code creates a primitive integer event [x] and generates three
+ occurrences with value [1], [2], [3]. Those occurrences are printed
+ on stdout by the effectful event [pr_x]. {[open React;;
+
+let x, send_x = E.create ()
+let pr_x = E.map print_int x
+let () = List.iter send_x [1; 2; 3]]}
+ Primitive signals are created with {!S.create}. This function
+ returns a new signal and an update function that sets the signal's value
+ at the time it is called. The following code creates an
+ integer signal [x] initially set to [1] and updates it three time with
+ values [2], [2], [3]. The signal's values are printed on stdout by the
+ effectful signal [pr_x]. Note that only updates that change
+ the signal's value are printed, hence the program prints [123], not [1223].
+ See the discussion on
+ {{!sideeffects}side effects} for more details.
+
+{[open React;;
+
+let x, set_x = S.create 1
+let pr_x = S.map print_int x
+let () = List.iter set_x [2; 2; 3]]}
+ The {{!clock}clock} example shows how a realtime time
+ flow can be defined.
+
+ {2:steps Update steps}
+
+ The {!E.create} and {!S.create} functions return update functions
+ used to generate primitive event occurences and set the value of
+ primitive signals. Upon invocation as in the preceding section
+ these functions immediatly create and invoke an update step.
+ The {e update step} automatically updates events and signals that
+ transitively depend on the updated primitive. The dependents of a
+ signal are updated iff the signal's value changed according to its
+ {{!sigeq}equality function}.
+
+ The update functions have an optional [step] argument. If they are
+ given a concrete [step] value created with {!Step.create}, then it
+ updates the event or signal but doesn't update its dependencies. It
+ will only do so whenever [step] is executed with
+ {!Step.execute}. This allows to make primitive event occurences and
+ signal changes simultaneous. See next section for an example.
+
+ {2:simultaneity Simultaneous events}
+
+ {{!steps}Update steps} are made under a
+ {{:http://dx.doi.org/10.1016/0167-6423(92)90005-V}synchrony hypothesis} :
+ the update step takes no time, it is instantenous. Two event occurrences
+ are {e simultaneous} if they occur in the same update step.
+
+ In the code below [w], [x] and [y] will always have simultaneous
+ occurrences. They {e may} have simulatenous occurences with [z]
+ if [send_w] and [send_z] are used with the same update step.
+
+{[let w, send_w = E.create ()
+let x = E.map succ w
+let y = E.map succ x
+let z, send_z = E.create ()
+
+let () =
+ let () = send_w 3 (* w x y occur simultaneously, z doesn't occur *) in
+ let step = Step.create () in
+ send_w ~step 3;
+ send_z ~step 4;
+ Step.execute step (* w x z y occur simultaneously *)
+]}
+
+ {2:update The update step and thread safety}
+
+ {{!primitives}Primitives} are the only mean to drive the reactive
+ system and they are entirely under the control of the client. When
+ the client invokes a primitive's update function without the
+ [step] argument or when it invokes {!Step.execute} on a [step]
+ value, React performs an update step.
+
+ To ensure correctness in the presence of threads, update steps
+ must be executed in a critical section. Let uset([p]) be the set
+ of events and signals that need to be updated whenever the
+ primitive [p] is updated. Updating two primitives [p] and [p']
+ concurrently is only allowed if uset([p]) and uset([p']) are
+ disjoint. Otherwise the updates must be properly serialized.
+
+ Below, concurrent, updates to [x] and [y] must be serialized (or
+ performed on the same step if it makes sense semantically), but z
+ can be updated concurently to both [x] and [y].
+
+{[open React;;
+
+let x, set_x = S.create 0
+let y, send_y = E.create ()
+let z, set_z = S.create 0
+let max_xy = S.l2 (fun x y -> if x > y then x else y) x (S.hold 0 y)
+let succ_z = S.map succ z]}
+
+ {2:sideeffects Side effects}
+
+ Effectful events and signals perform their side effect
+ exactly {e once} in each {{!steps}update step} in which there
+ is an update of at least one of the event or signal it depends on.
+
+ Remember that a signal updates in a step iff its
+ {{!sigeq}equality function} determined that the signal
+ value changed. Signal initialization is unconditionally considered as
+ an update.
+
+ It is important to keep references on effectful events and
+ signals. Otherwise they may be reclaimed by the garbage collector.
+ The following program prints only a [1].
+{[let x, set_x = S.create 1
+let () = ignore (S.map print_int x)
+let () = Gc.full_major (); List.iter set_x [2; 2; 3]]}
+ {2:lifting Lifting}
+
+ Lifting transforms a regular function to make it act on signals.
+ The combinators
+ {!S.const} and {!S.app} allow to lift functions of arbitrary arity n,
+ but this involves the inefficient creation of n-1 intermediary
+ closure signals. The fixed arity {{!S.lifting}lifting
+ functions} are more efficient. For example :
+{[let f x y = x mod y
+let fl x y = S.app (S.app ~eq:(==) (S.const f) x) y (* inefficient *)
+let fl' x y = S.l2 f x y (* efficient *)
+]}
+ Besides, some of [Pervasives]'s functions and operators are
+ already lifted and availables in submodules of {!S}. They can be
+ be opened in specific scopes. For example if you are dealing with
+ float signals you can open {!S.Float}.
+{[open React
+open React.S.Float
+
+let f t = sqrt t *. sin t (* f is defined on float signals *)
+...
+open Pervasives (* back to pervasives floats *)
+]}
+ If you are using OCaml 3.12 or later you can also use the [let open]
+ construct
+{[let open React.S.Float in
+let f t = sqrt t *. sin t in (* f is defined on float signals *)
+...
+]}
+
+ {2:recursion Mutual and self reference}
+
+ Mutual and self reference among time varying values occurs naturally
+ in programs. However a mutually recursive definition of two signals
+ in which both need the value of the other at time t to define
+ their value at time t has no least fixed point. To break this
+ tight loop one signal must depend on the value the other had at time
+ t-dt where dt is an infinitesimal delay.
+
+ The fixed point combinators {!E.fix} and {!S.fix} allow to refer to
+ the value an event or signal had an infinitesimal amount of time
+ before. These fixed point combinators act on a function [f] that takes
+ as argument the infinitesimally delayed event or signal that [f]
+ itself returns.
+
+ In the example below [history s] returns a signal whose value
+ is the history of [s] as a list.
+{[let history ?(eq = ( = )) s =
+ let push v = function
+ | [] -> [ v ]
+ | v' :: _ as l when eq v v' -> l
+ | l -> v :: l
+ in
+ let define h =
+ let h' = S.l2 push s h in
+ h', h'
+ in
+ S.fix [] define]}
+ When a program has infinitesimally delayed values a
+ {{!primitives}primitive} may trigger more than one update
+ step. For example if a signal [s] is infinitesimally delayed, then
+ its update in a step [c] will trigger a new step [c'] at the end
+ of the step in which the delayed signal of [s] will have the value
+ [s] had in [c]. This means that the recursion occuring between a
+ signal (or event) and its infinitesimally delayed counterpart must
+ be well-founded otherwise this may trigger an infinite number
+ of update steps, like in the following examples.
+{[let start, send_start = E.create ()
+let diverge =
+ let define e =
+ let e' = E.select [e; start] in
+ e', e'
+ in
+ E.fix define
+
+let () = send_start () (* diverges *)
+
+let diverge = (* diverges *)
+ let define s =
+ let s' = S.Int.succ s in
+ s', s'
+ in
+ S.fix 0 define]}
+ For technical reasons, delayed events and signals (those given to
+ fixing functions) are not allowed to directly depend on each
+ other. Fixed point combinators will raise [Invalid_argument] if
+ such dependencies are created. This limitation can be
+ circumvented by mapping these values with the identity.
+
+ {2:strongstop Strong stops}
+
+ Strong stops should only be used on platforms where weak arrays have
+ a strong semantics (i.e. JavaScript). You can safely ignore that
+ section and the [strong] argument of {!E.stop} and {!S.stop}
+ if that's not the case.
+
+ Whenever {!E.stop} and {!S.stop} is called with [~strong:true] on a
+ reactive value [v], it is first stopped and then it walks over the
+ list [prods] of events and signals that it depends on and
+ unregisters itself from these ones as a dependent (something that is
+ normally automatically done when [v] is garbage collected since
+ dependents are stored in a weak array). Then for each element of
+ [prod] that has no dependents anymore and is not a primitive it
+ stops them aswell and recursively.
+
+ A stop call with [~strong:true] is more involved. But it allows to
+ prevent memory leaks when used judiciously on the leaves of the
+ reactive system that are no longer used.
+
+ {b Warning.} It should be noted that if direct references are kept
+ on an intermediate event or signal of the reactive system it may
+ suddenly stop updating if all its dependents were strongly stopped. In
+ the example below, [e1] will {e never} occur:
+{[let e, e_send = E.create ()
+let e1 = E.map (fun x -> x + 1) e (* never occurs *)
+let () =
+ let e2 = E.map (fun x -> x + 1) e1 in
+ E.stop ~strong:true e2
+]}
+ This can be side stepped by making an artificial dependency to keep
+ the reference:
+{[let e, e_send = E.create ()
+let e1 = E.map (fun x -> x + 1) e (* may still occur *)
+let e1_ref = E.map (fun x -> x) e1
+let () =
+ let e2 = E.map (fun x -> x + 1) e1 in
+ E.stop ~strong:true e2
+]}
+
+ {1:ex Examples}
+
+ {2:clock Clock}
+
+ The following program defines a primitive event [seconds] holding
+ the UNIX time and occuring on every second. An effectful event
+ converts these occurences to local time and prints them on stdout
+ along with an
+ {{:http://www.ecma-international.org/publications/standards/Ecma-048.htm}ANSI
+ escape sequence} to control the cursor position.
+{[let pr_time t =
+ let tm = Unix.localtime t in
+ Printf.printf "\x1B[8D%02d:%02d:%02d%!"
+ tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec
+
+open React;;
+
+let seconds, run =
+ let e, send = E.create () in
+ let run () =
+ while true do send (Unix.gettimeofday ()); Unix.sleep 1 done
+ in
+ e, run
+
+let printer = E.map pr_time seconds
+
+let () = run ()]}
+*)
+
+(*---------------------------------------------------------------------------
+ Copyright (c) 2009 Daniel C. Bünzli
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the
+ distribution.
+
+ 3. Neither the name of Daniel C. Bünzli nor the names of
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ---------------------------------------------------------------------------*)
diff --git a/src/react_top.ml b/src/react_top.ml
new file mode 100644
index 0000000..4b8d1fd
--- /dev/null
+++ b/src/react_top.ml
@@ -0,0 +1,48 @@
+(*---------------------------------------------------------------------------
+ Copyright (c) 2014 Daniel C. Bünzli. All rights reserved.
+ Distributed under the BSD3 license, see license at the end of the file.
+ react release 1.2.0
+ ---------------------------------------------------------------------------*)
+
+let exec s =
+ let l = Lexing.from_string s in
+ let ph = !Toploop.parse_toplevel_phrase l in
+ assert(Toploop.execute_phrase false Format.err_formatter ph)
+
+let setup () =
+ exec "open React;;"
+
+let () = setup ()
+
+(*---------------------------------------------------------------------------
+ Copyright (c) 2014 Daniel C. Bünzli.
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+ 3. Neither the name of Daniel C. Bünzli nor the names of
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ---------------------------------------------------------------------------*)
diff --git a/test/breakout.ml b/test/breakout.ml
new file mode 100644
index 0000000..9cfe500
--- /dev/null
+++ b/test/breakout.ml
@@ -0,0 +1,481 @@
+(*---------------------------------------------------------------------------
+ Copyright (c) (c) 2009 Daniel C. Bünzli. All rights reserved.
+ Distributed under a BSD3 license, see license at the end of the file.
+ ---------------------------------------------------------------------------*)
+
+(* Breakout clone. *)
+
+open React;;
+
+module Log : sig (* Logs values, signals and events to stderr. *)
+ val init : unit -> unit
+ val value : (Format.formatter -> 'a -> unit) -> string -> 'a -> unit
+ val e : (Format.formatter -> 'a -> unit) -> string -> 'a event -> 'a event
+ val s : (Format.formatter -> 'a -> unit) -> string -> 'a signal -> 'a signal
+end = struct
+ let init () =
+ let t = Unix.gettimeofday () in
+ let tm = Unix.localtime t in
+ Format.eprintf
+ "\x1B[2J\x1B[H\x1B[7m@[>> %04d-%02d-%02d %02d:%02d:%02d <<@]\x1B[0m@."
+ (tm.Unix.tm_year + 1900) (tm.Unix.tm_mon + 1) tm.Unix.tm_mday
+ tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec
+
+ let value pp name v = Format.eprintf "@[<hov 2>%s =@ %a@]@." name pp v
+ let e pp name e = E.trace (value pp name) e
+ let s pp name s = S.trace (value pp name) s
+end
+
+module V2 : sig (* Vectors. *)
+ type t
+ val v : float -> float -> t
+ val o : t
+ val ex : t
+ val ey : t
+ val x : t -> float
+ val y : t -> float
+ val add : t -> t -> t
+ val sub : t -> t -> t
+ val neg : t -> t
+ val smul : float -> t -> t
+ val dot : t -> t -> float
+ val to_ints : t -> int * int
+ val print : Format.formatter -> t -> unit
+end = struct
+ type t = { x : float; y : float }
+ let v x y = { x = x; y = y }
+ let o = v 0. 0.
+ let ex = v 1. 0.
+ let ey = v 0. 1.
+ let x p = p.x
+ let y p = p.y
+ let add p p' = v (p.x +. p'.x) (p.y +. p'.y)
+ let sub p p' = v (p.x -. p'.x) (p.y -. p'.y)
+ let neg p = v (-. p.x) (-. p.y)
+ let smul s p = v (s *. p.x) (s *. p.y)
+ let dot p p' = p.x *. p'.x +. p.y *. p'.y
+ let to_ints p = (truncate p.x, truncate p.y)
+ let print pp p = Format.fprintf pp "(%F,%F)" p.x p.y
+end
+
+module Rect : sig (* Rectangles. *)
+ type t
+ val create : V2.t -> V2.t -> t (* lower left corner and extents. *)
+ val empty : t
+ val o : t -> V2.t
+ val size : t -> V2.t
+ val xmin : t -> float
+ val xmax : t -> float
+ val ymin : t -> float
+ val ymax : t -> float
+ val print : Format.formatter -> t -> unit
+end = struct
+ type t = V2.t * V2.t
+ let create o size = o, size
+ let empty = V2.o, V2.o
+ let o (o, s) = o
+ let size (_, s) = s
+ let xmin (o, _) = V2.x o
+ let xmax (o, s) = V2.x o +. V2.x s
+ let ymin (o, _) = V2.y o
+ let ymax (o, s) = V2.y o +. V2.y s
+ let print pp (o, s) = Format.fprintf pp "%a %a" V2.print o V2.print s
+end
+
+module Draw : sig (* Draw with ANSI escape sequences. *)
+ val frame : Rect.t
+ val init : unit -> unit
+ val clear : unit -> unit
+ val flush : unit -> unit
+ val text : ?center:bool -> ?color:int -> V2.t -> string -> unit
+ val rect : ?color:int -> Rect.t -> unit
+ val beep : unit -> unit
+end = struct
+ let pr = Printf.printf
+ let frame = Rect.create (V2.v 1. 1.) (V2.v 80. 24.)
+ let clear () = pr "\x1B[47m\x1B[2J"
+ let flush () = pr "%!"
+ let reset () = clear (); pr "\x1Bc"; flush ()
+ let init () =
+ pr "\x1B[H\x1B[7l\x1B[?25l"; clear (); flush ();
+ at_exit (reset)
+
+ let text ?(center = true) ?(color = 30) pos str =
+ let x, y = V2.to_ints pos in
+ let x = if center then x - (String.length str) / 2 else x in
+ pr ("\x1B[%d;%df\x1B[47;%dm%s") y x color str
+
+ let rect ?(color = 40) r =
+ let (x, y) = V2.to_ints (Rect.o r) in
+ let (w, h) = V2.to_ints (Rect.size r) in
+ pr "\x1B[%dm" color;
+ for y' = y to y + h - 1 do
+ pr "\x1B[%d;%df" y' x; for i = 1 to w do pr " " done
+ done
+
+ let beep () = pr "\x07%!"
+end
+
+module Input : sig (* Keyboard and time events. *)
+ val init : unit -> unit
+ val time : float event (* time event. *)
+ val key : char event (* keyboard event. *)
+ val gather : unit -> unit
+end = struct
+ let init () = (* suppress input echo and buffering. *)
+ let reset tattr () = Unix.tcsetattr Unix.stdin Unix.TCSAFLUSH tattr in
+ let attr = Unix.tcgetattr Unix.stdin in
+ let attr' = { attr with Unix.c_echo = false; c_icanon = false } in
+ let quit _ = exit 0 in
+ at_exit (reset attr);
+ Unix.tcsetattr Unix.stdin Unix.TCSANOW attr';
+ Sys.set_signal Sys.sigquit (Sys.Signal_handle quit);
+ Sys.set_signal Sys.sigint (Sys.Signal_handle quit);
+ Sys.set_signal Sys.sigfpe (Sys.Signal_handle quit)
+
+ let time, send_time = E.create ()
+ let key, send_key = E.create ()
+ let gather () = (* updates primitive events. *)
+ let c = " " in
+ let i = Unix.stdin in
+ let input_char i = ignore (Unix.read i c 0 1); c.[0] in
+ let dt = 0.1 in
+ while true do
+ if Unix.select [i] [] [] dt = ([i], [], []) then send_key (input_char i);
+ send_time (Unix.gettimeofday ());
+ done
+end
+
+module Game : sig (* Game simulation and logic. *)
+ type t
+ val create : Rect.t -> float event -> [`Left | `Right ] event -> t
+ val walls : t -> Rect.t
+ val ball : t -> Rect.t signal
+ val paddle : t -> Rect.t signal
+ val bricks : t -> Rect.t list signal
+ val brick_count : t -> int signal
+ val collisions : t -> unit event
+ val outcome : t -> [> `Game_over of int ] event
+end = struct
+ type t =
+ { walls : Rect.t;
+ ball : Rect.t signal;
+ paddle : Rect.t signal;
+ bricks : Rect.t list signal;
+ brick_count : int signal;
+ collisions : unit event }
+
+ (* Collisions *)
+
+ let ctime c r d n = Some (n, (r -. c) /. d)
+ let cmin c r d n = if r <= c && d < 0. then ctime c r d n else None
+ let cmax c r d n = if r >= c && d > 0. then ctime c r d n else None
+ let cinter cmin cmax rmin rmax d n = match d with
+ | d when d < 0. ->
+ if rmax -. d < cmin then None else (* moving apart. *)
+ if rmin -. d >= cmax then
+ if rmin <= cmax then ctime cmax rmin d n else None
+ else Some (V2.o, 0.) (* initially overlapping. *)
+ | d when d > 0. ->
+ if rmin -. d > cmax then None else (* moving apart. *)
+ if rmax -. d <= cmin then
+ if rmax >= cmin then ctime cmin rmax d (V2.neg n) else None
+ else Some (V2.o, 0.) (* initially overlapping. *)
+ | _ (* d = 0. *) ->
+ if cmax < rmin || rmax < cmin then None else Some (V2.o, 0.)
+
+ let crect c r d = (* r last moved by d relatively to c. *)
+ let inter min max c r d n = cinter (min c) (max c) (min r) (max r) d n in
+ match inter Rect.xmin Rect.xmax c r (V2.x d) V2.ex with
+ | None -> None
+ | Some (_, t as x) ->
+ match inter Rect.ymin Rect.ymax c r (V2.y d) V2.ey with
+ | None -> None
+ | Some (_, t' as y) ->
+ let _, t as c = if t > t' then x else y in
+ if t = 0. then None else Some c
+
+ (* Game objects *)
+
+ let moving_rect pos size = S.map (fun pos -> Rect.create pos size) pos
+
+ let ball walls dt collisions =
+ let size = V2.v 2. 1. in
+ let x0 = 0.5 *. (Rect.xmax walls -. V2.x size) in
+ let p0 = V2.v x0 (0.5 *. Rect.ymax walls) in
+ let v0 =
+ let sign = if Random.bool () then -1. else 1. in
+ let angle = (sign *. (10. +. Random.float 60.) *. 3.14) /. 180. in
+ let speed = 18. +. Random.float 2. in
+ V2.v (speed *. sin angle) (speed *. cos angle)
+ in
+ let v =
+ let bounce (n, _) v = V2.sub v (V2.smul (2. *. V2.dot n v) n) in
+ S.accum (E.map bounce collisions) v0
+ in
+ let dp = S.sample (fun dt v -> V2.smul dt v) dt v in
+ let p =
+ let pos p0 = S.fold V2.add p0 dp in
+ let adjust (_, pc) = pos pc in (* visually sufficient. *)
+ S.switch (S.hold ~eq:( == ) (pos p0) (E.map adjust collisions))
+ in
+ moving_rect p size, dp
+
+ let walls walls (ball, dp) =
+ let left = Rect.xmin walls in
+ let right = Rect.xmax walls in
+ let top = Rect.ymin walls in
+ let collisions =
+ let collide dp ball =
+ let c = match cmin left (Rect.xmin ball) (V2.x dp) V2.ex with
+ | Some _ as c -> c
+ | None ->
+ match cmax right (Rect.xmax ball) (V2.x dp) (V2.neg V2.ex) with
+ | Some _ as c -> c
+ | None -> cmin top (Rect.ymin ball) (V2.y dp) V2.ey
+ in
+ match c with
+ | None -> None
+ | Some (n, t) -> Some (n, V2.sub (Rect.o ball) (V2.smul t dp))
+ in
+ E.fmap (fun x -> x) (S.sample collide dp ball)
+ in
+ walls, collisions
+
+ let paddle walls moves (ball, dp) =
+ let speed = 4. in
+ let size = V2.v 9. 1. in
+ let xmin = Rect.xmin walls in
+ let xmax = Rect.xmax walls -. (V2.x size) in
+ let p0 = V2.v (0.5 *. xmax) (Rect.ymax walls -. 2.) in
+ let control p = function
+ | `Left ->
+ let x' = V2.x p -. speed in
+ if x' < xmin then V2.v xmin (V2.y p) else V2.v x' (V2.y p)
+ | `Right ->
+ let x' = V2.x p +. speed in
+ if x' > xmax then V2.v xmax (V2.y p) else V2.v x' (V2.y p)
+ in
+ let paddle = moving_rect (S.fold control p0 moves) size in
+ let collisions =
+ let collide dp (ball, paddle) = match crect paddle ball dp with
+ | None -> None
+ | Some (n, t) -> Some (n, V2.sub (Rect.o ball) (V2.smul t dp))
+ in
+ E.fmap (fun x -> x) (S.sample collide dp (S.Pair.pair ball paddle))
+ in
+ paddle, collisions
+
+ let bricks walls (ball, dp) =
+ let bricks0 =
+ let size = Rect.size walls in
+ let w = V2.x size in
+ let h = (V2.y size) /. 4. in (* use 1/4 for bricks. *)
+ let bw, bh = (w /. 8.), h /. 3. in
+ let x_count = truncate (w /. bw) in
+ let y_count = truncate (h /. bh) in
+ let acc = ref [] in
+ for x = 0 to x_count - 1 do
+ for y = 0 to y_count - 1 do
+ let x = Rect.xmin walls +. (float x) *. bw in
+ let y = Rect.ymin walls +. 2. *. bh +. (float y) *. bh in
+ acc := Rect.create (V2.v x y) (V2.v bw bh) :: !acc
+ done
+ done;
+ !acc
+ in
+ let define bricks =
+ let cresult =
+ let collide dp (ball, bricks) =
+ let rec aux c acc bricks ball dp = match bricks with
+ | [] -> c, List.rev acc
+ | b :: bricks' -> match crect b ball dp with
+ | None -> aux c (b :: acc) bricks' ball dp
+ | c -> aux c acc bricks' ball dp
+ in
+ match aux None [] bricks ball dp with
+ | None, bl -> None, bl
+ | Some (n, t), bl -> Some (n, V2.sub (Rect.o ball) (V2.smul t dp)),bl
+ in
+ S.sample collide dp (S.Pair.pair ball bricks)
+ in
+ let collisions = E.fmap (fun (c, _) -> c) cresult in
+ let bricks_e = E.map (fun (_, bl) -> fun _ -> bl) cresult in
+ let bricks' = S.accum bricks_e bricks0 in
+ bricks', (bricks', collisions)
+ in
+ S.fix bricks0 define
+
+ (* Game data structure, links game objects *)
+
+ let create w dt moves =
+ let define collisions =
+ let ball = ball w dt collisions in
+ let walls, wcollisions = walls w ball in
+ let paddle, pcollisions = paddle w moves ball in
+ let bricks, bcollisions = bricks w ball in
+ let collisions' = E.select [pcollisions; wcollisions; bcollisions] in
+ let g =
+ { walls = walls;
+ ball = S.dismiss collisions' Rect.empty (fst ball);
+ paddle = paddle;
+ bricks = bricks;
+ brick_count = S.map List.length bricks;
+ collisions = E.stamp collisions' () }
+ in
+ collisions', g
+ in
+ E.fix define
+
+ let walls g = g.walls
+ let ball g = g.ball
+ let paddle g = g.paddle
+ let bricks g = g.bricks
+ let brick_count g = g.brick_count
+ let collisions g = g.collisions
+ let outcome g = (* game outcome logic. *)
+ let no_bricks = S.map (fun l -> l = 0) g.brick_count in
+ let miss = S.map (fun b -> Rect.ymax b >= Rect.ymax g.walls) g.ball in
+ let game_over = S.changes (S.Bool.( || ) no_bricks miss) in
+ S.sample (fun _ l -> `Game_over l) game_over g.brick_count
+end
+
+module Render = struct
+ let str = Printf.sprintf
+ let str_bricks count = if count = 1 then "1 brick" else str "%d bricks" count
+
+ let intro title_color = (* draws the splash screen. *)
+ let x = 0.5 *. Rect.xmax Draw.frame in
+ let y = 0.5 *. Rect.ymax Draw.frame in
+ Draw.clear ();
+ Draw.text ~color:title_color (V2.v x (y -. 2.)) "BREAKOUT";
+ Draw.text ~color:30 (V2.v x y)
+ "Hit 'a' and 'd' to move the paddle, 'q' to quit";
+ Draw.text ~color:31 (V2.v x (y +. 2.)) "Hit spacebar to start the game";
+ Draw.flush ()
+
+ let game_init m = (* draws game init message. *)
+ let x = 0.5 *. Rect.xmax Draw.frame in
+ let y = 0.5 *. Rect.ymax Draw.frame in
+ Draw.text ~color:31 (V2.v x (y +. 2.)) m;
+ Draw.flush ()
+
+ let game ball paddle bricks bcount = (* draws the game state. *)
+ let bl = V2.v (Rect.xmin Draw.frame) (Rect.ymax Draw.frame -. 1.) in
+ Draw.clear ();
+ List.iter (Draw.rect ~color:40) bricks;
+ Draw.rect ~color:44 paddle;
+ Draw.rect ~color:41 ball;
+ Draw.text ~center:false ~color:30 bl (str "%s left" (str_bricks bcount));
+ Draw.flush ()
+
+ let game_over outcome = (* draws the game over screen. *)
+ let x = 0.5 *. Rect.xmax Draw.frame in
+ let y = 0.5 *. Rect.ymax Draw.frame in
+ let outcome_msg =
+ if outcome = 0 then "Congratulations, no bricks left" else
+ str "%s left, you can do better" (str_bricks outcome)
+ in
+ Draw.text ~color:34 (V2.v x (y +. 2.)) "GAME OVER";
+ Draw.text ~color:30 (V2.v x (y +. 4.)) outcome_msg;
+ Draw.text ~color:31 (V2.v x (y +. 6.)) "Hit spacebar to start again";
+ Draw.flush ()
+end
+
+module Ui : sig
+ val init : unit -> unit event
+end = struct
+ let key k = E.fmap (fun c -> if c = k then Some () else None) Input.key
+ let quit () = E.once (E.stamp (key 'q') `Quit)
+ let new_game () = E.once (E.stamp (key ' ') `Game)
+
+ let wait_until ?stop e = match stop with
+ | Some s -> E.map (fun v -> s (); v) (E.once e)
+ | None -> E.once e
+
+ let intro () =
+ let color_swap = E.stamp Input.time (fun c -> if c = 31 then 34 else 31) in
+ let output = S.l1 Render.intro (S.accum color_swap 34) in
+ let stop () = S.stop output in
+ wait_until (E.select [quit (); new_game ()]) ~stop
+
+ let game () =
+ let run = S.hold false (E.once (E.stamp (key ' ') true)) in
+ let moves =
+ let move = function 'a' -> Some `Left | 'd' -> Some `Right | _ -> None in
+ E.on run (E.fmap move Input.key)
+ in
+ let dt = E.on run (E.diff ( -. ) Input.time) in
+ let g = Game.create Draw.frame dt moves in
+ let outcome = Game.outcome g in
+ let sound = E.map Draw.beep (Game.collisions g) in
+ let output = S.l4 Render.game (Game.ball g) (Game.paddle g) (Game.bricks g)
+ (Game.brick_count g)
+ in
+ let stop () = E.stop sound; S.stop output in
+ Render.game_init "Hit spacebar to start the game";
+ wait_until (E.select [quit (); outcome]) ~stop
+
+ let game_over outcome =
+ Render.game_over outcome;
+ wait_until (E.select [quit (); new_game ()])
+
+ let init () =
+ let define ui =
+ let display ui =
+ Gc.full_major (); (* cleanup game objects. *)
+ match ui with
+ | `Intro -> intro ()
+ | `Game -> game ()
+ | `Game_over outcome -> game_over outcome
+ | `Quit -> exit 0
+ in
+ let ui' = E.switch (display `Intro) (E.map display ui) in
+ ui', ui'
+ in
+ E.stamp (E.fix define) ()
+end
+
+let main () =
+ Random.self_init ();
+ Log.init ();
+ Draw.init ();
+ Input.init ();
+ let ui = Ui.init () in
+ Input.gather ();
+ ui
+
+let ui = main () (* keep a ref. to avoid g.c. *)
+
+(*----------------------------------------------------------------------------
+ Copyright (c) 2009 Daniel C. Bünzli
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the
+ distribution.
+
+ 3. Neither the name of Daniel C. Bünzli nor the names of
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ---------------------------------------------------------------------------*)
diff --git a/test/clock.ml b/test/clock.ml
new file mode 100644
index 0000000..8b957a8
--- /dev/null
+++ b/test/clock.ml
@@ -0,0 +1,18 @@
+(* This code is in the public domain.
+ Prints a clock with the current local time in the terminal. *)
+
+let pr_time t =
+ let tm = Unix.localtime t in
+ Printf.printf "\x1B[8D%02d:%02d:%02d%!"
+ tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec
+
+open React;;
+
+let seconds, run =
+ let e, send = E.create () in
+ let run () = while true do send (Unix.gettimeofday ()); Unix.sleep 1 done in
+ e, run
+
+let printer = E.map pr_time seconds
+
+let () = run ()
diff --git a/test/js_test.html b/test/js_test.html
new file mode 100644
index 0000000..dd534ca
--- /dev/null
+++ b/test/js_test.html
@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<!--
+ This code is in the public domain.
+-->
+<html lang="en">
+<head>
+ <meta charset="utf-8">
+ <meta name="viewport" content="width=device-width,
+ initial-scale=1.0">
+ <script type="text/javascript" defer="defer" src="js_test.js"></script>
+ <style type="text/css">
+ body { color:gray; background-color: black; margin: 3em; }
+ </style>
+ <title>React strong stops</title>
+</head>
+<body>
+ <noscript>Sorry, you need to enable JavaScript to see this page.</noscript>
+ <p>Tab memory usage should be bounded and the step counter below
+ should not slow down.</p>
+ <p>Steps: <span id="count">0</span></p>
+</body>
+</html>
diff --git a/test/js_test.ml b/test/js_test.ml
new file mode 100644
index 0000000..853fff0
--- /dev/null
+++ b/test/js_test.ml
@@ -0,0 +1,49 @@
+(* Test for ~strong stop *)
+
+open React
+
+let strong = true
+
+(* Artificially increase memory usage *)
+let high_e e =
+ let id e = E.map (fun v -> v) e in
+ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@
+ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@
+ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@
+ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@
+ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@
+ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@
+ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@
+ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@
+ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@
+ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@
+ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@
+ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@
+ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@
+ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@
+ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@
+ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@ id @@
+ e
+
+let counter_ui =
+ let none () = assert false in
+ let el = Dom_html.window ## document ## getElementById (Js.string "count") in
+ Js.Opt.get el none
+
+let count = ref 0
+let incr_counter () =
+ incr count;
+ counter_ui ## innerHTML <- Js.string (string_of_int !count)
+
+let tick, send_tick = E.create ()
+
+let rec loop () =
+ let ev = E.map (fun () -> incr_counter ()) (high_e tick) in
+ send_tick ();
+ E.stop ~strong ev;
+ ignore (Dom_html.window ## setTimeout (Js.wrap_callback loop, 1.))
+
+
+let main _ = loop (); Js._false
+
+let () = Dom_html.window ## onload <- Dom_html.handler main
diff --git a/test/test.ml b/test/test.ml
new file mode 100644
index 0000000..d1f8633
--- /dev/null
+++ b/test/test.ml
@@ -0,0 +1,1523 @@
+(*---------------------------------------------------------------------------
+ Copyright (c) 2009 Daniel C. Bünzli. All rights reserved.
+ Distributed under a BSD3 license, see license at the end of the file.
+ ---------------------------------------------------------------------------*)
+
+(* Tests for react's combinators.
+ Compile with -g to get a precise backtrace to the error.
+
+ Note that the testing mechanism itself (cf. occs and vals) needs a correct
+ implementation; particulary w.r.t. updates with side effects. *)
+
+open React;;
+
+let pp_list ppv pp l =
+ Format.fprintf pp "@[[";
+ List.iter (fun v -> Format.fprintf pp "%a;@ " ppv v) l;
+ Format.fprintf pp "]@]"
+
+let pr_value pp name v = Format.printf "@[<hov 2>%s =@ %a@]@." name pp v
+let e_pr ?iff pp name e = E.trace ?iff (pr_value pp name) e
+let s_pr ?iff pp name s = S.trace ?iff (pr_value pp name) s
+
+(* Tests the event e has occurences occs. *)
+let occs ?(eq = ( = )) e occs =
+ let occs = ref occs in
+ let assert_occ o = match !occs with
+ | o' :: occs' when eq o' o -> occs := occs'
+ | _ -> assert false
+ in
+ E.map assert_occ e, occs
+
+(* Tests the signal s goes through vals. *)
+let vals ?(eq = ( = )) s vals =
+ let vals = ref vals in
+ let assert_val v = match !vals with
+ | v' :: vals' when eq v' v -> vals := vals'
+ | _ -> assert false
+ in
+ S.map assert_val s, vals
+
+(* Tests that we went through all vals or occs *)
+let empty (_, r) = assert (!r = [])
+
+(* To initialize asserts of dynamic creations. *)
+let assert_e_stub () = ref (occs E.never [])
+let assert_s_stub v = ref (vals (S.const v) [v])
+
+(* To keep references for the g.c. (warning also stops the given nodes) *)
+let keep_eref e = E.stop e
+let keep_sref s = S.stop s
+
+(* To artificially raise the rank of events and signals *)
+let high_e e =
+ let id e = E.map (fun v -> v) e in (id (id (id (id (id (id (id (id e))))))))
+
+let high_s s =
+ let id s = S.map (fun v -> v) s in (id (id (id (id (id (id (id (id s))))))))
+
+(* Event tests *)
+
+let test_no_leak () =
+ let x, send_x = E.create () in
+ let count = ref 0 in
+ let w =
+ let w = Weak.create 1 in
+ let e = E.map (fun x -> incr count) x in
+ Weak.set w 0 (Some e);
+ w
+ in
+ List.iter send_x [0; 1; 2];
+ Gc.full_major ();
+ List.iter send_x [3; 4; 5];
+ (match Weak.get w 0 with None -> () | Some _ -> assert false);
+ if !count > 3 then assert false else ()
+
+let test_once_drop_once () =
+ let w, send_w = E.create () in
+ let x = E.once w in
+ let y = E.drop_once w in
+ let assert_x = occs x [0] in
+ let assert_y = occs y [1; 2; 3] in
+ let assert_dx = assert_e_stub () in
+ let assert_dy = assert_e_stub () in
+ let dyn () =
+ let dx = E.once w in
+ let dy = E.drop_once w in
+ assert_dx := occs dx [1];
+ assert_dy := occs dy [2; 3]
+ in
+ let create_dyn = E.map (fun v -> if v = 1 then dyn ()) w in
+ Gc.full_major ();
+ List.iter send_w [0; 1; 2; 3];
+ List.iter empty [assert_x; assert_y; !assert_dx; !assert_dy];
+ keep_eref create_dyn
+
+let test_app () =
+ let f x y = x + y in
+ let w, send_w = E.create () in
+ let x = E.map (fun w -> f w) w in
+ let y = E.drop_once w in
+ let z = E.app x y in
+ let assert_z = occs z [ 2; 4; 6 ] in
+ let assert_dz = assert_e_stub () in
+ let dyn () =
+ let dx = E.drop_once (E.map (fun w -> f w) w) in
+ let dz = E.app dx y in
+ assert_dz := occs dz [ 4; 6 ];
+ in
+ let create_dyn = E.map (fun v -> if v = 1 then dyn ()) w in
+ Gc.full_major ();
+ List.iter send_w [0; 1; 2; 3];
+ List.iter empty [assert_z; !assert_dz];
+ keep_eref create_dyn
+
+let test_map_stamp_filter_fmap () =
+ let v, send_v = E.create () in
+ let w = E.map (fun s -> "z:" ^ s) v in
+ let x = E.stamp v "bla" in
+ let y = E.filter (fun s -> String.length s = 5) v in
+ let z = E.fmap (fun s -> if s = "blu" then Some "hip" else None) v in
+ let assert_w = occs w ["z:didap"; "z:dip"; "z:didop"; "z:blu"] in
+ let assert_x = occs x ["bla"; "bla"; "bla"; "bla"] in
+ let assert_y = occs y ["didap"; "didop"] in
+ let assert_z = occs z ["hip"] in
+ let assert_dw = assert_e_stub () in
+ let assert_dx = assert_e_stub () in
+ let assert_dy = assert_e_stub () in
+ let assert_dz = assert_e_stub () in
+ let dyn () =
+ let dw = E.map (fun s -> String.length s) v in
+ let dx = E.stamp v 4 in
+ let dy = E.filter (fun s -> String.length s = 5) v in
+ let dz = E.fmap (fun s -> if s = "didap" then Some "ha" else None) v in
+ let _ = E.map (fun _ -> assert false) (E.fmap (fun _ -> None) x) in
+ assert_dw := occs dw [5; 3; 5; 3];
+ assert_dx := occs dx [4; 4; 4; 4];
+ assert_dy := occs dy ["didap"; "didop"];
+ assert_dz := occs dz ["ha"];
+ in
+ let create_dyn = E.map (fun v -> if v = "didap" then dyn ()) v in
+ Gc.full_major ();
+ List.iter send_v ["didap"; "dip"; "didop"; "blu"];
+ List.iter empty [assert_w; assert_x; assert_y; assert_z];
+ List.iter empty [!assert_dw; !assert_dx];
+ List.iter empty [!assert_dy; !assert_dz];
+ keep_eref create_dyn
+
+let test_diff_changes () =
+ let x, send_x = E.create () in
+ let y = E.diff ( - ) x in
+ let z = E.changes x in
+ let assert_y = occs y [ 0; 1; 1; 0] in
+ let assert_z = occs z [ 1; 2; 3] in
+ let assert_dy = assert_e_stub () in
+ let assert_dz = assert_e_stub () in
+ let dyn () =
+ let dy = E.diff ( - ) x in
+ let dz = E.changes z in
+ assert_dy := occs dy [1; 0];
+ assert_dz := occs dz [2; 3];
+ in
+ let create_dyn = E.map (fun v -> if v = 2 then dyn ()) x in
+ Gc.full_major ();
+ List.iter send_x [1; 1; 2; 3; 3];
+ List.iter empty [assert_y; assert_z; !assert_dy; !assert_dz];
+ keep_eref create_dyn
+
+let test_dismiss () =
+ let x, send_x = E.create () in
+ let y = E.fmap (fun x -> if x mod 2 = 0 then Some x else None) x in
+ let z = E.dismiss y x in
+ let assert_z = occs z [1; 3; 5] in
+ let assert_dz = assert_e_stub () in
+ let dyn () =
+ let dz = E.dismiss y x in
+ assert_dz := occs dz [3; 5];
+ in
+ let create_dyn = E.map (fun v -> if v = 2 then dyn()) x in
+ Gc.full_major ();
+ List.iter send_x [0; 1; 2; 3; 4; 5];
+ List.iter empty [assert_z; !assert_dz];
+ keep_eref create_dyn
+
+let test_on () =
+ let e, send_e = E.create () in
+ let s = S.hold 0 e in
+ let c = S.map (fun x -> x mod 2 = 0) s in
+ let w = E.on c e in
+ let ovals = [2; 4; 4; 6; 4] in
+ let assert_w = occs w ovals in
+ let assert_dw = assert_e_stub () in
+ let assert_dhw = assert_e_stub () in
+ let dyn () =
+ let dw = E.on c e in
+ let dhw = E.on (high_s c) (high_e e) in
+ assert_dw := occs dw ovals;
+ assert_dhw := occs dhw ovals
+ in
+ let create_dyn = E.map (fun v -> if v = 2 then dyn ()) e in
+ Gc.full_major ();
+ List.iter send_e [ 1; 3; 1; 2; 4; 4; 6; 1; 3; 4 ];
+ List.iter empty [assert_w; !assert_dw; !assert_dhw ];
+ keep_eref create_dyn
+
+let test_until () =
+ let x, send_x = E.create () in
+ let stop = E.filter (fun v -> v = 3) x in
+ let e = E.until stop x in
+ let assert_e = occs e [1; 2] in
+ let assert_de = assert_e_stub () in
+ let assert_de' = assert_e_stub () in
+ let dyn () =
+ let de = E.until stop x in
+ let de' = E.until (E.filter (fun v -> v = 5) x) x in
+ assert_de := occs de [];
+ assert_de' := occs de' [3; 4]
+ in
+ let create_dyn = E.map (fun v -> if v = 3 then dyn ()) x in
+ Gc.full_major ();
+ List.iter send_x [1; 2; 3; 4; 5];
+ List.iter empty [assert_e; !assert_de; !assert_de'];
+ keep_eref create_dyn
+
+let test_accum () =
+ let f, send_f = E.create () in
+ let a = E.accum f 0 in
+ let assert_a = occs a [2; -1; -2] in
+ let assert_da = assert_e_stub () in
+ let dyn () =
+ let da = E.accum f 0 in
+ assert_da := occs da [1; 2];
+ in
+ let create_dyn =
+ let count = ref 0 in
+ E.map (fun _ -> incr count; if !count = 2 then dyn ()) f
+ in
+ Gc.full_major ();
+ List.iter send_f [( + ) 2; ( - ) 1; ( * ) 2];
+ List.iter empty [assert_a; !assert_da];
+ keep_eref create_dyn
+
+let test_fold () =
+ let x, send_x = E.create () in
+ let c = E.fold ( + ) 0 x in
+ let assert_c = occs c [1; 3; 6; 10] in
+ let assert_dc = assert_e_stub () in
+ let dyn () =
+ let dc = E.fold ( + ) 0 x in
+ assert_dc := occs dc [2; 5; 9];
+ in
+ let create_dyn = E.map (fun v -> if v = 2 then dyn ()) x in
+ Gc.full_major ();
+ List.iter send_x [1; 2; 3; 4];
+ List.iter empty [assert_c; !assert_dc];
+ keep_eref create_dyn
+
+let test_select () =
+ let w, send_w = E.create () in
+ let x, send_x = E.create () in
+ let y = E.map succ w in
+ let z = E.map succ y in
+ let tw = E.map (fun v -> `Int v) w in
+ let tx = E.map (fun v -> `Bool v) x in
+ let t = E.select [tw; tx] in
+ let sy = E.select [y; z] in (* always y. *)
+ let sz = E.select [z; y] in (* always z. *)
+ let assert_t = occs t [ `Int 0; `Bool false; `Int 1; `Int 2; `Int 3 ] in
+ let assert_sy = occs sy [1; 2; 3; 4] in
+ let assert_sz = occs sz [2; 3; 4; 5] in
+ let assert_d = assert_e_stub () in
+ let dyn () =
+ let d = E.select [y; w; z] in
+ assert_d := occs d [3; 4]
+ in
+ let create_dyn = E.map (fun v -> if v = 2 then dyn ()) w in
+ Gc.full_major ();
+ send_w 0; send_x false; List.iter send_w [1; 2; 3;];
+ empty assert_t; List.iter empty [assert_sy; assert_sz; !assert_d];
+ keep_eref create_dyn
+
+let test_merge () =
+ let w, send_w = E.create () in
+ let x, send_x = E.create () in
+ let y = E.map succ w in
+ let z = E.merge (fun acc v -> v :: acc) [] [w; x; y] in
+ let assert_z = occs z [[2; 1]; [4]; [3; 2]] in
+ let assert_dz = assert_e_stub () in
+ let dyn () =
+ let dz = E.merge (fun acc v -> v :: acc) [] [y; x; w] in
+ assert_dz := occs dz [[4]; [2; 3]]
+ in
+ let create_dyn = E.map (fun v -> if v = 4 then dyn ()) x in
+ Gc.full_major ();
+ send_w 1; send_x 4; send_w 2;
+ List.iter empty [assert_z; !assert_dz];
+ keep_eref create_dyn
+
+let test_switch () =
+ let x, send_x = E.create () in
+ let switch e =
+ E.fmap (fun v -> if v mod 3 = 0 then Some (E.map (( * ) v) e) else None) x
+ in
+ let s = E.switch x (switch x) in
+ let hs = E.switch x (switch (high_e x)) in
+ let assert_s = occs s [1; 2; 9; 12; 15; 36; 42; 48; 81] in
+ let assert_hs = occs hs [1; 2; 9; 12; 15; 36; 42; 48; 81] in
+ let assert_ds = assert_e_stub () in
+ let assert_dhs = assert_e_stub () in
+ let dyn () =
+ let ds = E.switch x (switch x) in
+ let dhs = E.switch x (switch (high_e x)) in
+ assert_ds := occs ds [9; 12; 15; 36; 42; 48; 81];
+ assert_ds := occs dhs [9; 12; 15; 36; 42; 48; 81]
+ in
+ let create_dyn = E.map (fun v -> if v = 3 then dyn ()) x in
+ Gc.full_major ();
+ List.iter send_x [1; 2; 3; 4; 5; 6; 7; 8; 9];
+ List.iter empty [assert_s; assert_hs; !assert_ds; !assert_dhs];
+ keep_eref create_dyn
+
+let test_fix () =
+ let x, send_x = E.create () in
+ let c1 () = E.stamp x `C2 in
+ let c2 () = E.stamp x `C1 in
+ let loop result =
+ let switch = function `C1 -> c1 () | `C2 -> c2 () in
+ let switcher = E.switch (c1 ()) (E.map switch result) in
+ switcher, switcher
+ in
+ let l = E.fix loop in
+ let assert_l = occs l [`C2; `C1; `C2] in
+ let assert_dl = assert_e_stub () in
+ let dyn () =
+ let dl = E.fix loop in
+ assert_dl := occs dl [`C2; `C1];
+ in
+ let create_dyn = E.map (fun v -> if v = 2 then dyn ()) x in
+ Gc.full_major ();
+ List.iter send_x [1; 2; 3];
+ List.iter empty [assert_l; !assert_dl];
+ keep_eref create_dyn
+
+let test_lifts () =
+ let x1, send_x1 = E.create () in
+ let x2, send_x2 = E.create () in
+ let x3, send_x3 = E.create () in
+ let x4, send_x4 = E.create () in
+ let x5, send_x5 = E.create () in
+ let x6, send_x6 = E.create () in
+ let f1 a = 1 + a in
+ let f2 a0 a1 = a0 + a1 in
+ let f3 a0 a1 a2 = a0 + a1 + a2 in
+ let f4 a0 a1 a2 a3 = a0 + a1 + a2 + a3 in
+ let f5 a0 a1 a2 a3 a4 = a0 + a1 + a2 + a3 + a4 in
+ let f6 a0 a1 a2 a3 a4 a5 = a0 + a1 + a2 + a3 + a4 + a5 in
+ let v1 = E.l1 f1 x1 in
+ let v2 = E.l2 f2 x1 x2 in
+ let v3 = E.l3 f3 x1 x2 x3 in
+ let v4 = E.l4 f4 x1 x2 x3 x4 in
+ let v5 = E.l5 f5 x1 x2 x3 x4 x5 in
+ let v6 = E.l6 f6 x1 x2 x3 x4 x5 x6 in
+ let a_v1 = occs v1 [2; 2; 2; 2; 2; 2;] in
+ let a_v2 = occs v2 [ 3; 3; 3; 3; 3;] in
+ let a_v3 = occs v3 [ 6; 6; 6; 6;] in
+ let a_v4 = occs v4 [ 10;10;10;] in
+ let a_v5 = occs v5 [ 15;15;] in
+ let a_v6 = occs v6 [ 21;] in
+ let with_step f =
+ let s = Step.create () in
+ f s; Step.execute s
+ in
+ let s1 s = send_x1 ~step:s 1 in
+ let s2 s = s1 s; send_x2 ~step:s 2 in
+ let s3 s = s2 s; send_x3 ~step:s 3 in
+ let s4 s = s3 s; send_x4 ~step:s 4 in
+ let s5 s = s4 s; send_x5 ~step:s 5 in
+ let s6 s = s5 s; send_x6 ~step:s 6 in
+ with_step s1; with_step s2; with_step s3;
+ with_step s4; with_step s5; with_step s6;
+ List.iter empty [ a_v1; a_v2; a_v3; a_v4; a_v5; a_v6;];
+ ()
+
+let test_option () =
+ let x, send_x = E.create () in
+ let s, set_s = S.create 4 in
+ let some = E.Option.some (S.changes s) in
+ let e0 = E.Option.value x in
+ let e1 = E.Option.value ~default:(S.const 2) x in
+ let e2 = E.Option.value ~default:s x in
+ let assert_some = occs some [ Some 42;] in
+ let assert_e0 = occs e0 [1; 5; ] in
+ let assert_e1 = occs e1 [1; 2; 5; 2] in
+ let assert_e2 = occs e2 [1; 4; 5; 42] in
+ send_x (Some 1); send_x None; set_s 42;
+ send_x (Some 5); send_x None;
+ empty assert_some;
+ List.iter empty [ assert_e0; assert_e1; assert_e2];
+ ()
+
+let test_events () =
+ test_no_leak ();
+ test_once_drop_once ();
+ test_app ();
+ test_map_stamp_filter_fmap ();
+ test_diff_changes ();
+ test_on ();
+ test_dismiss ();
+ test_until ();
+ test_accum ();
+ test_fold ();
+ test_select ();
+ test_merge ();
+ test_switch ();
+ test_fix ();
+ test_lifts ();
+ test_option ();
+ ()
+
+(* Signal tests *)
+
+let test_no_leak () =
+ let x, set_x = S.create 0 in
+ let count = ref 0 in
+ let w =
+ let w = Weak.create 1 in
+ let e = S.map (fun x -> incr count) x in
+ Weak.set w 0 (Some e);
+ w
+ in
+ List.iter set_x [ 0; 1; 2];
+ Gc.full_major ();
+ List.iter set_x [ 3; 4; 5];
+ (match Weak.get w 0 with None -> () | Some _ -> assert false);
+ if !count > 3 then assert false else ()
+
+let test_hold () =
+ let e, send_e = E.create () in
+ let e', send_e' = E.create () in
+ let he = high_e e in
+ let s = S.hold 1 e in
+ let assert_s = vals s [1; 2; 3; 4] in
+ let assert_ds = assert_s_stub 0 in
+ let assert_dhs = assert_s_stub 0 in
+ let assert_ds' = assert_s_stub 0 in
+ let dyn () =
+ let ds = S.hold 42 e in (* init value unused. *)
+ let dhs = S.hold 44 he in (* init value unused. *)
+ let ds' = S.hold 128 e' in (* init value used. *)
+ assert_ds := vals ds [3; 4];
+ assert_dhs := vals dhs [3; 4];
+ assert_ds' := vals ds' [128; 2; 4]
+ in
+ let create_dyn = S.map (fun v -> if v = 3 then dyn ()) s in
+ Gc.full_major ();
+ List.iter send_e [ 1; 1; 1; 1; 2; 2; 2; 3; 3; 3];
+ List.iter send_e' [2; 4];
+ List.iter send_e [4; 4; 4];
+ List.iter empty [assert_s; !assert_ds; !assert_dhs; !assert_ds'];
+ keep_sref create_dyn
+
+let test_app () =
+ let f x y = x + y in
+ let fl x y = S.app (S.app ~eq:(==) (S.const f) x) y in
+ let x, set_x = S.create 0 in
+ let y, set_y = S.create 0 in
+ let z = fl x y in
+ let assert_z = vals z [ 0; 1; 3; 4 ] in
+ let assert_dz = assert_s_stub 0 in
+ let assert_dhz = assert_s_stub 0 in
+ let dyn () =
+ let dz = fl x y in
+ let dhz = fl (high_s x) (high_s y) in
+ assert_dz := vals dz [3; 4];
+ assert_dhz := vals dhz [3; 4];
+ in
+ let create_dyn = S.map (fun v -> if v = 2 then dyn ()) y in
+ Gc.full_major ();
+ set_x 1; set_y 2; set_x 1; set_y 3;
+ List.iter empty [assert_z; !assert_dz; !assert_dhz];
+ keep_sref create_dyn
+
+let test_map_filter_fmap () =
+ let even x = x mod 2 = 0 in
+ let odd x = x mod 2 <> 0 in
+ let meven x = if even x then Some (x * 2) else None in
+ let modd x = if odd x then Some (x * 2) else None in
+ let double x = 2 * x in
+ let x, set_x = S.create 1 in
+ let x2 = S.map double x in
+ let fe = S.filter even 56 x in
+ let fo = S.filter odd 56 x in
+ let fme = S.fmap meven 7 x in
+ let fmo = S.fmap modd 7 x in
+ let assert_x2 = vals x2 [ 2; 4; 6; 8; 10] in
+ let assert_fe = vals fe [ 56; 2; 4;] in
+ let assert_fo = vals fo [ 1; 3; 5] in
+ let assert_fme = vals fme [ 7; 4; 8;] in
+ let assert_fmo = vals fmo [ 2; 6; 10;] in
+ let assert_dx2 = assert_s_stub 0 in
+ let assert_dhx2 = assert_s_stub 0 in
+ let assert_dfe = assert_s_stub 0 in
+ let assert_dhfe = assert_s_stub 0 in
+ let assert_dfo = assert_s_stub 0 in
+ let assert_dhfo = assert_s_stub 0 in
+ let assert_dfme = assert_s_stub 0 in
+ let assert_dhfme = assert_s_stub 0 in
+ let assert_dfmo = assert_s_stub 0 in
+ let assert_dhfmo = assert_s_stub 0 in
+ let dyn () =
+ let dx2 = S.map double x in
+ let dhx2 = S.map double (high_s x) in
+ let dfe = S.filter even 56 x in
+ let dhfe = S.filter even 56 (high_s x) in
+ let dfo = S.filter odd 56 x in
+ let dhfo = S.filter odd 56 (high_s x) in
+ let dfme = S.fmap meven 7 x in
+ let dhfme = S.fmap meven 7 (high_s x) in
+ let dfmo = S.fmap modd 7 x in
+ let dhfmo = S.fmap modd 7 (high_s x) in
+ assert_dx2 := vals dx2 [6; 8; 10];
+ assert_dhx2 := vals dhx2 [6; 8; 10];
+ assert_dfe := vals dfe [56; 4];
+ assert_dhfe := vals dhfe [56; 4];
+ assert_dfo := vals dfo [3; 5];
+ assert_dhfo := vals dhfo [3; 5];
+ assert_dfme := vals dfme [7; 8;];
+ assert_dhfme := vals dhfme [7; 8;];
+ assert_dfmo := vals dfmo [6; 10];
+ assert_dhfmo := vals dhfmo [6; 10];
+ ()
+ in
+ let create_dyn = S.map (fun v -> if v = 3 then dyn ()) x in
+ Gc.full_major ();
+ List.iter set_x [ 1; 2; 3; 4; 4; 5; 5];
+ List.iter empty [assert_x2; assert_fe; assert_fo; assert_fme;
+ assert_fmo; !assert_dx2; !assert_dhx2; !assert_dfe;
+ !assert_dhfe; !assert_dfo ; !assert_dhfo; !assert_dfme ;
+ !assert_dhfme ; !assert_dfmo ; !assert_dhfmo ];
+ keep_sref create_dyn
+
+
+let test_diff_changes () =
+ let e, send_e = E.create () in
+ let s = S.hold 1 e in
+ let d = S.diff (fun x y -> x - y) s in
+ let c = S.changes s in
+ let assert_dd = assert_e_stub () in
+ let assert_dhd = assert_e_stub () in
+ let assert_dc = assert_e_stub () in
+ let assert_dhc = assert_e_stub () in
+ let dyn () =
+ let dd = S.diff (fun x y -> x - y) s in
+ let dhd = S.diff (fun x y -> x - y) (high_s s) in
+ let dc = S.changes s in
+ let dhc = S.changes (high_s s) in
+ assert_dd := occs dd [1];
+ assert_dhd := occs dhd [1];
+ assert_dc := occs dc [4];
+ assert_dhc := occs dhc [4]
+ in
+ let create_dyn = S.map (fun v -> if v = 3 then dyn ()) s in
+ let assert_d = occs d [2; 1] in
+ let assert_c = occs c [3; 4] in
+ Gc.full_major ();
+ List.iter send_e [1; 1; 3; 3; 4; 4];
+ List.iter empty [assert_d; assert_c; !assert_dd; !assert_dhd; !assert_dc;
+ !assert_dhc];
+ keep_sref create_dyn
+
+let test_sample () =
+ let pair v v' = v, v' in
+ let e, send_e = E.create () in
+ let sampler () = E.filter (fun x -> x mod 2 = 0) e in
+ let s = S.hold 0 e in
+ let sam = S.sample pair (sampler ()) s in
+ let ovals = [ (2, 2); (2, 2); (4, 4); (4, 4)] in
+ let assert_sam = occs sam ovals in
+ let assert_dsam = assert_e_stub () in
+ let assert_dhsam = assert_e_stub () in
+ let dyn () =
+ let dsam = S.sample pair (sampler ()) s in
+ let dhsam = S.sample pair (high_e (sampler ())) (high_s s) in
+ assert_dsam := occs dsam ovals;
+ assert_dhsam := occs dhsam ovals
+ in
+ let create_dyn = S.map (fun v -> if v = 2 then dyn ()) s in
+ Gc.full_major ();
+ List.iter send_e [1; 1; 2; 2; 3; 3; 4; 4];
+ List.iter empty [assert_sam; !assert_dsam; !assert_dhsam];
+ keep_sref create_dyn
+
+let test_on () =
+ let s, set_s = S.create 0 in
+ let ce = S.map (fun x -> x mod 2 = 0) s in
+ let co = S.map (fun x -> x mod 2 <> 0) s in
+ let se = S.on ce 42 s in
+ let so = S.on co 56 s in
+ let assert_se = vals se [ 0; 2; 4; 6; 4 ] in
+ let assert_so = vals so [ 56; 1; 3; 1; 3 ] in
+ let assert_dse = assert_s_stub 0 in
+ let assert_dhse = assert_s_stub 0 in
+ let assert_dso = assert_s_stub 0 in
+ let assert_dhso = assert_s_stub 0 in
+ let dyn () =
+ let dse = S.on ce 42 s in
+ let dhse = S.on ce 42 (high_s s) in
+ let dso = S.on co 56 s in
+ let dhso = S.on co 56 (high_s s) in
+ assert_dse := vals dse [6; 4];
+ assert_dhse := vals dhse [6; 4];
+ assert_dso := vals dso [56; 1; 3];
+ assert_dhso := vals dhso [56; 1; 3 ]
+ in
+ let create_dyn = S.map (fun v -> if v = 6 then dyn ()) s in
+ Gc.full_major ();
+ List.iter set_s [ 1; 3; 1; 2; 4; 4; 6; 1; 3; 4 ];
+ List.iter empty [assert_se; assert_so; !assert_dse; !assert_dhse;
+ !assert_dso; !assert_dhso];
+ keep_sref create_dyn
+
+let test_dismiss () =
+ let x, send_x = E.create () in
+ let y = E.fmap (fun x -> if x mod 2 = 0 then Some x else None) x in
+ let z = S.dismiss y 4 (S.hold 44 x) in
+ let assert_z = vals z [44; 1; 3; 5] in
+ let assert_dz = assert_s_stub 0 in
+ let dyn () =
+ let dz = S.dismiss y 4 (S.hold 44 x) in
+ assert_dz := vals dz [4; 3; 5];
+ in
+ let create_dyn = E.map (fun v -> if v = 2 then dyn()) x in
+ Gc.full_major ();
+ List.iter send_x [0; 1; 2; 3; 4; 5];
+ List.iter empty [assert_z; !assert_dz];
+ keep_eref create_dyn
+
+let test_accum () =
+ let f, send_f = E.create () in
+ let a = S.accum f 0 in
+ let assert_a = vals a [ 0; 2; -1; -2] in
+ let assert_da = assert_s_stub 0 in
+ let assert_dha = assert_s_stub 0 in
+ let dyn () =
+ let da = S.accum f 3 in
+ let dha = S.accum (high_e f) 3 in
+ assert_da := vals da [-2; -4];
+ assert_dha := vals dha [-2; -4]
+ in
+ let create_dyn =
+ let count = ref 0 in
+ E.map (fun _ -> incr count; if !count = 2 then dyn()) f
+ in
+ Gc.full_major ();
+ List.iter send_f [( + ) 2; ( - ) 1; ( * ) 2];
+ List.iter empty [assert_a; !assert_da; !assert_dha];
+ keep_eref create_dyn
+
+let test_fold () =
+ let x, send_x = E.create () in
+ let c = S.fold ( + ) 0 x in
+ let assert_c = vals c [ 0; 1; 3; 6; 10] in
+ let assert_dc = assert_s_stub 0 in
+ let assert_dhc = assert_s_stub 0 in
+ let dyn () =
+ let dc = S.fold ( + ) 2 x in
+ let dhc = S.fold ( + ) 2 (high_e x) in
+ assert_dc := vals dc [4; 7; 11];
+ assert_dhc := vals dhc [4; 7; 11]
+ in
+ let create_dyn = E.map (fun v -> if v = 2 then dyn ()) x in
+ Gc.full_major ();
+ List.iter send_x [1; 2; 3; 4];
+ List.iter empty [assert_c; !assert_dc; !assert_dhc ];
+ keep_eref create_dyn
+
+let test_merge () =
+ let cons acc v = v :: acc in
+ let w, set_w = S.create 0 in
+ let x, set_x = S.create 1 in
+ let y = S.map succ w in
+ let z = S.map List.rev (S.merge cons [] [w; x; y]) in
+ let assert_z = vals z [[0; 1; 1]; [1; 1; 2]; [1; 4; 2]; [2; 4; 3]] in
+ let assert_dz = assert_s_stub [] in
+ let assert_dhz = assert_s_stub [] in
+ let dyn () =
+ let dz = S.map List.rev (S.merge cons [] [w; x; y]) in
+ let dhz = S.map List.rev (S.merge cons [] [(high_s w); x; y; S.const 2]) in
+ assert_dz := vals dz [[1; 4; 2]; [2; 4; 3]];
+ assert_dhz := vals dhz [[1; 4; 2; 2]; [2; 4; 3; 2]]
+ in
+ let create_dyn = S.map (fun v -> if v = 4 then dyn ()) x in
+ Gc.full_major ();
+ set_w 1; set_x 4; set_w 2; set_w 2;
+ List.iter empty [assert_z; !assert_dz; !assert_dhz];
+ keep_sref create_dyn
+
+let esswitch s es = (* Pre 1.0.0 S.switch *)
+ S.switch (S.hold ~eq:( == ) s es)
+
+let test_switch () =
+ let s, set_s = S.create 0 in
+ let switch s =
+ let map v =
+ if v mod 3 = 0 && v <> 0 then Some (S.map (( * ) v) s) else None
+ in
+ S.fmap ~eq:( == ) map s s
+ in
+ let sw = S.switch (switch s) in
+ let hsw = S.switch (switch (high_s s)) in
+ let assert_sw = vals sw [0; 1; 2; 9; 12; 15; 36; 42; 48; 81] in
+ let assert_hsw = vals hsw [0; 1; 2; 9; 12; 15; 36; 42; 48; 81] in
+ let assert_dsw = assert_s_stub 0 in
+ let assert_dhsw = assert_s_stub 0 in
+ let dyn () =
+ let dsw = S.switch (switch s) in
+ let dhsw = S.switch (switch (high_s s)) in
+ assert_dsw := vals dsw [9; 12; 15; 36; 42; 48; 81];
+ assert_dhsw := vals dhsw [9; 12; 15; 36; 42; 48; 81];
+ in
+ let create_dyn = S.map (fun v -> if v = 3 then dyn ()) s in
+ Gc.full_major ();
+ List.iter set_s [1; 1; 2; 2; 3; 4; 4; 5; 5; 6; 6; 7; 7; 8; 8; 9; 9];
+ List.iter empty [assert_sw; assert_hsw; !assert_dsw; !assert_dhsw ];
+ keep_sref create_dyn
+
+let test_esswitch () =
+ let x, send_x = E.create () in
+ let s = S.hold 0 x in
+ let switch s =
+ E.fmap (fun v -> if v mod 3 = 0 then Some (S.map (( * ) v) s) else None) x
+ in
+ let sw = esswitch s (switch s) in
+ let hsw = esswitch s (switch (high_s s)) in
+ let assert_sw = vals sw [0; 1; 2; 9; 12; 15; 36; 42; 48; 81] in
+ let assert_hsw = vals hsw [0; 1; 2; 9; 12; 15; 36; 42; 48; 81] in
+ let assert_dsw = assert_s_stub 0 in
+ let assert_dhsw = assert_s_stub 0 in
+ let dyn () =
+ let dsw = esswitch s (switch s) in
+ let dhsw = esswitch s (switch (high_s s)) in
+ assert_dsw := vals dsw [9; 12; 15; 36; 42; 48; 81];
+ assert_dhsw := vals dhsw [9; 12; 15; 36; 42; 48; 81];
+ in
+ let create_dyn = E.map (fun v -> if v = 3 then dyn ()) x in
+ Gc.full_major ();
+ List.iter send_x [1; 1; 2; 2; 3; 4; 4; 5; 5; 6; 6; 7; 7; 8; 8; 9; 9];
+ List.iter empty [assert_sw; assert_hsw; !assert_dsw; !assert_dhsw ];
+ keep_eref create_dyn
+
+let test_switch_const () =
+ let s, set_s = S.create 0 in
+ let switch = S.map (fun x -> S.const x) s in
+ let sw = S.switch switch in
+ let assert_sw = vals sw [0; 1; 2; 3] in
+ let assert_dsw = assert_s_stub 0 in
+ let dyn () =
+ let dsw = S.switch switch in
+ assert_dsw := vals dsw [2; 3];
+ in
+ let create_dyn = S.map (fun v -> if v = 2 then dyn ()) s in
+ Gc.full_major ();
+ List.iter set_s [0; 1; 2; 3];
+ List.iter empty [assert_sw; !assert_dsw ];
+ keep_sref create_dyn
+
+let test_esswitch_const () =
+ let x, send_x = E.create () in
+ let switch = E.map (fun x -> S.const x) x in
+ let sw = esswitch (S.const 0) switch in
+ let assert_sw = vals sw [0; 1; 2; 3] in
+ let assert_dsw = assert_s_stub 0 in
+ let dyn () =
+ let dsw = esswitch (S.const 0) switch in
+ assert_dsw := vals dsw [2; 3];
+ in
+ let create_dyn = E.map (fun v -> if v = 2 then dyn ()) x in
+ Gc.full_major ();
+ List.iter send_x [0; 1; 2; 3];
+ List.iter empty [assert_sw; !assert_dsw ];
+ keep_eref create_dyn
+
+let test_switch1 () = (* dynamic creation depends on triggering prim. *)
+ let x, set_x = S.create 0 in
+ let dcount = ref 0 in
+ let assert_d1 = assert_s_stub 0 in
+ let assert_d2 = assert_s_stub 0 in
+ let assert_d3 = assert_s_stub 0 in
+ let dyn v =
+ let d = S.map (fun x -> v * x) x in
+ begin match !dcount with
+ | 0 -> assert_d1 := vals d [9; 12; 15; 18; 21; 24; 27]
+ | 1 -> assert_d2 := vals d [36; 42; 48; 54]
+ | 2 -> assert_d3 := vals d [81]
+ | _ -> assert false
+ end;
+ incr dcount;
+ d
+ in
+ let change x = if x mod 3 = 0 && x <> 0 then Some (dyn x) else None in
+ let s = S.switch (S.fmap change x x) in
+ let assert_s = vals s [0; 1; 2; 9; 12; 15; 36; 42; 48; 81 ] in
+ Gc.full_major ();
+ List.iter set_x [1; 1; 2; 3; 3; 4; 5; 6; 6; 7; 8; 9; 9 ];
+ List.iter empty [assert_s; !assert_d1; !assert_d2; !assert_d3]
+
+let test_esswitch1 () =
+ let ex, send_x = E.create () in
+ let x = S.hold 0 ex in
+ let dcount = ref 0 in
+ let assert_d1 = assert_s_stub 0 in
+ let assert_d2 = assert_s_stub 0 in
+ let assert_d3 = assert_s_stub 0 in
+ let dyn v =
+ let d = S.map (fun x -> v * x) x in
+ begin match !dcount with
+ | 0 -> assert_d1 := vals d [9; 12; 15; 18; 21; 24; 27]
+ | 1 -> assert_d2 := vals d [36; 42; 48; 54]
+ | 2 -> assert_d3 := vals d [81]
+ | _ -> assert false
+ end;
+ incr dcount;
+ d
+ in
+ let change x = if x mod 3 = 0 then Some (dyn x) else None in
+ let s = esswitch x (E.fmap change (S.changes x)) in
+ let assert_s = vals s [0; 1; 2; 9; 12; 15; 36; 42; 48; 81 ] in
+ Gc.full_major ();
+ List.iter send_x [1; 1; 2; 3; 3; 4; 5; 6; 6; 7; 8; 9; 9 ];
+ List.iter empty [assert_s; !assert_d1; !assert_d2; !assert_d3]
+
+let test_switch2 () = (* test_switch1 + high rank. *)
+ let x, set_x = S.create 0 in
+ let high_x = high_s x in
+ let dcount = ref 0 in
+ let assert_d1 = assert_s_stub 0 in
+ let assert_d2 = assert_s_stub 0 in
+ let assert_d3 = assert_s_stub 0 in
+ let dyn v =
+ let d = S.map (fun x -> v * x) high_x in
+ begin match !dcount with
+ | 0 -> assert_d1 := vals d [9; 12; 15; 18; 21; 24; 27]
+ | 1 -> assert_d2 := vals d [36; 42; 48; 54]
+ | 2 -> assert_d3 := vals d [81]
+ | _ -> assert false
+ end;
+ incr dcount;
+ d
+ in
+ let change x = if x mod 3 = 0 && x <> 0 then Some (dyn x) else None in
+ let s = S.switch (S.fmap change x x) in
+ let assert_s = vals s [0; 1; 2; 9; 12; 15; 36; 42; 48; 81 ] in
+ Gc.full_major ();
+ List.iter set_x [1; 1; 2; 3; 3; 4; 5; 6; 6; 7; 8; 9; 9 ];
+ List.iter empty [assert_s; !assert_d1; !assert_d2; !assert_d3]
+
+let test_esswitch2 () = (* test_esswitch1 + high rank. *)
+ let ex, send_x = E.create () in
+ let x = S.hold 0 ex in
+ let high_x = high_s x in
+ let dcount = ref 0 in
+ let assert_d1 = assert_s_stub 0 in
+ let assert_d2 = assert_s_stub 0 in
+ let assert_d3 = assert_s_stub 0 in
+ let dyn v =
+ let d = S.map (fun x -> v * x) high_x in
+ begin match !dcount with
+ | 0 -> assert_d1 := vals d [9; 12; 15; 18; 21; 24; 27]
+ | 1 -> assert_d2 := vals d [36; 42; 48; 54]
+ | 2 -> assert_d3 := vals d [81]
+ | _ -> assert false
+ end;
+ incr dcount;
+ d
+ in
+ let change x = if x mod 3 = 0 then Some (dyn x) else None in
+ let s = esswitch x (E.fmap change (S.changes x)) in
+ let assert_s = vals s [0; 1; 2; 9; 12; 15; 36; 42; 48; 81 ] in
+ Gc.full_major ();
+ List.iter send_x [1; 1; 2; 2; 3; 3; 4; 4; 5; 5; 6; 6; 7; 7; 8; 8; 9; 9];
+ List.iter empty [assert_s; !assert_d1; !assert_d2; !assert_d3]
+
+let test_switch3 () = (* dynamic creation does not depend on triggering
+ prim. *)
+ let x, set_x = S.create 0 in
+ let y, set_y = S.create 0 in
+ let dcount = ref 0 in
+ let assert_d1 = assert_s_stub 0 in
+ let assert_d2 = assert_s_stub 0 in
+ let assert_d3 = assert_s_stub 0 in
+ let dyn v =
+ let d = S.map (fun y -> v * y) y in
+ begin match !dcount with
+ | 0 -> assert_d1 := vals d [6; 3; 6; 3; 6]
+ | 1 -> assert_d2 := vals d [12; 6; 12]
+ | 2 -> assert_d3 := vals d [18]
+ | _ -> assert false
+ end;
+ incr dcount;
+ d
+ in
+ let change x = if x mod 3 = 0 && x <> 0 then Some (dyn x) else None in
+ let s = S.switch (S.fmap change y x) in
+ let assert_s = vals s [0; 1; 2; 6; 3; 6; 12; 6; 12; 18] in
+ Gc.full_major ();
+ List.iter set_y [1; 1; 2; 2]; List.iter set_x [1; 1; 2; 2; 3; 3];
+ List.iter set_y [1; 1; 2; 2]; List.iter set_x [4; 4; 5; 5; 6; 6];
+ List.iter set_y [1; 1; 2; 2]; List.iter set_x [7; 7; 8; 8; 9; 9];
+ List.iter empty [assert_s; !assert_d1; !assert_d2; !assert_d3]
+
+let test_esswitch3 () = (* dynamic creation does not depend on triggering
+ prim. *)
+ let ex, send_x = E.create () in
+ let ey, send_y = E.create () in
+ let x = S.hold 0 ex in
+ let y = S.hold 0 ey in
+ let dcount = ref 0 in
+ let assert_d1 = assert_s_stub 0 in
+ let assert_d2 = assert_s_stub 0 in
+ let assert_d3 = assert_s_stub 0 in
+ let dyn v =
+ let d = S.map (fun y -> v * y) y in
+ begin match !dcount with
+ | 0 -> assert_d1 := vals d [6; 3; 6; 3; 6]
+ | 1 -> assert_d2 := vals d [12; 6; 12]
+ | 2 -> assert_d3 := vals d [18]
+ | _ -> assert false
+ end;
+ incr dcount;
+ d
+ in
+ let change x = if x mod 3 = 0 then Some (dyn x) else None in
+ let s = esswitch y (E.fmap change (S.changes x)) in
+ let assert_s = vals s [0; 1; 2; 6; 3; 6; 12; 6; 12; 18] in
+ Gc.full_major ();
+ List.iter send_y [1; 1; 2; 2]; List.iter send_x [1; 1; 2; 2; 3; 3];
+ List.iter send_y [1; 1; 2; 2]; List.iter send_x [4; 4; 5; 5; 6; 6];
+ List.iter send_y [1; 1; 2; 2]; List.iter send_x [7; 7; 8; 8; 9; 9];
+ List.iter empty [assert_s; !assert_d1; !assert_d2; !assert_d3]
+
+let test_switch4 () = (* test_switch3 + high rank. *)
+ let x, set_x = S.create 0 in
+ let y, set_y = S.create 0 in
+ let dcount = ref 0 in
+ let assert_d1 = assert_s_stub 0 in
+ let assert_d2 = assert_s_stub 0 in
+ let assert_d3 = assert_s_stub 0 in
+ let dyn v =
+ let d = S.map (fun y -> v * y) (high_s y) in
+ begin match !dcount with
+ | 0 -> assert_d1 := vals d [6; 3; 6; 3; 6]
+ | 1 -> assert_d2 := vals d [12; 6; 12]
+ | 2 -> assert_d3 := vals d [18]
+ | _ -> assert false
+ end;
+ incr dcount;
+ d
+ in
+ let change x = if x mod 3 = 0 && x <> 0 then Some (dyn x) else None in
+ let s = S.switch (S.fmap change y x) in
+ let assert_s = vals s [0; 1; 2; 6; 3; 6; 12; 6; 12; 18] in
+ Gc.full_major ();
+ List.iter set_y [1; 1; 2; 2]; List.iter set_x [1; 1; 2; 2; 3; 3];
+ List.iter set_y [1; 1; 2; 2]; List.iter set_x [4; 4; 5; 5; 6; 6];
+ List.iter set_y [1; 1; 2; 2]; List.iter set_x [7; 7; 8; 8; 9; 9];
+ List.iter empty [assert_s; !assert_d1; !assert_d2; !assert_d3]
+
+let test_esswitch4 () = (* test_esswitch3 + high rank. *)
+ let ex, set_x = E.create () in
+ let ey, set_y = E.create () in
+ let x = S.hold 0 ex in
+ let y = S.hold 0 ey in
+ let dcount = ref 0 in
+ let assert_d1 = assert_s_stub 0 in
+ let assert_d2 = assert_s_stub 0 in
+ let assert_d3 = assert_s_stub 0 in
+ let dyn v =
+ let d = S.map (fun y -> v * y) (high_s y) in
+ begin match !dcount with
+ | 0 -> assert_d1 := vals d [6; 3; 6; 3; 6]
+ | 1 -> assert_d2 := vals d [12; 6; 12]
+ | 2 -> assert_d3 := vals d [18]
+ | _ -> assert false
+ end;
+ incr dcount;
+ d
+ in
+ let change x = if x mod 3 = 0 then Some (dyn x) else None in
+ let s = esswitch y (E.fmap change (S.changes x)) in
+ let assert_s = vals s [0; 1; 2; 6; 3; 6; 12; 6; 12; 18] in
+ Gc.full_major ();
+ List.iter set_y [1; 1; 2; 2]; List.iter set_x [1; 1; 2; 2; 3; 3];
+ List.iter set_y [1; 1; 2; 2]; List.iter set_x [4; 4; 5; 5; 6; 6];
+ List.iter set_y [1; 1; 2; 2]; List.iter set_x [7; 7; 8; 8; 9; 9];
+ List.iter empty [assert_s; !assert_d1; !assert_d2; !assert_d3]
+
+let test_bind () =
+ let e, set_e = E.create () in
+ let a = S.hold 0 e in
+ let b = S.hold 1 e in
+ let s, set_s = S.create true in
+ let next = function
+ | true -> b
+ | false -> a
+ in
+ let f = S.bind s next in
+ let assert_bind = vals f [1; 0; 3;] in
+ set_s false;
+ set_e 3;
+ set_s true;
+ List.iter empty [assert_bind]
+
+let test_dyn_bind () = (* i.e. dyn switch *)
+ let s1, set_s1 = S.create true in
+ let s2, set_s2 = S.create 1 in
+ let bind1 = function
+ | true ->
+ let bind2 = function
+ | true -> s2
+ | false -> S.const 2
+ in
+ S.bind s1 bind2
+ | false -> S.const 2
+ in
+ let s = S.bind s1 bind1 in
+ let assert_bind = vals s [1; 2; 1 ] in
+ set_s1 true;
+ set_s1 false;
+ set_s1 true;
+ List.iter empty [assert_bind]
+
+let test_dyn_bind2 () = (* i.e. dyn switch *)
+ let s1, set_s1 = S.create true in
+ let s2, set_s2 = S.create true in
+ let bind1 = function
+ | true ->
+ let bind2 = function
+ | true -> (S.map (fun _ -> 3) s1)
+ | false -> S.const 2
+ in
+ S.bind s2 bind2
+ | false -> S.const 2
+ in
+ let s = S.bind s1 bind1 in
+ let assert_bind = vals s [3; 2; 3 ] in
+ set_s1 true;
+ set_s1 false;
+ set_s1 true;
+ List.iter empty [assert_bind]
+
+let test_fix () =
+ let s, set_s = S.create 0 in
+ let history s =
+ let push v = function
+ | v' :: _ as l -> if v = v' then l else v :: l
+ | [] -> [ v ]
+ in
+ let define h =
+ let h' = S.l2 push s h in
+ h', (h', S.map (fun x -> x) h)
+ in
+ S.fix [] define
+ in
+ let h, hm = history s in
+ let assert_h = vals h [[0]; [1; 0;]; [2; 1; 0;]; [3; 2; 1; 0;]] in
+ let assert_hm = vals hm [[0]; [1; 0;]; [2; 1; 0]; [3; 2; 1; 0;]] in
+ let assert_dh = assert_s_stub [] in
+ let assert_dhm = assert_s_stub [] in
+ let assert_dhh = assert_s_stub [] in
+ let assert_dhhm = assert_s_stub [] in
+ let dyn () =
+ let dh, dhm = history s in
+ let dhh, dhhm = history (high_s s) in
+ assert_dh := vals dh [[1]; [2; 1]; [3; 2; 1]];
+ assert_dhm := vals dhm [[]; [1]; [2; 1]; [3; 2; 1]];
+ assert_dhh := vals dhh [[1]; [2; 1]; [3; 2; 1]];
+ assert_dhhm := vals dhhm [[]; [1]; [2; 1]; [3; 2; 1]];
+ in
+ let create_dyn = S.map (fun v -> if v = 1 then dyn ()) s in
+ Gc.full_major ();
+ List.iter set_s [0; 1; 1; 2; 3];
+ List.iter empty [assert_h; assert_hm; !assert_dh; !assert_dhm;
+ !assert_dhh; !assert_dhhm];
+ keep_sref create_dyn
+
+let test_fix' () =
+ let s, set_s = S.create 0 in
+ let f, set_f = S.create 3 in
+ let hs = high_s s in
+ let assert_cs = assert_s_stub 0 in
+ let assert_chs = assert_s_stub 0 in
+ let assert_cdhs = assert_s_stub 0 in
+ let assert_ss = assert_s_stub 0 in
+ let assert_shs = assert_s_stub 0 in
+ let assert_sdhs = assert_s_stub 0 in
+ let assert_fs = assert_s_stub 0 in
+ let assert_fhs = assert_s_stub 0 in
+ let assert_fdhs = assert_s_stub 0 in
+ let dyn () =
+ let cs = S.fix 0 (fun h -> S.const 2, S.Int.( + ) h s) in
+ let chs = S.fix 0 (fun h -> S.const 2, S.Int.( + ) h hs) in
+ let cdhs = S.fix 0 (fun h -> S.const 2, S.Int.( + ) h (high_s s)) in
+ let ss = S.fix 0 (fun h -> s, S.Int.( + ) h s) in
+ let shs = S.fix 0 (fun h -> s, S.Int.( + ) h hs) in
+ let sdhs = S.fix 0 (fun h -> s, S.Int.( + ) h (high_s s)) in
+ let fs = S.fix 0 (fun h -> f, S.Int.( + ) h s) in
+ let fhs = S.fix 0 (fun h -> f, S.Int.( + ) h hs) in
+ let fdhs = S.fix 0 (fun h -> f, S.Int.( + ) h (high_s s)) in
+ let cs_vals = [1; 3; 4; 5; ] in
+ assert_cs := vals cs cs_vals;
+ assert_chs := vals chs cs_vals;
+ assert_cdhs := vals cdhs cs_vals;
+ let ss_vals = [1; 2; 3; 4; 5; 6] in
+ assert_ss := vals ss ss_vals;
+ assert_shs := vals shs ss_vals;
+ assert_sdhs := vals sdhs ss_vals;
+ let fs_vals = [1; 4; 5; 6; 4 ] in
+ assert_fs := vals fs fs_vals;
+ assert_fhs := vals fhs fs_vals;
+ assert_fdhs := vals fdhs fs_vals;
+ in
+ let create_dyn = S.map (fun v -> if v = 1 then dyn ()) s in
+ Gc.full_major ();
+ List.iter set_s [0; 1; 1; 2; 3];
+ List.iter set_f [1];
+ List.iter empty [!assert_cs; !assert_chs; !assert_cdhs;
+ !assert_ss; !assert_shs; !assert_sdhs;
+ !assert_fs; !assert_fhs; !assert_fdhs];
+ keep_sref create_dyn
+
+let test_lifters () =
+ let f1 a = 1 + a in
+ let f2 a0 a1 = a0 + a1 in
+ let f3 a0 a1 a2 = a0 + a1 + a2 in
+ let f4 a0 a1 a2 a3 = a0 + a1 + a2 + a3 in
+ let f5 a0 a1 a2 a3 a4 = a0 + a1 + a2 + a3 + a4 in
+ let f6 a0 a1 a2 a3 a4 a5 = a0 + a1 + a2 + a3 + a4 + a5 in
+ let x, set_x = S.create 0 in
+ let x1 = S.l1 f1 x in
+ let x2 = S.l2 f2 x x1 in
+ let x3 = S.l3 f3 x x1 x2 in
+ let x4 = S.l4 f4 x x1 x2 x3 in
+ let x5 = S.l5 f5 x x1 x2 x3 x4 in
+ let x6 = S.l6 f6 x x1 x2 x3 x4 x5 in
+ let a_x1 = vals x1 [1; 2] in
+ let a_x2 = vals x2 [1; 3] in
+ let a_x3 = vals x3 [2; 6] in
+ let a_x4 = vals x4 [4; 12] in
+ let a_x5 = vals x5 [8; 24] in
+ let a_x6 = vals x6 [16; 48] in
+ let a_dx1 = assert_s_stub 0 in
+ let a_dx2 = assert_s_stub 0 in
+ let a_dx3 = assert_s_stub 0 in
+ let a_dx4 = assert_s_stub 0 in
+ let a_dx5 = assert_s_stub 0 in
+ let a_dx6 = assert_s_stub 0 in
+ let dyn () =
+ let dx1 = S.l1 f1 x in
+ let dx2 = S.l2 f2 x x1 in
+ let dx3 = S.l3 f3 x x1 x2 in
+ let dx4 = S.l4 f4 x x1 x2 x3 in
+ let dx5 = S.l5 f5 x x1 x2 x3 x4 in
+ let dx6 = S.l6 f6 x x1 x2 x3 x4 x5 in
+ a_dx1 := vals dx1 [2];
+ a_dx2 := vals dx2 [3];
+ a_dx3 := vals dx3 [6];
+ a_dx4 := vals dx4 [12];
+ a_dx5 := vals dx5 [24];
+ a_dx6 := vals dx6 [48]
+ in
+ let create_dyn = S.map (fun v -> if v = 1 then dyn ()) x in
+ Gc.full_major ();
+ List.iter set_x [0; 1];
+ List.iter empty [ a_x1; a_x2; a_x3; a_x4; a_x5; a_x6; !a_dx1; !a_dx2; !a_dx3;
+ !a_dx4; !a_dx5; !a_dx6 ];
+ keep_sref create_dyn
+
+let test_option () =
+ let b0, set_b0 = S.create None in
+ let b1, set_b1 = S.create (Some 1) in
+ let b2 = S.const None in
+ let b3 = S.const (Some 3) in
+ let d, set_d = S.create 512 in
+ let dsome = S.Option.some d in
+ let s00 = S.Option.value ~default:(`Init (S.const 255)) b0 in
+ let s01 = S.Option.value ~default:(`Init (S.const 255)) b1 in
+ let s02 = S.Option.value ~default:(`Init (S.const 255)) b2 in
+ let s03 = S.Option.value ~default:(`Init (S.const 255)) b3 in
+ let s10 = S.Option.value ~default:(`Always (S.const 255)) b0 in
+ let s11 = S.Option.value ~default:(`Always (S.const 255)) b1 in
+ let s12 = S.Option.value ~default:(`Always (S.const 255)) b2 in
+ let s13 = S.Option.value ~default:(`Always (S.const 255)) b3 in
+ let s20 = S.Option.value ~default:(`Init d) b0 in
+ let s21 = S.Option.value ~default:(`Init d) b1 in
+ let s22 = S.Option.value ~default:(`Init d) b2 in
+ let s23 = S.Option.value ~default:(`Init d) b3 in
+ let s30 = S.Option.value ~default:(`Always d) b0 in
+ let s31 = S.Option.value ~default:(`Always d) b1 in
+ let s32 = S.Option.value ~default:(`Always d) b2 in
+ let s33 = S.Option.value ~default:(`Always d) b3 in
+ let a_dsome = vals dsome [ Some 512; Some 1024; Some 2048;] in
+ let a_s00 = vals s00 [255;3] in
+ let a_s01 = vals s01 [1;] in
+ let a_s02 = vals s02 [255;] in
+ let a_s03 = vals s03 [3;] in
+ let a_s10 = vals s10 [255;3;255] in
+ let a_s11 = vals s11 [1;255;] in
+ let a_s12 = vals s12 [255] in
+ let a_s13 = vals s13 [3] in
+ let a_s20 = vals s20 [512;3] in
+ let a_s21 = vals s21 [1;] in
+ let a_s22 = vals s22 [512] in
+ let a_s23 = vals s23 [3] in
+ let a_s30 = vals s30 [512;3;1024;2048] in
+ let a_s31 = vals s31 [1;512;1024;2048] in
+ let a_s32 = vals s32 [512] in
+ let a_s33 = vals s33 [3] in
+ set_b0 (Some 3); set_b1 None; set_d 1024; set_b0 None; set_d 2048;
+ empty a_dsome;
+ List.iter empty [ a_s00; a_s01; a_s02; a_s03;
+ a_s10; a_s11; a_s12; a_s13;
+ a_s20; a_s21; a_s22; a_s23;
+ a_s30; a_s31; a_s32; a_s33; ];
+ ()
+
+let test_bool () =
+ let s, set_s = S.create false in
+ let a_zedge = occs (S.Bool.(edge zero)) [] in
+ let a_zrise = occs (S.Bool.(rise zero)) [] in
+ let a_zfall = occs (S.Bool.(fall zero)) [] in
+ let a_sedge = occs (S.Bool.edge s) [true; false] in
+ let a_srise = occs (S.Bool.rise s) [()] in
+ let a_rfall = occs (S.Bool.fall s) [()] in
+ let a_flip_never = vals (S.Bool.flip false E.never) [false] in
+ let a_flip = vals (S.Bool.flip true (S.changes s)) [true; false; true] in
+ let dyn_flip = S.bind s (fun _ -> S.Bool.flip true (S.changes s)) in
+ let a_dyn_flip = vals dyn_flip [true; false] in
+ set_s false; set_s true; set_s true; set_s false;
+ List.iter empty [a_zedge; a_sedge; ];
+ List.iter empty [a_zrise; a_zfall; a_srise; a_rfall ];
+ List.iter empty [a_flip_never; a_flip; a_dyn_flip ];
+ ()
+
+let test_signals () =
+ test_no_leak ();
+ test_hold ();
+ test_app ();
+ test_map_filter_fmap ();
+ test_diff_changes ();
+ test_sample ();
+ test_on ();
+ test_dismiss ();
+ test_accum ();
+ test_fold ();
+ test_merge ();
+ test_switch ();
+ test_esswitch ();
+ test_switch_const ();
+ test_esswitch_const ();
+ test_switch_const ();
+ test_switch1 ();
+ test_esswitch1 ();
+ test_switch2 ();
+ test_esswitch2 ();
+ test_switch3 ();
+ test_esswitch3 ();
+ test_switch4 ();
+ test_esswitch4 ();
+ test_bind ();
+ test_dyn_bind ();
+ test_dyn_bind2 ();
+ test_fix ();
+ test_fix' ();
+ test_lifters ();
+ test_option ();
+ test_bool ();
+ ()
+
+(* Test steps *)
+
+let test_executed_raise () =
+ let e, send = E.create () in
+ let s, set = S.create 4 in
+ let step = Step.create () in
+ Step.execute step;
+ (try send ~step 3; assert false with Invalid_argument _ -> ());
+ (try set ~step 3; assert false with Invalid_argument _ -> ());
+ (try Step.execute step; assert false with Invalid_argument _ -> ());
+ ()
+
+let test_already_scheduled_raise () =
+ let e, send = E.create () in
+ let s, set = S.create 4 in
+ let step = Step.create () in
+ let step2 = Step.create () in
+ send ~step 3;
+ (try send ~step 3; assert false with Invalid_argument _ -> ());
+ (try send ~step:step2 4; assert false with Invalid_argument _ -> ());
+ set ~step 5;
+ set ~step 5; (* doesn't raise because sig value is eq. *)
+ (try set ~step 6; assert false with Invalid_argument _ -> ());
+ (try set ~step:step2 7; assert false with Invalid_argument _ -> ());
+ ()
+
+let test_simultaneous () =
+ let e1, send1 = E.create () in
+ let e2, send2 = E.create () in
+ let s1, set1 = S.create 99 in
+ let s2, set2 = S.create 98 in
+ let never = E.dismiss e1 e2 in
+ let assert_never = occs never [] in
+ let merge = E.merge (fun acc o -> o :: acc) [] [e1; e2] in
+ let assert_merge = occs merge [[2; 1]] in
+ let s1_value = S.sample (fun _ sv -> sv) e1 s1 in
+ let assert_s1_value = occs s1_value [ 3 ] in
+ let dismiss = S.dismiss e1 1 s1 in
+ let assert_dismiss = vals dismiss [ 99 ] in
+ let on = S.on (S.map (( = ) 3) s1) 0 s2 in
+ let assert_on_ = vals on [0; 4] in
+ let step = Step.create () in
+ send1 ~step 1;
+ send2 ~step 2;
+ set1 ~step 3;
+ set2 ~step 4;
+ Step.execute step;
+ empty assert_never;
+ empty assert_merge;
+ empty assert_s1_value;
+ empty assert_dismiss;
+ empty assert_on_;
+ ()
+
+let test_multistep () =
+ let e, send = E.create () in
+ let s, set = S.create 0 in
+ let assert_e = occs e [1; 2] in
+ let assert_s = vals s [0; 1; 2] in
+ let step = Step.create () in
+ send ~step 1;
+ set ~step 1;
+ Step.execute step;
+ let step = Step.create () in
+ send ~step 2;
+ set ~step 2;
+ Step.execute step;
+ empty assert_e;
+ empty assert_s;
+ ()
+
+let test_steps () =
+ test_executed_raise ();
+ test_already_scheduled_raise ();
+ test_simultaneous ();
+ test_multistep ();
+ ()
+
+(* bug fixes *)
+
+let test_jake_heap_bug () =
+ Gc.full_major ();
+ let id x = x in
+ let a, set_a = S.create 0 in (* rank 0 *)
+ let _ = S.map (fun x -> if x = 2 then Gc.full_major ()) a in
+ let _ =
+ let a1 = S.map id a in
+ (S.l2 (fun x y -> (x + y)) a1 a), (* rank 2 *)
+ (S.l2 (fun x y -> (x + y)) a1 a), (* rank 2 *)
+ (S.l2 (fun x y -> (x + y)) a1 a) (* rank 2 *)
+ in
+ let _ =
+ (S.l2 (fun x y -> (x + y)) a a), (* rank 1 *)
+ (S.l2 (fun x y -> (x + y)) a a) (* rank 1 *)
+ in
+ let d = S.map id (S.map id (S.map (fun x -> x + 1) a)) in (* rank 3 *)
+ let h = S.l2 (fun x y -> x + y) a d in (* rank 4 *)
+ let a_h = vals h [ 1; 5 ] in
+ set_a 2;
+ empty a_h
+
+let test_sswitch_init_rank_bug () =
+ let enabled, set_enabled = S.create true in
+(* let enabled = S.const true *)
+ let pos, set_pos = S.create () in
+ let down, send_down = E.create () in
+ let up, send_up = E.create () in
+ let hover enabled = match enabled with
+ | true -> S.map (fun a -> true) pos
+ | false -> S.Bool.zero
+ in
+ let used hover enabled = match enabled with
+ | true ->
+ let start = E.stamp (E.on hover down) true in
+ let stop = E.stamp up false in
+ let accum = E.select [ start; stop ] in
+ let s = S.hold false accum in
+ s
+ | false -> S.Bool.zero
+ in
+ let hover = S.bind enabled hover in
+ let used = S.switch (S.map ~eq:( == ) (used hover) enabled) in
+ let activates = S.changes used in
+ let activates' = (E.map (fun _ -> (fun _ -> ())) activates) in
+ let actuate = (E.app activates' up) in
+ let actuate_assert = occs actuate [()] in
+ send_down (); send_up (); empty actuate_assert
+
+let test_changes_end_of_step_add_bug () =
+ let s, set_s = S.create false in
+ let s1, set_s1 = S.create false in
+ let high_s1 = high_s s1 in
+ let e = S.changes s1 in
+ let assert_o = assert_e_stub () in
+ let bind = function
+ | true ->
+ let changing_rank = S.bind s @@ function
+ | true -> high_s1
+ | false -> s1
+ in
+ let o = E.l2 (fun _ _ -> ()) (S.changes changing_rank) e in
+ assert_o := occs o [ () ];
+ S.const o
+ | false -> S.const E.never
+ in
+ let r = S.bind s bind in
+ set_s true;
+ set_s1 true;
+ List.iter empty [!assert_o;];
+ keep_sref r
+
+let test_diff_end_of_step_add_bug () =
+ let s, set_s = S.create false in
+ let s1, set_s1 = S.create false in
+ let high_s1 = high_s s1 in
+ let e = S.changes s1 in
+ let assert_o = assert_e_stub () in
+ let bind = function
+ | true ->
+ let changing_rank = S.bind s @@ function
+ | true -> high_s1
+ | false -> s1
+ in
+ let o = E.l2 (fun _ _ -> ()) (S.diff (fun _ _ -> ()) changing_rank) e in
+ assert_o := occs o [ () ];
+ S.const o
+ | false -> S.const E.never
+ in
+ let r = S.bind s bind in
+ set_s true;
+ set_s1 true;
+ List.iter empty [!assert_o;];
+ keep_sref r
+
+let test_bool_rise_end_of_step_add_bug () =
+ let s, set_s = S.create false in
+ let s1, set_s1 = S.create false in
+ let high_s1 = high_s s1 in
+ let e = S.changes s1 in
+ let assert_o = assert_e_stub () in
+ let bind = function
+ | true ->
+ let changing_rank = S.bind s @@ function
+ | true -> high_s1
+ | false -> s1
+ in
+ let o = E.l2 (fun _ _ -> ()) (S.Bool.rise changing_rank) e in
+ assert_o := occs o [ () ];
+ S.const o
+ | false -> S.const E.never
+ in
+ let r = S.bind s bind in
+ set_s true;
+ set_s1 true;
+ List.iter empty [!assert_o;];
+ keep_sref r
+
+let test_misc () =
+ test_jake_heap_bug ();
+ test_sswitch_init_rank_bug ();
+ test_changes_end_of_step_add_bug ();
+ test_diff_end_of_step_add_bug ();
+ test_bool_rise_end_of_step_add_bug ();
+ ()
+
+let main () =
+ test_events ();
+ test_signals ();
+ test_steps ();
+ test_misc ();
+ print_endline "All tests succeeded."
+
+let () = main ()
+
+(*----------------------------------------------------------------------------
+ Copyright (c) 2009 Daniel C. Bünzli
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the
+ distribution.
+
+ 3. Neither the name of Daniel C. Bünzli nor the names of
+ contributors may be used to endorse or promote products derived
+ from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ ---------------------------------------------------------------------------*)
diff --git a/test/tests.itarget b/test/tests.itarget
new file mode 100644
index 0000000..443ae9c
--- /dev/null
+++ b/test/tests.itarget
@@ -0,0 +1,3 @@
+test.native
+clock.native
+breakout.native \ No newline at end of file