summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephane Glondu <steph@glondu.net>2015-10-28 15:11:46 +0100
committerStephane Glondu <steph@glondu.net>2015-10-28 15:11:46 +0100
commitb7dc0e7b8a57e54cd1fe83f97c326632e5183cff (patch)
tree659de6c7bad2911b0533a5600ae53be07fd65314
parent96085d3868a7416d93475f218ce763ab24fa40f4 (diff)
Imported Upstream version 1.1.0
-rw-r--r--CHANGES.md12
-rw-r--r--README.md2
-rw-r--r--TODO.md14
-rw-r--r--doc/React.E.Option.html40
-rw-r--r--doc/React.E.html37
-rw-r--r--doc/React.S.Bool.html2
-rw-r--r--doc/React.S.Compare.html4
-rw-r--r--doc/React.S.Float.html3
-rw-r--r--doc/React.S.Int.html3
-rw-r--r--doc/React.S.Option.html54
-rw-r--r--doc/React.S.Pair.html4
-rw-r--r--doc/React.S.html15
-rw-r--r--doc/React.html2
-rw-r--r--doc/index_modules.html8
-rw-r--r--doc/index_values.html73
-rw-r--r--doc/type_React.E.Option.html16
-rw-r--r--doc/type_React.E.html28
-rw-r--r--doc/type_React.S.Bool.html2
-rw-r--r--doc/type_React.S.Float.html3
-rw-r--r--doc/type_React.S.Int.html3
-rw-r--r--doc/type_React.S.Option.html19
-rw-r--r--doc/type_React.S.html20
-rw-r--r--doc/type_React.html50
-rw-r--r--pkg/META2
-rw-r--r--pkg/topkg-ext.ml2
-rw-r--r--pkg/topkg.ml2
-rw-r--r--src/react.ml258
-rw-r--r--src/react.mli103
-rw-r--r--test/breakout.ml4
-rw-r--r--test/test.ml177
30 files changed, 891 insertions, 71 deletions
diff --git a/CHANGES.md b/CHANGES.md
index cda8703..12ea5be 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,15 @@
+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)
---------------------------------
diff --git a/README.md b/README.md
index aeda6f5..2167e02 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
React — Declarative events and signals for OCaml
-------------------------------------------------------------------------------
-Release 1.0.1
+Release 1.1.0
React is an OCaml module for functional reactive programming (FRP). It
provides support to program with time varying values : declarative
diff --git a/TODO.md b/TODO.md
index b5a613a..f55f105 100644
--- a/TODO.md
+++ b/TODO.md
@@ -1,14 +1,12 @@
-# New event combinators
+# New event combinators
-```ocaml
-E.Option.some : 'a option event -> 'a event
-(** [some e] is [E.fmap (fun v -> v) e] *)
-
-S.Option.some : 'a -> 'a option signal -> 'a signal
-```
+* E.merge but only on simultanous occs ?
+# Signal init.
+Instead of having bare values why not always have signals ?
+This would undermine the temptation of using S.value.
# New signal combinators.
@@ -26,3 +24,5 @@ bind and/or provide an alternative S.bind for bootstraping.
+
+
diff --git a/doc/React.E.Option.html b/doc/React.E.Option.html
new file mode 100644
index 0000000..b3a53d7
--- /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
index 41e1d07..d5761da 100644
--- a/doc/React.E.html
+++ b/doc/React.E.html
@@ -14,6 +14,8 @@
<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>
@@ -187,16 +189,20 @@ A never occuring event. For all t, [<code class="code">never</code>]<sub class="
<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 ">
-<code class="code">when_ 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>.
+<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">when_ c e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code>
+<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">when_ c e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">None</span></code> otherwise.</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>
@@ -300,4 +306,27 @@ A never occuring event. For all t, [<code class="code">never</code>]<sub class="
<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
index 50fc351..425f102 100644
--- a/doc/React.S.Bool.html
+++ b/doc/React.S.Bool.html
@@ -20,6 +20,8 @@
<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></body></html> \ No newline at end of file
diff --git a/doc/React.S.Compare.html b/doc/React.S.Compare.html
index 23c2403..70713f8 100644
--- a/doc/React.S.Compare.html
+++ b/doc/React.S.Compare.html
@@ -4,7 +4,7 @@
<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="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">
@@ -14,7 +14,7 @@
<link title="React" rel="Chapter" href="React.html"><title>React.S.Compare</title>
</head>
<body>
-<div class="navbar"><a class="pre" href="React.S.Pair.html" title="React.S.Pair">Previous</a>
+<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>
diff --git a/doc/React.S.Float.html b/doc/React.S.Float.html
index 0b7e1c3..af261f2 100644
--- a/doc/React.S.Float.html
+++ b/doc/React.S.Float.html
@@ -22,6 +22,9 @@
<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>
diff --git a/doc/React.S.Int.html b/doc/React.S.Int.html
index e54ea53..a99e71a 100644
--- a/doc/React.S.Int.html
+++ b/doc/React.S.Int.html
@@ -22,6 +22,9 @@
<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>
diff --git a/doc/React.S.Option.html b/doc/React.S.Option.html
new file mode 100644
index 0000000..a0f30ad
--- /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
index c0bc476..9dc96e0 100644
--- a/doc/React.S.Pair.html
+++ b/doc/React.S.Pair.html
@@ -5,7 +5,7 @@
<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.Compare.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">
@@ -16,7 +16,7 @@
<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.Compare.html" title="React.S.Compare">Next</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>
diff --git a/doc/React.S.html b/doc/React.S.html
index cc829e7..2163423 100644
--- a/doc/React.S.html
+++ b/doc/React.S.html
@@ -188,19 +188,23 @@ The type for signals of type <code class="code"><span class="keywordsign">'</spa
<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 ">
-<code class="code">when_ 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>.
+<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">when_ 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">when_ 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>
+<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">when_ c i s</code>]<sub class="subscript">t</sub> <code class="code">=</code> <code class="code">i</code> otherwise.</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.
@@ -311,6 +315,7 @@ The following modules lift some of <code class="code"><span class="constructor">
<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>
diff --git a/doc/React.html b/doc/React.html
index 48784d0..e413d24 100644
--- a/doc/React.html
+++ b/doc/React.html
@@ -47,7 +47,7 @@ Declarative events and signals.
types and modules in your scope.
<p>
- <em>Release 1.0.1 - Daniel Bünzli &lt;daniel.buenzl i@erratique.ch&gt; </em><br>
+ <em>Release 1.1.0 - Daniel Bünzli &lt;daniel.buenzl i@erratique.ch&gt; </em><br>
</div>
<hr width="100%">
<br>
diff --git a/doc/index_modules.html b/doc/index_modules.html
index f30e415..5549f38 100644
--- a/doc/index_modules.html
+++ b/doc/index_modules.html
@@ -38,6 +38,14 @@ Event combinators.
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>
diff --git a/doc/index_values.html b/doc/index_values.html
index f5e3791..6dba048 100644
--- a/doc/index_values.html
+++ b/doc/index_values.html
@@ -298,26 +298,38 @@
<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>
@@ -361,6 +373,10 @@
<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>
@@ -375,14 +391,35 @@
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>
@@ -418,6 +455,17 @@ A never occuring event.
<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>
@@ -478,24 +526,41 @@ A never occuring event.
</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">
-<code class="code">when_ 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>
+<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">
-<code class="code">when_ 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>
+<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/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
index 13fac33..aac8245 100644
--- a/doc/type_React.E.html
+++ b/doc/type_React.E.html
@@ -28,6 +28,7 @@
&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>
@@ -37,4 +38,31 @@
&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
index 00e5b50..8226733 100644
--- a/doc/type_React.S.Bool.html
+++ b/doc/type_React.S.Bool.html
@@ -10,6 +10,8 @@
</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>
diff --git a/doc/type_React.S.Float.html b/doc/type_React.S.Float.html
index 84e4c9d..7f7305d 100644
--- a/doc/type_React.S.Float.html
+++ b/doc/type_React.S.Float.html
@@ -10,6 +10,9 @@
</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>
diff --git a/doc/type_React.S.Int.html b/doc/type_React.S.Int.html
index 40eb737..d92f148 100644
--- a/doc/type_React.S.Int.html
+++ b/doc/type_React.S.Int.html
@@ -10,6 +10,9 @@
</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>
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.html b/doc/type_React.S.html
index 2b0b53f..39549b5 100644
--- a/doc/type_React.S.html
+++ b/doc/type_React.S.html
@@ -41,6 +41,9 @@
&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>
@@ -93,6 +96,8 @@
&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>
@@ -101,6 +106,9 @@
&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>
@@ -121,6 +129,9 @@
&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>
@@ -179,6 +190,15 @@
&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>
diff --git a/doc/type_React.html b/doc/type_React.html
index fab3666..0f3812d 100644
--- a/doc/type_React.html
+++ b/doc/type_React.html
@@ -34,6 +34,7 @@
&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>
@@ -45,6 +46,35 @@
&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>
@@ -82,6 +112,9 @@
&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>
@@ -141,6 +174,8 @@
&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>
@@ -149,6 +184,9 @@
&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>
@@ -179,6 +217,9 @@
&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>
@@ -239,6 +280,15 @@
&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>
diff --git a/pkg/META b/pkg/META
index 9410ba5..f09429a 100644
--- a/pkg/META
+++ b/pkg/META
@@ -1,4 +1,4 @@
-version = "1.0.1"
+version = "1.1.0"
description = "Declarative events and signals for OCaml"
archive(byte) = "react.cma"
archive(byte, plugin) = "react.cma"
diff --git a/pkg/topkg-ext.ml b/pkg/topkg-ext.ml
index 4aa5e0b..4f5906a 100644
--- a/pkg/topkg-ext.ml
+++ b/pkg/topkg-ext.ml
@@ -1,7 +1,7 @@
(*---------------------------------------------------------------------------
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.0.1
+ react release 1.1.0
---------------------------------------------------------------------------*)
let ( >>= ) v f = match v with `Ok v -> f v | `Error _ as e -> e
diff --git a/pkg/topkg.ml b/pkg/topkg.ml
index e539992..0901c8e 100644
--- a/pkg/topkg.ml
+++ b/pkg/topkg.ml
@@ -1,7 +1,7 @@
(*---------------------------------------------------------------------------
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.0.1
+ react release 1.1.0
---------------------------------------------------------------------------*)
(* Public api *)
diff --git a/src/react.ml b/src/react.ml
index f69a682..d477b7f 100644
--- a/src/react.ml
+++ b/src/react.ml
@@ -1,7 +1,7 @@
(*---------------------------------------------------------------------------
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.0.1
+ react release 1.1.0
---------------------------------------------------------------------------*)
let err_max_rank = "maximal rank exceeded"
@@ -225,7 +225,7 @@ type 'a signal = Const of 'a | Smut of 'a smut
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.when_) in the same step and the rank of n ensures
+ (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
@@ -607,7 +607,7 @@ module E = struct
add_dep m m'.enode;
event m' p u
- let when_ c = function
+ let on c = function
| Never -> Never
| Emut m as e ->
match c with
@@ -623,7 +623,9 @@ module E = struct
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 ->
@@ -771,6 +773,153 @@ module E = struct
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
@@ -980,7 +1129,7 @@ module S = struct
Node.add_dep ms.snode m'.enode;
event m' p u
- let when_ ?(eq = ( = )) c i s = match c with
+ let on ?(eq = ( = )) c i s = match c with
| Const true -> s
| Const false -> Const i
| Smut mc ->
@@ -998,7 +1147,9 @@ module S = struct
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 ->
@@ -1062,9 +1213,11 @@ module S = struct
let switch ?(eq = ( = )) = function
| Const s -> s
| Smut mss ->
- let r = rsucc mss.snode in
- let m' = smut r eq in
let src = ref (sval mss) in (* current signal source. *)
+ let r = match !src with
+ | Smut ms -> rsucc2 ms.snode mss.snode | Const _ -> rsucc mss.snode
+ in
+ let m' = smut r eq in
let rec p () = match !src with
| Smut m -> [ mss.snode; m.snode] | Const _ -> [ mss.snode ]
and u c =
@@ -1234,6 +1387,8 @@ module S = struct
| 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'
@@ -1241,6 +1396,9 @@ module S = struct
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
@@ -1262,6 +1420,9 @@ module S = struct
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'
@@ -1308,7 +1469,86 @@ module S = struct
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'
diff --git a/src/react.mli b/src/react.mli
index ff6045a..e54061d 100644
--- a/src/react.mli
+++ b/src/react.mli
@@ -1,7 +1,7 @@
(*---------------------------------------------------------------------------
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.0.1
+ react release 1.1.0
---------------------------------------------------------------------------*)
(** Declarative events and signals.
@@ -16,7 +16,7 @@
{{!ex}examples}. Open the module to use it, this defines only two
types and modules in your scope.
- {e Release 1.0.1 - Daniel Bünzli <daniel.buenzl i\@erratique.ch> } *)
+ {e Release 1.1.0 - Daniel Bünzli <daniel.buenzl i\@erratique.ch> } *)
(** {1 Interface} *)
@@ -150,13 +150,15 @@ module E : sig
[eq v v' = false].}
{- \[[changes eq e]\]{_t} [= None] otherwise.}} *)
- val when_ : bool signal -> 'a event -> 'a event
- (** [when_ c e] is the occurrences of [e] when [c] is [true].
+ val on : bool signal -> 'a event -> 'a event
+ (** [on c e] is the occurrences of [e] when [c] is [true].
{ul
- {- \[[when_ c e]\]{_t} [= Some v]
+ {- \[[on c e]\]{_t} [= Some v]
if \[[c]\]{_t} [= true] and \[[e]\]{_t} [= Some v].}
- {- \[[when_ c e]\]{_t} [= None] otherwise.}} *)
+ {- \[[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.
@@ -236,6 +238,43 @@ module E : sig
{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.
@@ -317,7 +356,6 @@ module S : sig
{- \[[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 ->
@@ -371,16 +409,20 @@ module S : sig
and \[[s]\]{_t} [= sv].}
{- \[[sample e s]\]{_t} [= None] otherwise.}} *)
- val when_ : ?eq:('a -> 'a -> bool) -> bool signal -> 'a -> 'a signal ->
+ val on : ?eq:('a -> 'a -> bool) -> bool signal -> 'a -> 'a signal ->
'a signal
- (** [when_ c i s] is the signal [s] whenever [c] is [true].
+ (** [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
- {- \[[when_ c i s]\]{_t} [=] \[[s]\]{_t} if \[[c]\]{_t} [= true]}
- {- \[[when_ c i s]\]{_t} [=] \[[s]\]{_t'} if \[[c]\]{_t} [= false]
+ {- \[[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].}
- {- \[[when_ c i s]\]{_t} [=] [i] otherwise.}} *)
+ {- \[[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
@@ -482,12 +524,17 @@ module S : sig
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
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
@@ -508,6 +555,9 @@ module S : sig
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
@@ -555,6 +605,35 @@ module S : sig
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
diff --git a/test/breakout.ml b/test/breakout.ml
index f7d622f..69222cb 100644
--- a/test/breakout.ml
+++ b/test/breakout.ml
@@ -403,9 +403,9 @@ end = struct
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.when_ run (E.fmap move Input.key)
+ E.on run (E.fmap move Input.key)
in
- let dt = E.when_ run (E.diff ( -. ) Input.time) 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
diff --git a/test/test.ml b/test/test.ml
index 8643213..0cffb9d 100644
--- a/test/test.ml
+++ b/test/test.ml
@@ -181,18 +181,18 @@ let test_dismiss () =
List.iter empty [assert_z; !assert_dz];
keep_eref create_dyn
-let test_when () =
+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.when_ c e 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.when_ c e in
- let dhw = E.when_ (high_s c) (high_e e) in
+ 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
@@ -340,13 +340,70 @@ let test_fix () =
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_when ();
+ test_on ();
test_dismiss ();
test_until ();
test_accum ();
@@ -354,7 +411,10 @@ let test_events () =
test_select ();
test_merge ();
test_switch ();
- test_fix ()
+ test_fix ();
+ test_lifts ();
+ test_option ();
+ ()
(* Signal tests *)
@@ -529,12 +589,12 @@ let test_sample () =
List.iter empty [assert_sam; !assert_dsam; !assert_dhsam];
keep_sref create_dyn
-let test_when () =
+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.when_ ce 42 s in
- let so = S.when_ co 56 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
@@ -542,10 +602,10 @@ let test_when () =
let assert_dso = assert_s_stub 0 in
let assert_dhso = assert_s_stub 0 in
let dyn () =
- let dse = S.when_ ce 42 s in
- let dhse = S.when_ ce 42 (high_s s) in
- let dso = S.when_ co 56 s in
- let dhso = S.when_ co 56 (high_s s) in
+ 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];
@@ -1076,6 +1136,55 @@ let test_lifters () =
!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_signals () =
test_no_leak ();
test_hold ();
@@ -1083,7 +1192,7 @@ let test_signals () =
test_map_filter_fmap ();
test_diff_changes ();
test_sample ();
- test_when ();
+ test_on ();
test_dismiss ();
test_accum ();
test_fold ();
@@ -1105,6 +1214,7 @@ let test_signals () =
test_fix ();
test_fix' ();
test_lifters ();
+ test_option ();
()
(* Test steps *)
@@ -1146,8 +1256,8 @@ let test_simultaneous () =
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 when_ = S.when_ (S.map (( = ) 3) s1) 0 s2 in
- let assert_when_ = vals when_ [0; 4] 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;
@@ -1158,7 +1268,7 @@ let test_simultaneous () =
empty assert_merge;
empty assert_s1_value;
empty assert_dismiss;
- empty assert_when_;
+ empty assert_on_;
()
let test_multistep () =
@@ -1208,8 +1318,37 @@ let test_jake_heap_bug () =
set_a 2;
empty a_h
-let test_misc () = test_jake_heap_bug ()
-
+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_misc () =
+ test_jake_heap_bug ();
+ test_sswitch_init_rank_bug ()
+
let main () =
test_events ();
test_signals ();