summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephane Glondu <steph@glondu.net>2013-04-10 10:30:15 +0200
committerStephane Glondu <steph@glondu.net>2013-04-10 10:30:15 +0200
commit714ae237d944fe3b532e53888b2f3ef7ceb6c407 (patch)
treef8018e8a6657b5885fac9cfb4350a30c955e24bd
parentf0fba96e5bee0dffa807799d1f1187184737bab5 (diff)
Imported Upstream version 0.9.4
-rw-r--r--CHANGES6
-rw-r--r--README4
-rw-r--r--_oasis2
-rw-r--r--_tags4
-rw-r--r--doc/React.E.html11
-rw-r--r--doc/React.S.Bool.html7
-rw-r--r--doc/React.S.Compare.html9
-rw-r--r--doc/React.S.EqType.html7
-rw-r--r--doc/React.S.Float.html9
-rw-r--r--doc/React.S.Int.html9
-rw-r--r--doc/React.S.Make.html11
-rw-r--r--doc/React.S.Pair.html9
-rw-r--r--doc/React.S.S.html9
-rw-r--r--doc/React.S.Special.Sb.html9
-rw-r--r--doc/React.S.Special.Sf.html9
-rw-r--r--doc/React.S.Special.Si.html11
-rw-r--r--doc/React.S.Special.html7
-rw-r--r--doc/React.S.html17
-rw-r--r--doc/React.html51
-rw-r--r--doc/index.html14
-rw-r--r--doc/index_attributes.html6
-rw-r--r--doc/index_class_types.html6
-rw-r--r--doc/index_classes.html6
-rw-r--r--doc/index_exceptions.html6
-rw-r--r--doc/index_methods.html6
-rw-r--r--doc/index_module_types.html6
-rw-r--r--doc/index_modules.html6
-rw-r--r--doc/index_types.html6
-rw-r--r--doc/index_values.html6
-rw-r--r--doc/type_React.E.html4
-rw-r--r--doc/type_React.S.Make.html2
-rw-r--r--doc/type_React.S.S.html6
-rw-r--r--doc/type_React.S.Special.Sb.html2
-rw-r--r--doc/type_React.S.Special.Sf.html2
-rw-r--r--doc/type_React.S.Special.Si.html2
-rw-r--r--doc/type_React.S.Special.html6
-rw-r--r--doc/type_React.S.html66
-rw-r--r--doc/type_React.html76
-rw-r--r--myocamlbuild.ml197
-rw-r--r--setup.ml3362
-rw-r--r--src/META6
-rw-r--r--src/react.ml2
-rw-r--r--src/react.mli4
43 files changed, 2281 insertions, 1725 deletions
diff --git a/CHANGES b/CHANGES
index d9a75f7..e24adf5 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,9 @@
+v0.9.4 2012-08-05 Lausanne
+--------------------------
+
+- OASIS 0.3.0 support.
+
+
v0.9.3 2012-03-17 La Forclaz (VS)
---------------------------------
diff --git a/README b/README
index ef9ebda..c852471 100644
--- a/README
+++ b/README
@@ -1,6 +1,6 @@
-------------------------------------------------------------------------------
React - Declarative events and signals for OCaml
- Release 0.9.3
+ Release 0.9.4
-------------------------------------------------------------------------------
React is an OCaml module for functional reactive programming (FRP). It
@@ -34,7 +34,7 @@ use the sources the way you want. For example if you use `ocamlbuild`
you can issue the following commands from the root directory of your
project :
- ln -s /path/to/react-0.9.3/src react
+ ln -s /path/to/react-0.9.4/src react
echo "<react> : include" >> _tags
diff --git a/_oasis b/_oasis
index ed5c2e1..54ad2fa 100644
--- a/_oasis
+++ b/_oasis
@@ -1,6 +1,6 @@
OASISFormat: 0.3
Name: react
-Version: 0.9.3
+Version: 0.9.4
Synopsis: Declarative events and signals for OCaml
Authors: Daniel Bünzli <daniel.buenzli at erratique.ch>
Copyrights: (c) 2009-2012 Daniel C. Bünzli
diff --git a/_tags b/_tags
index 499493a..74d82f0 100644
--- a/_tags
+++ b/_tags
@@ -1,5 +1,5 @@
# OASIS_START
-# DO NOT EDIT (digest: 6ba567c91fd285f0e12200b94c89b214)
+# DO NOT EDIT (digest: 3c0d04860d57a46187f9c6a24d463425)
# Ignore VCS directories, you can use the same kind of rule outside
# OASIS_START/STOP if you want to exclude directories that contains
# useless stuff for the build process
@@ -14,7 +14,7 @@
"_darcs": -traverse
"_darcs": not_hygienic
# Library react
-"src": include
+"src/react.cmxs": use_react
# Executable clock
<test/clock.{native,byte}>: use_react
<test/clock.{native,byte}>: pkg_unix
diff --git a/doc/React.E.html b/doc/React.E.html
index f4be887..970206c 100644
--- a/doc/React.E.html
+++ b/doc/React.E.html
@@ -17,11 +17,10 @@
<title>React.E</title>
</head>
<body>
-<div class="navbar">&nbsp;<a href="React.html">Up</a>
-&nbsp;<a href="React.S.html">Next</a>
+<div class="navbar">&nbsp;<a class="up" href="React.html" title="React">Up</a>
+&nbsp;<a class="post" href="React.S.html" title="React.S">Next</a>
</div>
-<center><h1>Module <a href="type_React.E.html">React.E</a></h1></center>
-<br>
+<h1>Module <a href="type_React.E.html">React.E</a></h1>
<pre><span class="keyword">module</span> E: <code class="code"><span class="keyword">sig</span></code> <a href="React.E.html">..</a> <code class="code"><span class="keyword">end</span></code></pre>Event combinators.
<p>
@@ -111,7 +110,7 @@ A never occuring event. For all t, [<code class="code">never</code>]<sub class="
</ul>
<br>
</div>
-<pre><span id="VALstamp"><span class="keyword">val</span> stamp</span> : <code class="type">'a <a href="React.html#TYPEevent">React.event</a> -> 'b -> 'b <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info">
+<pre><span id="VALstamp"><span class="keyword">val</span> stamp</span> : <code class="type">'b <a href="React.html#TYPEevent">React.event</a> -> 'a -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info">
<code class="code">stamp e v</code> is <code class="code">map (<span class="keyword">fun</span> _ <span class="keywordsign">-&gt;</span> v) e</code>.<br>
</div>
<pre><span id="VALfilter"><span class="keyword">val</span> filter</span> : <code class="type">('a -> bool) -> 'a <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info">
@@ -163,7 +162,7 @@ A never occuring event. For all t, [<code class="code">never</code>]<sub class="
</ul>
<br>
</div>
-<pre><span id="VALdismiss"><span class="keyword">val</span> dismiss</span> : <code class="type">'a <a href="React.html#TYPEevent">React.event</a> -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'b <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info">
+<pre><span id="VALdismiss"><span class="keyword">val</span> dismiss</span> : <code class="type">'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info">
<code class="code">dismiss c e</code> is the occurences of <code class="code">e</code> except the ones when <code class="code">c</code> occurs.
<ul>
<li>[<code class="code">dimiss c e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> v</code>
diff --git a/doc/React.S.Bool.html b/doc/React.S.Bool.html
index d05005f..2d15c95 100644
--- a/doc/React.S.Bool.html
+++ b/doc/React.S.Bool.html
@@ -13,10 +13,9 @@
<link title="React" rel="Chapter" href="React.html"><title>React.S.Bool</title>
</head>
<body>
-<div class="navbar">&nbsp;<a href="React.S.html">Up</a>
-&nbsp;<a href="React.S.Int.html">Next</a>
+<div class="navbar">&nbsp;<a class="up" href="React.S.html" title="React.S">Up</a>
+&nbsp;<a class="post" href="React.S.Int.html" title="React.S.Int">Next</a>
</div>
-<center><h1>Module <a href="type_React.S.Bool.html">React.S.Bool</a></h1></center>
-<br>
+<h1>Module <a href="type_React.S.Bool.html">React.S.Bool</a></h1>
<pre><span class="keyword">module</span> Bool: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Bool.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><hr width="100%">
<pre><span id="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 98d74fe..ef49348 100644
--- a/doc/React.S.Compare.html
+++ b/doc/React.S.Compare.html
@@ -14,11 +14,10 @@
<link title="React" rel="Chapter" href="React.html"><title>React.S.Compare</title>
</head>
<body>
-<div class="navbar"><a href="React.S.Pair.html">Previous</a>
-&nbsp;<a href="React.S.html">Up</a>
-&nbsp;<a href="React.S.Make.html">Next</a>
+<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.Make.html" title="React.S.Make">Next</a>
</div>
-<center><h1>Module <a href="type_React.S.Compare.html">React.S.Compare</a></h1></center>
-<br>
+<h1>Module <a href="type_React.S.Compare.html">React.S.Compare</a></h1>
<pre><span class="keyword">module</span> Compare: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Compare.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><hr width="100%">
<pre><span id="VAL(=)"><span class="keyword">val</span> (=)</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL(<>)"><span class="keyword">val</span> (&lt;&gt;)</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL(<)"><span class="keyword">val</span> (&lt;)</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL(>)"><span class="keyword">val</span> (&gt;)</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL(<=)"><span class="keyword">val</span> (&lt;=)</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL(>=)"><span class="keyword">val</span> (&gt;=)</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALcompare"><span class="keyword">val</span> compare</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL(==)"><span class="keyword">val</span> (==)</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL(!=)"><span class="keyword">val</span> (!=)</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> bool <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
diff --git a/doc/React.S.EqType.html b/doc/React.S.EqType.html
index 43dd3a2..711c850 100644
--- a/doc/React.S.EqType.html
+++ b/doc/React.S.EqType.html
@@ -13,11 +13,10 @@
<link title="React" rel="Chapter" href="React.html"><title>React.S.EqType</title>
</head>
<body>
-<div class="navbar">&nbsp;<a href="React.S.html">Up</a>
-&nbsp;<a href="React.S.S.html">Next</a>
+<div class="navbar">&nbsp;<a class="up" href="React.S.html" title="React.S">Up</a>
+&nbsp;<a class="post" href="React.S.S.html" title="React.S.S">Next</a>
</div>
-<center><h1>Module type <a href="type_React.S.EqType.html">React.S.EqType</a></h1></center>
-<br>
+<h1>Module type <a href="type_React.S.EqType.html">React.S.EqType</a></h1>
<pre><span class="keyword">module type</span> EqType = <code class="code"><span class="keyword">sig</span></code> <a href="React.S.EqType.html">..</a> <code class="code"><span class="keyword">end</span></code></pre>Input signature of <a href="React.S.Make.html"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">Make</span></code></a><br>
<hr width="100%">
<pre><span id="TYPEt"><span class="keyword">type</span> <code class="type">'a</code> t</span> </pre>
diff --git a/doc/React.S.Float.html b/doc/React.S.Float.html
index da32c48..5719849 100644
--- a/doc/React.S.Float.html
+++ b/doc/React.S.Float.html
@@ -14,11 +14,10 @@
<link title="React" rel="Chapter" href="React.html"><title>React.S.Float</title>
</head>
<body>
-<div class="navbar"><a href="React.S.Int.html">Previous</a>
-&nbsp;<a href="React.S.html">Up</a>
-&nbsp;<a href="React.S.Pair.html">Next</a>
+<div class="navbar"><a class="pre" href="React.S.Int.html" title="React.S.Int">Previous</a>
+&nbsp;<a class="up" href="React.S.html" title="React.S">Up</a>
+&nbsp;<a class="post" href="React.S.Pair.html" title="React.S.Pair">Next</a>
</div>
-<center><h1>Module <a href="type_React.S.Float.html">React.S.Float</a></h1></center>
-<br>
+<h1>Module <a href="type_React.S.Float.html">React.S.Float</a></h1>
<pre><span class="keyword">module</span> Float: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Float.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><hr width="100%">
<pre><span id="VAL(~-.)"><span class="keyword">val</span> (~-.)</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL(+.)"><span class="keyword">val</span> (+.)</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL(-.)"><span class="keyword">val</span> (-.)</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL( *. )"><span class="keyword">val</span> ( *. )</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL(/.)"><span class="keyword">val</span> (/.)</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL( ** )"><span class="keyword">val</span> ( ** )</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALsqrt"><span class="keyword">val</span> sqrt</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALexp"><span class="keyword">val</span> exp</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALlog"><span class="keyword">val</span> log</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALlog10"><span class="keyword">val</span> log10</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALcos"><span class="keyword">val</span> cos</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALsin"><span class="keyword">val</span> sin</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALtan"><span class="keyword">val</span> tan</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALacos"><span class="keyword">val</span> acos</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALasin"><span class="keyword">val</span> asin</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALatan"><span class="keyword">val</span> atan</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALatan2"><span class="keyword">val</span> atan2</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALcosh"><span class="keyword">val</span> cosh</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALsinh"><span class="keyword">val</span> sinh</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALtanh"><span class="keyword">val</span> tanh</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALceil"><span class="keyword">val</span> ceil</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfloor"><span class="keyword">val</span> floor</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALabs_float"><span class="keyword">val</span> abs_float</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmod_float"><span class="keyword">val</span> mod_float</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfrexp"><span class="keyword">val</span> frexp</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> (float * int) <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALldexp"><span class="keyword">val</span> ldexp</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmodf"><span class="keyword">val</span> modf</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> (float * float) <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfloat"><span class="keyword">val</span> float</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfloat_of_int"><span class="keyword">val</span> float_of_int</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALtruncate"><span class="keyword">val</span> truncate</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALint_of_float"><span class="keyword">val</span> int_of_float</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALinfinity"><span class="keyword">val</span> infinity</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALneg_infinity"><span class="keyword">val</span> neg_infinity</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALnan"><span class="keyword">val</span> nan</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmax_float"><span class="keyword">val</span> max_float</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmin_float"><span class="keyword">val</span> min_float</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALepsilon_float"><span class="keyword">val</span> epsilon_float</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALclassify_float"><span class="keyword">val</span> classify_float</span> : <code class="type">float <a href="React.html#TYPEsignal">React.signal</a> -> Pervasives.fpclass <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
diff --git a/doc/React.S.Int.html b/doc/React.S.Int.html
index b291c15..be6c82a 100644
--- a/doc/React.S.Int.html
+++ b/doc/React.S.Int.html
@@ -14,11 +14,10 @@
<link title="React" rel="Chapter" href="React.html"><title>React.S.Int</title>
</head>
<body>
-<div class="navbar"><a href="React.S.Bool.html">Previous</a>
-&nbsp;<a href="React.S.html">Up</a>
-&nbsp;<a href="React.S.Float.html">Next</a>
+<div class="navbar"><a class="pre" href="React.S.Bool.html" title="React.S.Bool">Previous</a>
+&nbsp;<a class="up" href="React.S.html" title="React.S">Up</a>
+&nbsp;<a class="post" href="React.S.Float.html" title="React.S.Float">Next</a>
</div>
-<center><h1>Module <a href="type_React.S.Int.html">React.S.Int</a></h1></center>
-<br>
+<h1>Module <a href="type_React.S.Int.html">React.S.Int</a></h1>
<pre><span class="keyword">module</span> Int: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Int.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><hr width="100%">
<pre><span id="VAL(~-)"><span class="keyword">val</span> (~-)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALsucc"><span class="keyword">val</span> succ</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALpred"><span class="keyword">val</span> pred</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL(+)"><span class="keyword">val</span> (+)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL(-)"><span class="keyword">val</span> (-)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL( * )"><span class="keyword">val</span> ( * )</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL(mod)"><span class="keyword">val</span> (mod)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALabs"><span class="keyword">val</span> abs</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmax_int"><span class="keyword">val</span> max_int</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmin_int"><span class="keyword">val</span> min_int</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL(land)"><span class="keyword">val</span> (land)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL(lor)"><span class="keyword">val</span> (lor)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL(lxor)"><span class="keyword">val</span> (lxor)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALlnot"><span class="keyword">val</span> lnot</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL(lsl)"><span class="keyword">val</span> (lsl)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL(lsr)"><span class="keyword">val</span> (lsr)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VAL(asr)"><span class="keyword">val</span> (asr)</span> : <code class="type">int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a> -> int <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
diff --git a/doc/React.S.Make.html b/doc/React.S.Make.html
index 3b72937..64f776b 100644
--- a/doc/React.S.Make.html
+++ b/doc/React.S.Make.html
@@ -14,12 +14,11 @@
<link title="React" rel="Chapter" href="React.html"><title>React.S.Make</title>
</head>
<body>
-<div class="navbar"><a href="React.S.Compare.html">Previous</a>
-&nbsp;<a href="React.S.html">Up</a>
-&nbsp;<a href="React.S.Special.html">Next</a>
+<div class="navbar"><a class="pre" href="React.S.Compare.html" title="React.S.Compare">Previous</a>
+&nbsp;<a class="up" href="React.S.html" title="React.S">Up</a>
+&nbsp;<a class="post" href="React.S.Special.html" title="React.S.Special">Next</a>
</div>
-<center><h1>Functor <a href="type_React.S.Make.html">React.S.Make</a></h1></center>
-<br>
+<h1>Functor <a href="type_React.S.Make.html">React.S.Make</a></h1>
<pre><span class="keyword">module</span> Make: <div class="sig_block"><code class="code"><span class="keyword">functor</span> (</code><code class="code"><span class="constructor">Eq</span></code><code class="code"> : </code><code class="type"><a href="React.S.EqType.html">EqType</a></code><code class="code">) <span class="keywordsign">-&gt;</span> </code><code class="type"><a href="React.S.S.html">S</a></code><code class="type"> with type 'a v = 'a Eq.t</code></div></pre>Functor specializing the combinators for the given signal value type<br>
<table border="0" cellpadding="3" width="100%">
<tr>
@@ -38,4 +37,4 @@
<hr width="100%">
<pre><span id="TYPEv"><span class="keyword">type</span> <code class="type">'a</code> v</span> </pre>
-<pre><span id="VALcreate"><span class="keyword">val</span> create</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * ('a <a href="React.S.S.html#TYPEv">v</a> -> unit)</code></pre><pre><span id="VALequal"><span class="keyword">val</span> equal</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> bool</code></pre><pre><span id="VALhold"><span class="keyword">val</span> hold</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALapp"><span class="keyword">val</span> app</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmap"><span class="keyword">val</span> map</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfilter"><span class="keyword">val</span> filter</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> bool) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfmap"><span class="keyword">val</span> fmap</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a> option) -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALwhen_"><span class="keyword">val</span> when_</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALdismiss"><span class="keyword">val</span> dismiss</span> : <code class="type">'a <a href="React.html#TYPEevent">React.event</a> -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALaccum"><span class="keyword">val</span> accum</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfold"><span class="keyword">val</span> fold</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmerge"><span class="keyword">val</span> merge</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> list -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALswitch"><span class="keyword">val</span> switch</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfix"><span class="keyword">val</span> fix</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> ('a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * 'b) -> 'b</code></pre><pre><span id="VALl1"><span class="keyword">val</span> l1</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl2"><span class="keyword">val</span> l2</span> : <code class="type">('a -> 'b -> 'c <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl3"><span class="keyword">val</span> l3</span> : <code class="type">('a -> 'b -> 'c -> 'd <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl4"><span class="keyword">val</span> l4</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl5"><span class="keyword">val</span> l5</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl6"><span class="keyword">val</span> l6</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -><br> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a> -> 'g <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
+<pre><span id="VALcreate"><span class="keyword">val</span> create</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * ('a <a href="React.S.S.html#TYPEv">v</a> -> unit)</code></pre><pre><span id="VALequal"><span class="keyword">val</span> equal</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> bool</code></pre><pre><span id="VALhold"><span class="keyword">val</span> hold</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALapp"><span class="keyword">val</span> app</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmap"><span class="keyword">val</span> map</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfilter"><span class="keyword">val</span> filter</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> bool) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfmap"><span class="keyword">val</span> fmap</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a> option) -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALwhen_"><span class="keyword">val</span> when_</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALdismiss"><span class="keyword">val</span> dismiss</span> : <code class="type">'b <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALaccum"><span class="keyword">val</span> accum</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfold"><span class="keyword">val</span> fold</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmerge"><span class="keyword">val</span> merge</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> list -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALswitch"><span class="keyword">val</span> switch</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfix"><span class="keyword">val</span> fix</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> ('a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * 'b) -> 'b</code></pre><pre><span id="VALl1"><span class="keyword">val</span> l1</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl2"><span class="keyword">val</span> l2</span> : <code class="type">('a -> 'b -> 'c <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl3"><span class="keyword">val</span> l3</span> : <code class="type">('a -> 'b -> 'c -> 'd <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl4"><span class="keyword">val</span> l4</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl5"><span class="keyword">val</span> l5</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl6"><span class="keyword">val</span> l6</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -><br> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a> -> 'g <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
diff --git a/doc/React.S.Pair.html b/doc/React.S.Pair.html
index 4caeb74..4b6087f 100644
--- a/doc/React.S.Pair.html
+++ b/doc/React.S.Pair.html
@@ -14,11 +14,10 @@
<link title="React" rel="Chapter" href="React.html"><title>React.S.Pair</title>
</head>
<body>
-<div class="navbar"><a href="React.S.Float.html">Previous</a>
-&nbsp;<a href="React.S.html">Up</a>
-&nbsp;<a href="React.S.Compare.html">Next</a>
+<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>
</div>
-<center><h1>Module <a href="type_React.S.Pair.html">React.S.Pair</a></h1></center>
-<br>
+<h1>Module <a href="type_React.S.Pair.html">React.S.Pair</a></h1>
<pre><span class="keyword">module</span> Pair: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Pair.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><hr width="100%">
<pre><span id="VALpair"><span class="keyword">val</span> pair</span> : <code class="type">?eq:('a * 'b -> 'a * 'b -> bool) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> ('a * 'b) <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfst"><span class="keyword">val</span> fst</span> : <code class="type">?eq:('a -> 'a -> bool) -> ('a * 'b) <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALsnd"><span class="keyword">val</span> snd</span> : <code class="type">?eq:('a -> 'a -> bool) -> ('b * 'a) <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
diff --git a/doc/React.S.S.html b/doc/React.S.S.html
index f0e5d06..0cd5c24 100644
--- a/doc/React.S.S.html
+++ b/doc/React.S.S.html
@@ -13,13 +13,12 @@
<link title="React" rel="Chapter" href="React.html"><title>React.S.S</title>
</head>
<body>
-<div class="navbar"><a href="React.S.EqType.html">Previous</a>
-&nbsp;<a href="React.S.html">Up</a>
+<div class="navbar"><a class="pre" href="React.S.EqType.html" title="React.S.EqType">Previous</a>
+&nbsp;<a class="up" href="React.S.html" title="React.S">Up</a>
&nbsp;</div>
-<center><h1>Module type <a href="type_React.S.S.html">React.S.S</a></h1></center>
-<br>
+<h1>Module type <a href="type_React.S.S.html">React.S.S</a></h1>
<pre><span class="keyword">module type</span> S = <code class="code"><span class="keyword">sig</span></code> <a href="React.S.S.html">..</a> <code class="code"><span class="keyword">end</span></code></pre>Output signature of <a href="React.S.Make.html"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">Make</span></code></a><br>
<hr width="100%">
<pre><span id="TYPEv"><span class="keyword">type</span> <code class="type">'a</code> v</span> </pre>
-<pre><span id="VALcreate"><span class="keyword">val</span> create</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * ('a <a href="React.S.S.html#TYPEv">v</a> -> unit)</code></pre><pre><span id="VALequal"><span class="keyword">val</span> equal</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> bool</code></pre><pre><span id="VALhold"><span class="keyword">val</span> hold</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALapp"><span class="keyword">val</span> app</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmap"><span class="keyword">val</span> map</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfilter"><span class="keyword">val</span> filter</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> bool) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfmap"><span class="keyword">val</span> fmap</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a> option) -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALwhen_"><span class="keyword">val</span> when_</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALdismiss"><span class="keyword">val</span> dismiss</span> : <code class="type">'a <a href="React.html#TYPEevent">React.event</a> -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALaccum"><span class="keyword">val</span> accum</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfold"><span class="keyword">val</span> fold</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmerge"><span class="keyword">val</span> merge</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> list -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALswitch"><span class="keyword">val</span> switch</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfix"><span class="keyword">val</span> fix</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> ('a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * 'b) -> 'b</code></pre><pre><span id="VALl1"><span class="keyword">val</span> l1</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl2"><span class="keyword">val</span> l2</span> : <code class="type">('a -> 'b -> 'c <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl3"><span class="keyword">val</span> l3</span> : <code class="type">('a -> 'b -> 'c -> 'd <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl4"><span class="keyword">val</span> l4</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl5"><span class="keyword">val</span> l5</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl6"><span class="keyword">val</span> l6</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -><br> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a> -> 'g <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
+<pre><span id="VALcreate"><span class="keyword">val</span> create</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * ('a <a href="React.S.S.html#TYPEv">v</a> -> unit)</code></pre><pre><span id="VALequal"><span class="keyword">val</span> equal</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> bool</code></pre><pre><span id="VALhold"><span class="keyword">val</span> hold</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALapp"><span class="keyword">val</span> app</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmap"><span class="keyword">val</span> map</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfilter"><span class="keyword">val</span> filter</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> bool) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfmap"><span class="keyword">val</span> fmap</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a> option) -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALwhen_"><span class="keyword">val</span> when_</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALdismiss"><span class="keyword">val</span> dismiss</span> : <code class="type">'b <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALaccum"><span class="keyword">val</span> accum</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfold"><span class="keyword">val</span> fold</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmerge"><span class="keyword">val</span> merge</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> list -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALswitch"><span class="keyword">val</span> switch</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfix"><span class="keyword">val</span> fix</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> ('a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * 'b) -> 'b</code></pre><pre><span id="VALl1"><span class="keyword">val</span> l1</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl2"><span class="keyword">val</span> l2</span> : <code class="type">('a -> 'b -> 'c <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl3"><span class="keyword">val</span> l3</span> : <code class="type">('a -> 'b -> 'c -> 'd <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl4"><span class="keyword">val</span> l4</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl5"><span class="keyword">val</span> l5</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl6"><span class="keyword">val</span> l6</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -><br> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a> -> 'g <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
diff --git a/doc/React.S.Special.Sb.html b/doc/React.S.Special.Sb.html
index db2808f..396ace6 100644
--- a/doc/React.S.Special.Sb.html
+++ b/doc/React.S.Special.Sb.html
@@ -13,13 +13,12 @@
<link title="React" rel="Chapter" href="React.html"><title>React.S.Special.Sb</title>
</head>
<body>
-<div class="navbar">&nbsp;<a href="React.S.Special.html">Up</a>
-&nbsp;<a href="React.S.Special.Si.html">Next</a>
+<div class="navbar">&nbsp;<a class="up" href="React.S.Special.html" title="React.S.Special">Up</a>
+&nbsp;<a class="post" href="React.S.Special.Si.html" title="React.S.Special.Si">Next</a>
</div>
-<center><h1>Module <a href="type_React.S.Special.Sb.html">React.S.Special.Sb</a></h1></center>
-<br>
+<h1>Module <a href="type_React.S.Special.Sb.html">React.S.Special.Sb</a></h1>
<pre><span class="keyword">module</span> Sb: <code class="type"><a href="React.S.S.html">React.S.S</a></code><code class="type"> with type 'a v = bool</code></pre>Specialization for booleans.<br>
<hr width="100%">
<pre><span id="TYPEv"><span class="keyword">type</span> <code class="type">'a</code> v</span> </pre>
-<pre><span id="VALcreate"><span class="keyword">val</span> create</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * ('a <a href="React.S.S.html#TYPEv">v</a> -> unit)</code></pre><pre><span id="VALequal"><span class="keyword">val</span> equal</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> bool</code></pre><pre><span id="VALhold"><span class="keyword">val</span> hold</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALapp"><span class="keyword">val</span> app</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmap"><span class="keyword">val</span> map</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfilter"><span class="keyword">val</span> filter</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> bool) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfmap"><span class="keyword">val</span> fmap</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a> option) -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALwhen_"><span class="keyword">val</span> when_</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALdismiss"><span class="keyword">val</span> dismiss</span> : <code class="type">'a <a href="React.html#TYPEevent">React.event</a> -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALaccum"><span class="keyword">val</span> accum</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfold"><span class="keyword">val</span> fold</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmerge"><span class="keyword">val</span> merge</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> list -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALswitch"><span class="keyword">val</span> switch</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfix"><span class="keyword">val</span> fix</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> ('a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * 'b) -> 'b</code></pre><pre><span id="VALl1"><span class="keyword">val</span> l1</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl2"><span class="keyword">val</span> l2</span> : <code class="type">('a -> 'b -> 'c <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl3"><span class="keyword">val</span> l3</span> : <code class="type">('a -> 'b -> 'c -> 'd <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl4"><span class="keyword">val</span> l4</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl5"><span class="keyword">val</span> l5</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl6"><span class="keyword">val</span> l6</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -><br> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a> -> 'g <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
+<pre><span id="VALcreate"><span class="keyword">val</span> create</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * ('a <a href="React.S.S.html#TYPEv">v</a> -> unit)</code></pre><pre><span id="VALequal"><span class="keyword">val</span> equal</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> bool</code></pre><pre><span id="VALhold"><span class="keyword">val</span> hold</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALapp"><span class="keyword">val</span> app</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmap"><span class="keyword">val</span> map</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfilter"><span class="keyword">val</span> filter</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> bool) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfmap"><span class="keyword">val</span> fmap</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a> option) -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALwhen_"><span class="keyword">val</span> when_</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALdismiss"><span class="keyword">val</span> dismiss</span> : <code class="type">'b <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALaccum"><span class="keyword">val</span> accum</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfold"><span class="keyword">val</span> fold</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmerge"><span class="keyword">val</span> merge</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> list -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALswitch"><span class="keyword">val</span> switch</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfix"><span class="keyword">val</span> fix</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> ('a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * 'b) -> 'b</code></pre><pre><span id="VALl1"><span class="keyword">val</span> l1</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl2"><span class="keyword">val</span> l2</span> : <code class="type">('a -> 'b -> 'c <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl3"><span class="keyword">val</span> l3</span> : <code class="type">('a -> 'b -> 'c -> 'd <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl4"><span class="keyword">val</span> l4</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl5"><span class="keyword">val</span> l5</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl6"><span class="keyword">val</span> l6</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -><br> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a> -> 'g <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
diff --git a/doc/React.S.Special.Sf.html b/doc/React.S.Special.Sf.html
index 28c421c..c5408c5 100644
--- a/doc/React.S.Special.Sf.html
+++ b/doc/React.S.Special.Sf.html
@@ -13,13 +13,12 @@
<link title="React" rel="Chapter" href="React.html"><title>React.S.Special.Sf</title>
</head>
<body>
-<div class="navbar"><a href="React.S.Special.Si.html">Previous</a>
-&nbsp;<a href="React.S.Special.html">Up</a>
+<div class="navbar"><a class="pre" href="React.S.Special.Si.html" title="React.S.Special.Si">Previous</a>
+&nbsp;<a class="up" href="React.S.Special.html" title="React.S.Special">Up</a>
&nbsp;</div>
-<center><h1>Module <a href="type_React.S.Special.Sf.html">React.S.Special.Sf</a></h1></center>
-<br>
+<h1>Module <a href="type_React.S.Special.Sf.html">React.S.Special.Sf</a></h1>
<pre><span class="keyword">module</span> Sf: <code class="type"><a href="React.S.S.html">React.S.S</a></code><code class="type"> with type 'a v = float</code></pre>Specialization for floats.<br>
<hr width="100%">
<pre><span id="TYPEv"><span class="keyword">type</span> <code class="type">'a</code> v</span> </pre>
-<pre><span id="VALcreate"><span class="keyword">val</span> create</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * ('a <a href="React.S.S.html#TYPEv">v</a> -> unit)</code></pre><pre><span id="VALequal"><span class="keyword">val</span> equal</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> bool</code></pre><pre><span id="VALhold"><span class="keyword">val</span> hold</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALapp"><span class="keyword">val</span> app</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmap"><span class="keyword">val</span> map</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfilter"><span class="keyword">val</span> filter</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> bool) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfmap"><span class="keyword">val</span> fmap</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a> option) -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALwhen_"><span class="keyword">val</span> when_</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALdismiss"><span class="keyword">val</span> dismiss</span> : <code class="type">'a <a href="React.html#TYPEevent">React.event</a> -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALaccum"><span class="keyword">val</span> accum</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfold"><span class="keyword">val</span> fold</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmerge"><span class="keyword">val</span> merge</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> list -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALswitch"><span class="keyword">val</span> switch</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfix"><span class="keyword">val</span> fix</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> ('a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * 'b) -> 'b</code></pre><pre><span id="VALl1"><span class="keyword">val</span> l1</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl2"><span class="keyword">val</span> l2</span> : <code class="type">('a -> 'b -> 'c <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl3"><span class="keyword">val</span> l3</span> : <code class="type">('a -> 'b -> 'c -> 'd <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl4"><span class="keyword">val</span> l4</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl5"><span class="keyword">val</span> l5</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl6"><span class="keyword">val</span> l6</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -><br> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a> -> 'g <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
+<pre><span id="VALcreate"><span class="keyword">val</span> create</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * ('a <a href="React.S.S.html#TYPEv">v</a> -> unit)</code></pre><pre><span id="VALequal"><span class="keyword">val</span> equal</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> bool</code></pre><pre><span id="VALhold"><span class="keyword">val</span> hold</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALapp"><span class="keyword">val</span> app</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmap"><span class="keyword">val</span> map</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfilter"><span class="keyword">val</span> filter</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> bool) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfmap"><span class="keyword">val</span> fmap</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a> option) -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALwhen_"><span class="keyword">val</span> when_</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALdismiss"><span class="keyword">val</span> dismiss</span> : <code class="type">'b <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALaccum"><span class="keyword">val</span> accum</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfold"><span class="keyword">val</span> fold</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmerge"><span class="keyword">val</span> merge</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> list -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALswitch"><span class="keyword">val</span> switch</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfix"><span class="keyword">val</span> fix</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> ('a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * 'b) -> 'b</code></pre><pre><span id="VALl1"><span class="keyword">val</span> l1</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl2"><span class="keyword">val</span> l2</span> : <code class="type">('a -> 'b -> 'c <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl3"><span class="keyword">val</span> l3</span> : <code class="type">('a -> 'b -> 'c -> 'd <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl4"><span class="keyword">val</span> l4</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl5"><span class="keyword">val</span> l5</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl6"><span class="keyword">val</span> l6</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -><br> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a> -> 'g <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
diff --git a/doc/React.S.Special.Si.html b/doc/React.S.Special.Si.html
index eec92e9..3382be1 100644
--- a/doc/React.S.Special.Si.html
+++ b/doc/React.S.Special.Si.html
@@ -14,14 +14,13 @@
<link title="React" rel="Chapter" href="React.html"><title>React.S.Special.Si</title>
</head>
<body>
-<div class="navbar"><a href="React.S.Special.Sb.html">Previous</a>
-&nbsp;<a href="React.S.Special.html">Up</a>
-&nbsp;<a href="React.S.Special.Sf.html">Next</a>
+<div class="navbar"><a class="pre" href="React.S.Special.Sb.html" title="React.S.Special.Sb">Previous</a>
+&nbsp;<a class="up" href="React.S.Special.html" title="React.S.Special">Up</a>
+&nbsp;<a class="post" href="React.S.Special.Sf.html" title="React.S.Special.Sf">Next</a>
</div>
-<center><h1>Module <a href="type_React.S.Special.Si.html">React.S.Special.Si</a></h1></center>
-<br>
+<h1>Module <a href="type_React.S.Special.Si.html">React.S.Special.Si</a></h1>
<pre><span class="keyword">module</span> Si: <code class="type"><a href="React.S.S.html">React.S.S</a></code><code class="type"> with type 'a v = int</code></pre>Specialization for integers.<br>
<hr width="100%">
<pre><span id="TYPEv"><span class="keyword">type</span> <code class="type">'a</code> v</span> </pre>
-<pre><span id="VALcreate"><span class="keyword">val</span> create</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * ('a <a href="React.S.S.html#TYPEv">v</a> -> unit)</code></pre><pre><span id="VALequal"><span class="keyword">val</span> equal</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> bool</code></pre><pre><span id="VALhold"><span class="keyword">val</span> hold</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALapp"><span class="keyword">val</span> app</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmap"><span class="keyword">val</span> map</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfilter"><span class="keyword">val</span> filter</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> bool) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfmap"><span class="keyword">val</span> fmap</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a> option) -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALwhen_"><span class="keyword">val</span> when_</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALdismiss"><span class="keyword">val</span> dismiss</span> : <code class="type">'a <a href="React.html#TYPEevent">React.event</a> -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALaccum"><span class="keyword">val</span> accum</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfold"><span class="keyword">val</span> fold</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmerge"><span class="keyword">val</span> merge</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> list -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALswitch"><span class="keyword">val</span> switch</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfix"><span class="keyword">val</span> fix</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> ('a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * 'b) -> 'b</code></pre><pre><span id="VALl1"><span class="keyword">val</span> l1</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl2"><span class="keyword">val</span> l2</span> : <code class="type">('a -> 'b -> 'c <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl3"><span class="keyword">val</span> l3</span> : <code class="type">('a -> 'b -> 'c -> 'd <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl4"><span class="keyword">val</span> l4</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl5"><span class="keyword">val</span> l5</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl6"><span class="keyword">val</span> l6</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -><br> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a> -> 'g <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
+<pre><span id="VALcreate"><span class="keyword">val</span> create</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * ('a <a href="React.S.S.html#TYPEv">v</a> -> unit)</code></pre><pre><span id="VALequal"><span class="keyword">val</span> equal</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> bool</code></pre><pre><span id="VALhold"><span class="keyword">val</span> hold</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALapp"><span class="keyword">val</span> app</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmap"><span class="keyword">val</span> map</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfilter"><span class="keyword">val</span> filter</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> bool) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfmap"><span class="keyword">val</span> fmap</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a> option) -><br> 'b <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALwhen_"><span class="keyword">val</span> when_</span> : <code class="type">bool <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALdismiss"><span class="keyword">val</span> dismiss</span> : <code class="type">'b <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALaccum"><span class="keyword">val</span> accum</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a>) <a href="React.html#TYPEevent">React.event</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfold"><span class="keyword">val</span> fold</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALmerge"><span class="keyword">val</span> merge</span> : <code class="type">('a <a href="React.S.S.html#TYPEv">v</a> -> 'b -> 'a <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.S.S.html#TYPEv">v</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> list -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALswitch"><span class="keyword">val</span> switch</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -><br> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALfix"><span class="keyword">val</span> fix</span> : <code class="type">'a <a href="React.S.S.html#TYPEv">v</a> -><br> ('a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a> * 'b) -> 'b</code></pre><pre><span id="VALl1"><span class="keyword">val</span> l1</span> : <code class="type">('a -> 'b <a href="React.S.S.html#TYPEv">v</a>) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl2"><span class="keyword">val</span> l2</span> : <code class="type">('a -> 'b -> 'c <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl3"><span class="keyword">val</span> l3</span> : <code class="type">('a -> 'b -> 'c -> 'd <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl4"><span class="keyword">val</span> l4</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl5"><span class="keyword">val</span> l5</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl6"><span class="keyword">val</span> l6</span> : <code class="type">('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g <a href="React.S.S.html#TYPEv">v</a>) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -><br> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a> -> 'g <a href="React.S.S.html#TYPEv">v</a> <a href="React.html#TYPEsignal">React.signal</a></code></pre></body></html> \ No newline at end of file
diff --git a/doc/React.S.Special.html b/doc/React.S.Special.html
index 81ef735..9406313 100644
--- a/doc/React.S.Special.html
+++ b/doc/React.S.Special.html
@@ -13,11 +13,10 @@
<link title="React" rel="Chapter" href="React.html"><title>React.S.Special</title>
</head>
<body>
-<div class="navbar"><a href="React.S.Make.html">Previous</a>
-&nbsp;<a href="React.S.html">Up</a>
+<div class="navbar"><a class="pre" href="React.S.Make.html" title="React.S.Make">Previous</a>
+&nbsp;<a class="up" href="React.S.html" title="React.S">Up</a>
&nbsp;</div>
-<center><h1>Module <a href="type_React.S.Special.html">React.S.Special</a></h1></center>
-<br>
+<h1>Module <a href="type_React.S.Special.html">React.S.Special</a></h1>
<pre><span class="keyword">module</span> Special: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Special.html">..</a> <code class="code"><span class="keyword">end</span></code></pre>Specialization for booleans, integers and floats.
<p>
diff --git a/doc/React.S.html b/doc/React.S.html
index a3cb661..6fecff7 100644
--- a/doc/React.S.html
+++ b/doc/React.S.html
@@ -20,11 +20,10 @@
<title>React.S</title>
</head>
<body>
-<div class="navbar"><a href="React.E.html">Previous</a>
-&nbsp;<a href="React.html">Up</a>
+<div class="navbar"><a class="pre" href="React.E.html" title="React.E">Previous</a>
+&nbsp;<a class="up" href="React.html" title="React">Up</a>
&nbsp;</div>
-<center><h1>Module <a href="type_React.S.html">React.S</a></h1></center>
-<br>
+<h1>Module <a href="type_React.S.html">React.S</a></h1>
<pre><span class="keyword">module</span> S: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.html">..</a> <code class="code"><span class="keyword">end</span></code></pre>Signal combinators.
<p>
@@ -100,12 +99,12 @@ The type for signals of type <code class="code"><span class="keywordsign">'</spa
</div>
<br>
<span id="tr"><h1>Transforming and filtering</h1></span><br>
-<pre><span id="VALapp"><span class="keyword">val</span> app</span> : <code class="type">?eq:('a -> 'a -> bool) -><br> ('b -> 'a) <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info">
+<pre><span id="VALapp"><span class="keyword">val</span> app</span> : <code class="type">?eq:('b -> 'b -> bool) -><br> ('a -> 'b) <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info">
<code class="code">app sf s</code> holds the value of <code class="code">sf</code> applied
to the value of <code class="code">s</code>, [<code class="code">app sf s</code>]<sub class="subscript">t</sub>
<code class="code">=</code> [<code class="code">sf</code>]<sub class="subscript">t</sub> [<code class="code">s</code>]<sub class="subscript">t</sub>.<br>
</div>
-<pre><span id="VALmap"><span class="keyword">val</span> map</span> : <code class="type">?eq:('a -> 'a -> bool) -> ('b -> 'a) -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info">
+<pre><span id="VALmap"><span class="keyword">val</span> map</span> : <code class="type">?eq:('b -> 'b -> bool) -> ('a -> 'b) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info">
<code class="code">map f s</code> is <code class="code">s</code> transformed by <code class="code">f</code>, [<code class="code">map f s</code>]<sub class="subscript">t</sub> = <code class="code">f</code> [<code class="code">s</code>]<sub class="subscript">t</sub>.<br>
</div>
<pre><span id="VALfilter"><span class="keyword">val</span> filter</span> : <code class="type">?eq:('a -> 'a -> bool) -><br> ('a -> bool) -> 'a -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info">
@@ -120,7 +119,7 @@ The type for signals of type <code class="code"><span class="keywordsign">'</spa
</ul>
<br>
</div>
-<pre><span id="VALfmap"><span class="keyword">val</span> fmap</span> : <code class="type">?eq:('a -> 'a -> bool) -><br> ('b -> 'a option) -> 'a -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info">
+<pre><span id="VALfmap"><span class="keyword">val</span> fmap</span> : <code class="type">?eq:('b -> 'b -> bool) -><br> ('a -> 'b option) -> 'b -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a></code></pre><div class="info">
<code class="code">fmap fm i s</code> is <code class="code">s</code> filtered and mapped by <code class="code">fm</code>.
<ul>
<li>[<code class="code">fmap fm i s</code>]<sub class="subscript">t</sub> <code class="code">=</code> v if <code class="code">fm</code> [<code class="code">s</code>]<sub class="subscript">t</sub><code class="code"> = <span class="constructor">Some</span> v</code>.</li>
@@ -146,7 +145,7 @@ The type for signals of type <code class="code"><span class="keywordsign">'</spa
<pre><span id="VALchanges"><span class="keyword">val</span> changes</span> : <code class="type">'a <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info">
<code class="code">changes s</code> is <code class="code">diff (<span class="keyword">fun</span> v _ <span class="keywordsign">-&gt;</span> v) s</code>.<br>
</div>
-<pre><span id="VALsample"><span class="keyword">val</span> sample</span> : <code class="type">('a -> 'b -> 'c) -> 'a <a href="React.html#TYPEevent">React.event</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info">
+<pre><span id="VALsample"><span class="keyword">val</span> sample</span> : <code class="type">('b -> 'a -> 'c) -> 'b <a href="React.html#TYPEevent">React.event</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEevent">React.event</a></code></pre><div class="info">
<code class="code">sample f e s</code> samples <code class="code">s</code> at <code class="code">e</code>'s occurrences.
<ul>
<li>[<code class="code">sample f e s</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> (f ev sv)</code> if [<code class="code">e</code>]<sub class="subscript">t</sub> <code class="code">= <span class="constructor">Some</span> ev</code>
@@ -258,7 +257,7 @@ The type for signals of type <code class="code"><span class="keywordsign">'</spa
<p>
[<code class="code">ln f a1</code> ... <code class="code">an</code>]<sub class="subscript">t</sub> = f [<code class="code">a1</code>]<sub class="subscript">t</sub> ... [<code class="code">an</code>]<sub class="subscript">t</sub><br>
-<pre><span id="VALl1"><span class="keyword">val</span> l1</span> : <code class="type">?eq:('a -> 'a -> bool) -> ('b -> 'a) -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl2"><span class="keyword">val</span> l2</span> : <code class="type">?eq:('a -> 'a -> bool) -><br> ('b -> 'c -> 'a) -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl3"><span class="keyword">val</span> l3</span> : <code class="type">?eq:('a -> 'a -> bool) -><br> ('b -> 'c -> 'd -> 'a) -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl4"><span class="keyword">val</span> l4</span> : <code class="type">?eq:('a -> 'a -> bool) -><br> ('b -> 'c -> 'd -> 'e -> 'a) -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl5"><span class="keyword">val</span> l5</span> : <code class="type">?eq:('a -> 'a -> bool) -><br> ('b -> 'c -> 'd -> 'e -> 'f -> 'a) -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl6"><span class="keyword">val</span> l6</span> : <code class="type">?eq:('a -> 'a -> bool) -><br> ('b -> 'c -> 'd -> 'e -> 'f -> 'g -> 'a) -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -><br> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a> -> 'g <a href="React.html#TYPEsignal">React.signal</a> -> 'a <a href="React.html#TYPEsignal">React.signal</a></code></pre><br>
+<pre><span id="VALl1"><span class="keyword">val</span> l1</span> : <code class="type">?eq:('b -> 'b -> bool) -> ('a -> 'b) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl2"><span class="keyword">val</span> l2</span> : <code class="type">?eq:('c -> 'c -> bool) -><br> ('a -> 'b -> 'c) -> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl3"><span class="keyword">val</span> l3</span> : <code class="type">?eq:('d -> 'd -> bool) -><br> ('a -> 'b -> 'c -> 'd) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl4"><span class="keyword">val</span> l4</span> : <code class="type">?eq:('e -> 'e -> bool) -><br> ('a -> 'b -> 'c -> 'd -> 'e) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl5"><span class="keyword">val</span> l5</span> : <code class="type">?eq:('f -> 'f -> bool) -><br> ('a -> 'b -> 'c -> 'd -> 'e -> 'f) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a></code></pre><pre><span id="VALl6"><span class="keyword">val</span> l6</span> : <code class="type">?eq:('g -> 'g -> bool) -><br> ('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g) -><br> 'a <a href="React.html#TYPEsignal">React.signal</a> -><br> 'b <a href="React.html#TYPEsignal">React.signal</a> -><br> 'c <a href="React.html#TYPEsignal">React.signal</a> -><br> 'd <a href="React.html#TYPEsignal">React.signal</a> -> 'e <a href="React.html#TYPEsignal">React.signal</a> -> 'f <a href="React.html#TYPEsignal">React.signal</a> -> 'g <a href="React.html#TYPEsignal">React.signal</a></code></pre><br>
The following modules lift some of <code class="code"><span class="constructor">Pervasives</span></code> functions and
operators.<br>
<pre><span class="keyword">module</span> <a href="React.S.Bool.html">Bool</a>: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Bool.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><pre><span class="keyword">module</span> <a href="React.S.Int.html">Int</a>: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Int.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><pre><span class="keyword">module</span> <a href="React.S.Float.html">Float</a>: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Float.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><pre><span class="keyword">module</span> <a href="React.S.Pair.html">Pair</a>: <code class="code"><span class="keyword">sig</span></code> <a href="React.S.Pair.html">..</a> <code class="code"><span class="keyword">end</span></code></pre><pre><span class="keyword">module</span> <a href="React.S.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>
diff --git a/doc/React.html b/doc/React.html
index 025cbdd..7c0de63 100644
--- a/doc/React.html
+++ b/doc/React.html
@@ -25,10 +25,9 @@
<title>React</title>
</head>
<body>
-<div class="navbar">&nbsp;<a href="index.html">Up</a>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
&nbsp;</div>
-<center><h1>Module <a href="type_React.html">React</a></h1></center>
-<br>
+<h1>Module <a href="type_React.html">React</a></h1>
<pre><span class="keyword">module</span> React: <code class="code"><span class="keyword">sig</span></code> <a href="React.html">..</a> <code class="code"><span class="keyword">end</span></code></pre>Declarative events and signals.
<p>
@@ -44,7 +43,7 @@
types and modules in your scope.
<p>
- <em>Release 0.9.3 - Daniel Bünzli &lt;daniel.buenzli at erratique.ch&gt; </em><br>
+ <em>Release 0.9.4 - Daniel Bünzli &lt;daniel.buenzli at erratique.ch&gt; </em><br>
<hr width="100%">
<br>
<span id="1_Interface"><h1>Interface</h1></span><br>
@@ -151,11 +150,11 @@ Signal combinators.
occurrence for the event at the time it is called. The following
code creates a primitive integer event <code class="code">x</code> and generates three
occurrences with value <code class="code">1</code>, <code class="code">2</code>, <code class="code">3</code>. Those occurrences are printed
- on stdout by the effectful event <code class="code">pr_x</code>. <pre></pre><code class="code"><span class="keyword">open</span>&nbsp;<span class="constructor">React</span>;;<br>
+ on stdout by the effectful event <code class="code">pr_x</code>. <code class="code"><span class="keyword">open</span>&nbsp;<span class="constructor">React</span>;;<br>
<br>
<span class="keyword">let</span>&nbsp;x,&nbsp;send_x&nbsp;=&nbsp;<span class="constructor">E</span>.create&nbsp;()<br>
<span class="keyword">let</span>&nbsp;pr_x&nbsp;=&nbsp;<span class="constructor">E</span>.map&nbsp;print_int&nbsp;x<br>
-<span class="keyword">let</span>&nbsp;()&nbsp;=&nbsp;<span class="constructor">List</span>.iter&nbsp;send_x&nbsp;[1;&nbsp;2;&nbsp;3]</code><pre></pre>
+<span class="keyword">let</span>&nbsp;()&nbsp;=&nbsp;<span class="constructor">List</span>.iter&nbsp;send_x&nbsp;[1;&nbsp;2;&nbsp;3]</code>
Primitive signals are created with <a href="React.S.html#VALcreate"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.create</code></a>. This function
returns a new signal and an update function that sets the signal's value
at the time it is called. The following code creates an
@@ -165,11 +164,11 @@ Signal combinators.
the signal's value are printed, hence the program prints <code class="code">123</code>, not <code class="code">1223</code>.
See the discussion on
<a href="#sideeffects">side effects</a> for more details.
-<pre></pre><code class="code"><span class="keyword">open</span>&nbsp;<span class="constructor">React</span>;;<br>
+<code class="code"><span class="keyword">open</span>&nbsp;<span class="constructor">React</span>;;<br>
<br>
<span class="keyword">let</span>&nbsp;x,&nbsp;set_x&nbsp;=&nbsp;<span class="constructor">S</span>.create&nbsp;1<br>
<span class="keyword">let</span>&nbsp;pr_x&nbsp;=&nbsp;<span class="constructor">S</span>.map&nbsp;print_int&nbsp;x<br>
-<span class="keyword">let</span>&nbsp;()&nbsp;=&nbsp;<span class="constructor">List</span>.iter&nbsp;set_x&nbsp;[2;&nbsp;2;&nbsp;3]</code><pre></pre>
+<span class="keyword">let</span>&nbsp;()&nbsp;=&nbsp;<span class="constructor">List</span>.iter&nbsp;set_x&nbsp;[2;&nbsp;2;&nbsp;3]</code>
The <a href="#clock">clock</a> example shows how a realtime time
flow can be defined.
<p>
@@ -196,13 +195,13 @@ Signal combinators.
Below updates to <code class="code">x</code> and <code class="code">y</code> must be serialized, but z can
be updated concurently to both <code class="code">x</code> and <code class="code">y</code>.
-<pre></pre><code class="code"><span class="keyword">open</span>&nbsp;<span class="constructor">React</span>;;<br>
+<code class="code"><span class="keyword">open</span>&nbsp;<span class="constructor">React</span>;;<br>
<br>
<span class="keyword">let</span>&nbsp;x,&nbsp;set_x&nbsp;=&nbsp;<span class="constructor">S</span>.create&nbsp;0<br>
<span class="keyword">let</span>&nbsp;y,&nbsp;send_y&nbsp;=&nbsp;<span class="constructor">E</span>.create&nbsp;()<br>
<span class="keyword">let</span>&nbsp;z,&nbsp;set_z&nbsp;=&nbsp;<span class="constructor">S</span>.create&nbsp;0<br>
<span class="keyword">let</span>&nbsp;max_xy&nbsp;=&nbsp;<span class="constructor">S</span>.l2&nbsp;(<span class="keyword">fun</span>&nbsp;x&nbsp;y&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keyword">if</span>&nbsp;x&nbsp;&gt;&nbsp;y&nbsp;<span class="keyword">then</span>&nbsp;x&nbsp;<span class="keyword">else</span>&nbsp;y)&nbsp;x&nbsp;(<span class="constructor">S</span>.hold&nbsp;0&nbsp;y)<br>
-<span class="keyword">let</span>&nbsp;succ_z&nbsp;=&nbsp;<span class="constructor">S</span>.map&nbsp;succ&nbsp;z</code><pre></pre>
+<span class="keyword">let</span>&nbsp;succ_z&nbsp;=&nbsp;<span class="constructor">S</span>.map&nbsp;succ&nbsp;z</code>
<span id="simultaneity"><h2>Simultaneous events</h2></span>
<p>
@@ -220,10 +219,10 @@ Signal combinators.
In the code below <code class="code">w</code>, <code class="code">x</code> and <code class="code">y</code> will have simultaneous occurrences while
<code class="code">z</code> will never have simultaneous occurrences with them.
-<pre></pre><code class="code"><span class="keyword">let</span>&nbsp;w,&nbsp;send_w&nbsp;=&nbsp;<span class="constructor">E</span>.create&nbsp;()<br>
+<code class="code"><span class="keyword">let</span>&nbsp;w,&nbsp;send_w&nbsp;=&nbsp;<span class="constructor">E</span>.create&nbsp;()<br>
<span class="keyword">let</span>&nbsp;x&nbsp;=&nbsp;<span class="constructor">E</span>.map&nbsp;succ&nbsp;w<br>
<span class="keyword">let</span>&nbsp;y&nbsp;=&nbsp;<span class="constructor">E</span>.map&nbsp;succ&nbsp;x<br>
-<span class="keyword">let</span>&nbsp;z,&nbsp;send_z&nbsp;=&nbsp;<span class="constructor">E</span>.create&nbsp;()</code><pre></pre>
+<span class="keyword">let</span>&nbsp;z,&nbsp;send_z&nbsp;=&nbsp;<span class="constructor">E</span>.create&nbsp;()</code>
<span id="sideeffects"><h2>Side effects</h2></span>
<p>
@@ -241,9 +240,9 @@ Signal combinators.
It is important to keep references on effectful events and
signals. Otherwise they may be reclaimed by the garbage collector.
The following program prints only a <code class="code">1</code>.
-<pre></pre><code class="code"><span class="keyword">let</span>&nbsp;x,&nbsp;set_x&nbsp;=&nbsp;<span class="constructor">S</span>.create&nbsp;1<br>
+<code class="code"><span class="keyword">let</span>&nbsp;x,&nbsp;set_x&nbsp;=&nbsp;<span class="constructor">S</span>.create&nbsp;1<br>
<span class="keyword">let</span>&nbsp;()&nbsp;=&nbsp;ignore&nbsp;(<span class="constructor">S</span>.map&nbsp;print_int&nbsp;x)<br>
-<span class="keyword">let</span>&nbsp;()&nbsp;=&nbsp;<span class="constructor">Gc</span>.full_major&nbsp;();&nbsp;<span class="constructor">List</span>.iter&nbsp;set_x&nbsp;[2;&nbsp;2;&nbsp;3]</code><pre></pre>
+<span class="keyword">let</span>&nbsp;()&nbsp;=&nbsp;<span class="constructor">Gc</span>.full_major&nbsp;();&nbsp;<span class="constructor">List</span>.iter&nbsp;set_x&nbsp;[2;&nbsp;2;&nbsp;3]</code>
<span id="lifting"><h2>Lifting</h2></span>
<p>
@@ -253,27 +252,27 @@ Signal combinators.
but this involves the inefficient creation of n-1 intermediary
closure signals. The fixed arity <a href="React.S.html#lifting">lifting
functions</a> are more efficient. For example :
-<pre></pre><code class="code"><span class="keyword">let</span>&nbsp;f&nbsp;x&nbsp;y&nbsp;=&nbsp;x&nbsp;<span class="keyword">mod</span>&nbsp;y<br>
+<code class="code"><span class="keyword">let</span>&nbsp;f&nbsp;x&nbsp;y&nbsp;=&nbsp;x&nbsp;<span class="keyword">mod</span>&nbsp;y<br>
<span class="keyword">let</span>&nbsp;fl&nbsp;x&nbsp;y&nbsp;=&nbsp;<span class="constructor">S</span>.app&nbsp;(<span class="constructor">S</span>.app&nbsp;~eq:(==)&nbsp;(<span class="constructor">S</span>.const&nbsp;f)&nbsp;x)&nbsp;y&nbsp;<span class="comment">(*&nbsp;inefficient&nbsp;*)</span><br>
<span class="keyword">let</span>&nbsp;fl'&nbsp;x&nbsp;y&nbsp;=&nbsp;<span class="constructor">S</span>.l2&nbsp;f&nbsp;x&nbsp;y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">(*&nbsp;efficient&nbsp;*)</span><br>
-</code><pre></pre>
+</code>
Besides, some of <code class="code"><span class="constructor">Pervasives</span></code>'s functions and operators are
already lifted and availables in submodules of <a href="React.S.html"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span></code></a>. They can be
be opened in specific scopes. For example if you are dealing with
float signals you can open <a href="React.S.Float.html"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">Float</span></code></a>.
-<pre></pre><code class="code"><span class="keyword">open</span>&nbsp;<span class="constructor">React</span>&nbsp;<br>
+<code class="code"><span class="keyword">open</span>&nbsp;<span class="constructor">React</span>&nbsp;<br>
<span class="keyword">open</span>&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">Float</span>&nbsp;<br>
<br>
<span class="keyword">let</span>&nbsp;f&nbsp;t&nbsp;=&nbsp;sqrt&nbsp;t&nbsp;*.&nbsp;sin&nbsp;t&nbsp;<span class="comment">(*&nbsp;f&nbsp;is&nbsp;defined&nbsp;on&nbsp;float&nbsp;signals&nbsp;*)</span><br>
...<br>
<span class="keyword">open</span>&nbsp;<span class="constructor">Pervasives</span>&nbsp;<span class="comment">(*&nbsp;back&nbsp;to&nbsp;pervasives&nbsp;floats&nbsp;*)</span><br>
-</code><pre></pre>
+</code>
If you are using OCaml 3.12 or later you can also use the <code class="code"><span class="keyword">let</span> <span class="keyword">open</span></code>
construct
-<pre></pre><code class="code"><span class="keyword">let</span>&nbsp;<span class="keyword">open</span>&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">Float</span>&nbsp;<span class="keyword">in</span>&nbsp;<br>
+<code class="code"><span class="keyword">let</span>&nbsp;<span class="keyword">open</span>&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">Float</span>&nbsp;<span class="keyword">in</span>&nbsp;<br>
<span class="keyword">let</span>&nbsp;f&nbsp;t&nbsp;=&nbsp;sqrt&nbsp;t&nbsp;*.&nbsp;sin&nbsp;t&nbsp;<span class="keyword">in</span>&nbsp;<span class="comment">(*&nbsp;f&nbsp;is&nbsp;defined&nbsp;on&nbsp;float&nbsp;signals&nbsp;*)</span><br>
...<br>
-</code><pre></pre>
+</code>
<p>
<span id="recursion"><h2>Mutual and self reference</h2></span>
@@ -296,7 +295,7 @@ Signal combinators.
In the example below <code class="code">history s</code> returns a signal whose value
is the history of <code class="code">s</code> as a list.
-<pre></pre><code class="code"><span class="keyword">let</span>&nbsp;history&nbsp;?(eq&nbsp;=&nbsp;(&nbsp;=&nbsp;))&nbsp;s&nbsp;=&nbsp;<br>
+<code class="code"><span class="keyword">let</span>&nbsp;history&nbsp;?(eq&nbsp;=&nbsp;(&nbsp;=&nbsp;))&nbsp;s&nbsp;=&nbsp;<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;push&nbsp;v&nbsp;=&nbsp;<span class="keyword">function</span>&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;[]&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;[&nbsp;v&nbsp;]&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">|</span>&nbsp;v'&nbsp;::&nbsp;_&nbsp;<span class="keyword">as</span>&nbsp;l&nbsp;<span class="keyword">when</span>&nbsp;eq&nbsp;v&nbsp;v'&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;l<br>
@@ -306,7 +305,7 @@ Signal combinators.
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;h'&nbsp;=&nbsp;<span class="constructor">S</span>.l2&nbsp;push&nbsp;s&nbsp;h&nbsp;<span class="keyword">in</span>&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;h',&nbsp;h'<br>
&nbsp;&nbsp;<span class="keyword">in</span><br>
-&nbsp;&nbsp;<span class="constructor">S</span>.fix&nbsp;[]&nbsp;define</code><pre></pre>
+&nbsp;&nbsp;<span class="constructor">S</span>.fix&nbsp;[]&nbsp;define</code>
When a program has infinitesimally delayed values a
<a href="#primitives">primitive</a> may trigger more than one update
cycle. For example if a signal <code class="code">s</code> is infinitesimally delayed, then
@@ -316,7 +315,7 @@ Signal combinators.
signal (or event) and its infinitesimally delayed counterpart must
be well-founded otherwise this may trigger an infinite number
of update cycles, like in the following examples.
-<pre></pre><code class="code"><span class="keyword">let</span>&nbsp;start,&nbsp;send_start&nbsp;=&nbsp;<span class="constructor">E</span>.create&nbsp;()<br>
+<code class="code"><span class="keyword">let</span>&nbsp;start,&nbsp;send_start&nbsp;=&nbsp;<span class="constructor">E</span>.create&nbsp;()<br>
<span class="keyword">let</span>&nbsp;diverge&nbsp;=&nbsp;<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;define&nbsp;e&nbsp;=&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;e'&nbsp;=&nbsp;<span class="constructor">E</span>.select&nbsp;[e;&nbsp;start]&nbsp;<span class="keyword">in</span>&nbsp;<br>
@@ -331,7 +330,7 @@ Signal combinators.
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;s'&nbsp;=&nbsp;<span class="constructor">S</span>.<span class="constructor">Int</span>.succ&nbsp;s&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;s',&nbsp;s'<br>
&nbsp;&nbsp;<span class="keyword">in</span><br>
-&nbsp;&nbsp;<span class="constructor">S</span>.fix&nbsp;0&nbsp;define</code><pre></pre>
+&nbsp;&nbsp;<span class="constructor">S</span>.fix&nbsp;0&nbsp;define</code>
For technical reasons, delayed events and signals (those given to
fixing functions) are not allowed to directly depend on each
other. Fixed point combinators will raise <code class="code"><span class="constructor">Invalid_argument</span></code> if
@@ -351,7 +350,7 @@ Signal combinators.
along with an
<a href="http://www.ecma-international.org/publications/standards/Ecma-048.htm">ANSI
escape sequence</a> to control the cursor position.
-<pre></pre><code class="code"><span class="keyword">let</span>&nbsp;pr_time&nbsp;t&nbsp;=&nbsp;<br>
+<code class="code"><span class="keyword">let</span>&nbsp;pr_time&nbsp;t&nbsp;=&nbsp;<br>
&nbsp;&nbsp;<span class="keyword">let</span>&nbsp;tm&nbsp;=&nbsp;<span class="constructor">Unix</span>.localtime&nbsp;t&nbsp;<span class="keyword">in</span><br>
&nbsp;&nbsp;<span class="constructor">Printf</span>.printf&nbsp;<span class="string">"\x1B[8D%02d:%02d:%02d%!"</span>&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;tm.<span class="constructor">Unix</span>.tm_hour&nbsp;tm.<span class="constructor">Unix</span>.tm_min&nbsp;tm.<span class="constructor">Unix</span>.tm_sec<br>
@@ -367,5 +366,5 @@ Signal combinators.
<br>
<span class="keyword">let</span>&nbsp;printer&nbsp;=&nbsp;<span class="constructor">E</span>.map&nbsp;pr_time&nbsp;seconds<br>
<br>
-<span class="keyword">let</span>&nbsp;()&nbsp;=&nbsp;run&nbsp;()</code><pre></pre><br>
+<span class="keyword">let</span>&nbsp;()&nbsp;=&nbsp;run&nbsp;()</code><br>
</body></html> \ No newline at end of file
diff --git a/doc/index.html b/doc/index.html
index ff0333d..1f9094f 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -11,14 +11,16 @@
<link title="React" rel="Chapter" href="React.html"><title></title>
</head>
<body>
-<center><h1></h1></center>
-<a href="index_types.html">Index of types</a><br>
-<a href="index_values.html">Index of values</a><br>
-<a href="index_modules.html">Index of modules</a><br>
-<a href="index_module_types.html">Index of module types</a><br>
+<h1></h1>
+<ul class="indexlist">
+<li><a href="index_types.html">Index of types</a></li>
+<li><a href="index_values.html">Index of values</a></li>
+<li><a href="index_modules.html">Index of modules</a></li>
+<li><a href="index_module_types.html">Index of module types</a></li>
+</ul>
<br/><br>
<table class="indextable">
-<tr><td><a href="React.html">React</a></td><td><div class="info">
+<tr><td class="module"><a href="React.html">React</a></td><td><div class="info">
Declarative events and signals.
</div>
</td></tr>
diff --git a/doc/index_attributes.html b/doc/index_attributes.html
index 7683e5e..cac9135 100644
--- a/doc/index_attributes.html
+++ b/doc/index_attributes.html
@@ -10,8 +10,10 @@
<link title="React" rel="Chapter" href="React.html"><title>Index of class attributes</title>
</head>
<body>
-<center><h1>Index of class attributes</h1></center>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
+&nbsp;</div>
+<h1>Index of class attributes</h1>
<table>
-</table><br>
+</table>
</body>
</html> \ No newline at end of file
diff --git a/doc/index_class_types.html b/doc/index_class_types.html
index 5ec5248..a138038 100644
--- a/doc/index_class_types.html
+++ b/doc/index_class_types.html
@@ -10,8 +10,10 @@
<link title="React" rel="Chapter" href="React.html"><title>Index of class types</title>
</head>
<body>
-<center><h1>Index of class types</h1></center>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
+&nbsp;</div>
+<h1>Index of class types</h1>
<table>
-</table><br>
+</table>
</body>
</html> \ No newline at end of file
diff --git a/doc/index_classes.html b/doc/index_classes.html
index 650bc53..5b9f199 100644
--- a/doc/index_classes.html
+++ b/doc/index_classes.html
@@ -10,8 +10,10 @@
<link title="React" rel="Chapter" href="React.html"><title>Index of classes</title>
</head>
<body>
-<center><h1>Index of classes</h1></center>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
+&nbsp;</div>
+<h1>Index of classes</h1>
<table>
-</table><br>
+</table>
</body>
</html> \ No newline at end of file
diff --git a/doc/index_exceptions.html b/doc/index_exceptions.html
index 6391694..8fe35d4 100644
--- a/doc/index_exceptions.html
+++ b/doc/index_exceptions.html
@@ -10,8 +10,10 @@
<link title="React" rel="Chapter" href="React.html"><title>Index of exceptions</title>
</head>
<body>
-<center><h1>Index of exceptions</h1></center>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
+&nbsp;</div>
+<h1>Index of exceptions</h1>
<table>
-</table><br>
+</table>
</body>
</html> \ No newline at end of file
diff --git a/doc/index_methods.html b/doc/index_methods.html
index 51aa15e..fc6ffa5 100644
--- a/doc/index_methods.html
+++ b/doc/index_methods.html
@@ -10,8 +10,10 @@
<link title="React" rel="Chapter" href="React.html"><title>Index of class methods</title>
</head>
<body>
-<center><h1>Index of class methods</h1></center>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
+&nbsp;</div>
+<h1>Index of class methods</h1>
<table>
-</table><br>
+</table>
</body>
</html> \ No newline at end of file
diff --git a/doc/index_module_types.html b/doc/index_module_types.html
index 178cc8d..c64195b 100644
--- a/doc/index_module_types.html
+++ b/doc/index_module_types.html
@@ -10,7 +10,9 @@
<link title="React" rel="Chapter" href="React.html"><title>Index of module types</title>
</head>
<body>
-<center><h1>Index of module types</h1></center>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
+&nbsp;</div>
+<h1>Index of module types</h1>
<table>
<tr><td align="left"><br>E</td></tr>
<tr><td><a href="React.S.EqType.html">EqType</a> [<a href="React.S.html">React.S</a>]</td>
@@ -24,6 +26,6 @@ Input signature of <a href="React.S.Make.html"><code class="code"><span class="c
Output signature of <a href="React.S.Make.html"><code class="code"><span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">Make</span></code></a>
</div>
</td></tr>
-</table><br>
+</table>
</body>
</html> \ No newline at end of file
diff --git a/doc/index_modules.html b/doc/index_modules.html
index 0935142..6c3c139 100644
--- a/doc/index_modules.html
+++ b/doc/index_modules.html
@@ -10,7 +10,9 @@
<link title="React" rel="Chapter" href="React.html"><title>Index of modules</title>
</head>
<body>
-<center><h1>Index of modules</h1></center>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
+&nbsp;</div>
+<h1>Index of modules</h1>
<table>
<tr><td align="left"><br>B</td></tr>
<tr><td><a href="React.S.Bool.html">Bool</a> [<a href="React.S.html">React.S</a>]</td>
@@ -71,6 +73,6 @@ Specialization for integers.
Specialization for booleans, integers and floats.
</div>
</td></tr>
-</table><br>
+</table>
</body>
</html> \ No newline at end of file
diff --git a/doc/index_types.html b/doc/index_types.html
index 4390849..598f800 100644
--- a/doc/index_types.html
+++ b/doc/index_types.html
@@ -10,7 +10,9 @@
<link title="React" rel="Chapter" href="React.html"><title>Index of types</title>
</head>
<body>
-<center><h1>Index of types</h1></center>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
+&nbsp;</div>
+<h1>Index of types</h1>
<table>
<tr><td align="left"><br>E</td></tr>
<tr><td><a href="React.html#TYPEevent">event</a> [<a href="React.html">React</a>]</td>
@@ -40,6 +42,6 @@ The type for events with occurrences of type <code class="code"><span class="key
<tr><td align="left"><br>V</td></tr>
<tr><td><a href="React.S.S.html#TYPEv">v</a> [<a href="React.S.S.html">React.S.S</a>]</td>
<td></td></tr>
-</table><br>
+</table>
</body>
</html> \ No newline at end of file
diff --git a/doc/index_values.html b/doc/index_values.html
index 5395f41..5770955 100644
--- a/doc/index_values.html
+++ b/doc/index_values.html
@@ -10,7 +10,9 @@
<link title="React" rel="Chapter" href="React.html"><title>Index of values</title>
</head>
<body>
-<center><h1>Index of values</h1></center>
+<div class="navbar">&nbsp;<a class="up" href="index.html" title="Index">Up</a>
+&nbsp;</div>
+<h1>Index of values</h1>
<table>
<tr><td align="left"><br></td></tr>
<tr><td><a href="React.S.Int.html#VAL( * )">( * )</a> [<a href="React.S.Int.html">React.S.Int</a>]</td>
@@ -478,6 +480,6 @@ A never occuring event.
<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>
</td></tr>
-</table><br>
+</table>
</body>
</html> \ No newline at end of file
diff --git a/doc/type_React.E.html b/doc/type_React.E.html
index ede419c..3b3d6b7 100644
--- a/doc/type_React.E.html
+++ b/doc/type_React.E.html
@@ -23,13 +23,13 @@
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;drop_once&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
-&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;stamp&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;stamp&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;diff&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;changes&nbsp;:&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;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>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;until&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
diff --git a/doc/type_React.S.Make.html b/doc/type_React.S.Make.html
index b687eea..6acd092 100644
--- a/doc/type_React.S.Make.html
+++ b/doc/type_React.S.Make.html
@@ -20,7 +20,7 @@
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
-&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
diff --git a/doc/type_React.S.S.html b/doc/type_React.S.S.html
index 1a3ef81..88345ee 100644
--- a/doc/type_React.S.S.html
+++ b/doc/type_React.S.S.html
@@ -35,9 +35,9 @@
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>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>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:<br>
&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
diff --git a/doc/type_React.S.Special.Sb.html b/doc/type_React.S.Special.Sb.html
index a1c2f1c..18b65c0 100644
--- a/doc/type_React.S.Special.Sb.html
+++ b/doc/type_React.S.Special.Sb.html
@@ -19,7 +19,7 @@
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
-&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
diff --git a/doc/type_React.S.Special.Sf.html b/doc/type_React.S.Special.Sf.html
index 947e52e..31f19ee 100644
--- a/doc/type_React.S.Special.Sf.html
+++ b/doc/type_React.S.Special.Sf.html
@@ -19,7 +19,7 @@
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
-&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
diff --git a/doc/type_React.S.Special.Si.html b/doc/type_React.S.Special.Si.html
index e5c16da..a246356 100644
--- a/doc/type_React.S.Special.Si.html
+++ b/doc/type_React.S.Special.Si.html
@@ -19,7 +19,7 @@
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
-&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;signal&nbsp;list&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
diff --git a/doc/type_React.S.Special.html b/doc/type_React.S.Special.html
index 3e4f3a2..01839a0 100644
--- a/doc/type_React.S.Special.html
+++ b/doc/type_React.S.Special.html
@@ -21,7 +21,7 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
@@ -57,7 +57,7 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
@@ -93,7 +93,7 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
diff --git a/doc/type_React.S.html b/doc/type_React.S.html
index e25ac09..4f39f57 100644
--- a/doc/type_React.S.html
+++ b/doc/type_React.S.html
@@ -24,21 +24,21 @@
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:<br>
&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:<br>
&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;diff&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;changes&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;sample&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>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>.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;(<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;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>
@@ -60,33 +60,33 @@
&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&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;?eq:(<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="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>a)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="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>a)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="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>a)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="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>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>g&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;<span class="constructor">React</span>.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="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;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>
@@ -221,9 +221,9 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>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>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
@@ -282,7 +282,7 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
@@ -320,7 +320,7 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
@@ -357,7 +357,7 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
@@ -394,7 +394,7 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;merge&nbsp;:<br>
diff --git a/doc/type_React.html b/doc/type_React.html
index d92f4b0..ecf1520 100644
--- a/doc/type_React.html
+++ b/doc/type_React.html
@@ -27,14 +27,14 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;drop_once&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;stamp&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;stamp&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;diff&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;changes&nbsp;:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;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>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;until&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
@@ -64,22 +64,22 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;hold&nbsp;:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;app&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;map&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;filter&nbsp;:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;diff&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;changes&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;sample&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>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>.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;&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;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>
@@ -102,38 +102,38 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;*&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l1&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l2&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l3&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="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>a)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l4&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="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>a)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l5&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="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>a)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;l6&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>b&nbsp;<span class="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>&nbsp;<span class="keywordsign">'</span>a)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;?eq:(<span class="keywordsign">'</span>g&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;bool)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>f&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>g)&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>c&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>d&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>e&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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&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="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;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>
@@ -287,9 +287,9 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v)&nbsp;<span class="constructor">React</span>.event&nbsp;<span class="keywordsign">-&gt;</span><br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;<span class="constructor">React</span>.<span class="constructor">S</span>.<span class="constructor">S</span>.v&nbsp;<span class="constructor">React</span>.signal<br>
@@ -350,7 +350,7 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
@@ -392,7 +392,7 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
@@ -435,7 +435,7 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
@@ -478,7 +478,7 @@
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fmap&nbsp;:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;option)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;when_&nbsp;:&nbsp;bool&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>a&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;v&nbsp;signal<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;dismiss&nbsp;:&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;accum&nbsp;:&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">val</span>&nbsp;fold&nbsp;:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v)&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>b&nbsp;event&nbsp;<span class="keywordsign">-&gt;</span>&nbsp;<span class="keywordsign">'</span>a&nbsp;v&nbsp;signal<br>
diff --git a/myocamlbuild.ml b/myocamlbuild.ml
index 14ca905..923cd59 100644
--- a/myocamlbuild.ml
+++ b/myocamlbuild.ml
@@ -1,39 +1,39 @@
(* OASIS_START *)
-(* DO NOT EDIT (digest: 57de37f6bdbc2dcfe6dc0949e05cd452) *)
+(* DO NOT EDIT (digest: 283ec2005876064ba21c41d9e688a027) *)
module OASISGettext = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISGettext.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISGettext.ml"
+
let ns_ str =
str
-
+
let s_ str =
str
-
+
let f_ (str : ('a, 'b, 'c, 'd) format4) =
str
-
+
let fn_ fmt1 fmt2 n =
if n = 1 then
fmt1^^""
else
fmt2^^""
-
+
let init =
[]
-
+
end
module OASISExpr = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISExpr.ml"
-
-
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISExpr.ml"
+
+
+
open OASISGettext
-
+
type test = string
-
+
type flag = string
-
+
type t =
| EBool of bool
| ENot of t
@@ -42,31 +42,31 @@ module OASISExpr = struct
| EFlag of flag
| ETest of test * string
-
+
type 'a choices = (t * 'a) list
-
+
let eval var_get t =
let rec eval' =
function
| EBool b ->
b
-
+
| ENot e ->
not (eval' e)
-
+
| EAnd (e1, e2) ->
(eval' e1) && (eval' e2)
-
+
| EOr (e1, e2) ->
(eval' e1) || (eval' e2)
-
+
| EFlag nm ->
let v =
var_get nm
in
assert(v = "true" || v = "false");
(v = "true")
-
+
| ETest (nm, vl) ->
let v =
var_get nm
@@ -74,7 +74,7 @@ module OASISExpr = struct
(v = vl)
in
eval' t
-
+
let choose ?printer ?name var_get lst =
let rec choose_aux =
function
@@ -110,22 +110,23 @@ module OASISExpr = struct
str_lst)
in
choose_aux (List.rev lst)
-
+
end
+# 117 "myocamlbuild.ml"
module BaseEnvLight = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseEnvLight.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/base/BaseEnvLight.ml"
+
module MapString = Map.Make(String)
-
+
type t = string MapString.t
-
+
let default_filename =
Filename.concat
(Sys.getcwd ())
"setup.data"
-
+
let load ?(allow_empty=false) ?(filename=default_filename) () =
if Sys.file_exists filename then
begin
@@ -182,7 +183,7 @@ module BaseEnvLight = struct
"Unable to load environment, the file '%s' doesn't exist."
filename)
end
-
+
let var_get name env =
let rec var_expand str =
let buff =
@@ -203,7 +204,7 @@ module BaseEnvLight = struct
Buffer.contents buff
in
var_expand (MapString.find name env)
-
+
let var_choose lst env =
OASISExpr.choose
(fun nm -> var_get nm env)
@@ -211,9 +212,10 @@ module BaseEnvLight = struct
end
+# 215 "myocamlbuild.ml"
module MyOCamlbuildFindlib = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/plugins/ocamlbuild/MyOCamlbuildFindlib.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/plugins/ocamlbuild/MyOCamlbuildFindlib.ml"
+
(** OCamlbuild extension, copied from
* http://brion.inria.fr/gallium/index.php/Using_ocamlfind_with_ocamlbuild
* by N. Pouillard and others
@@ -223,14 +225,14 @@ module MyOCamlbuildFindlib = struct
* Modified by Sylvain Le Gall
*)
open Ocamlbuild_plugin
-
+
(* these functions are not really officially exported *)
let run_and_read =
Ocamlbuild_pack.My_unix.run_and_read
-
+
let blank_sep_strings =
Ocamlbuild_pack.Lexers.blank_sep_strings
-
+
let split s ch =
let x =
ref []
@@ -245,24 +247,24 @@ module MyOCamlbuildFindlib = struct
try
go s
with Not_found -> !x
-
+
let split_nl s = split s '\n'
-
+
let before_space s =
try
String.before s (String.index s ' ')
with Not_found -> s
-
+
(* this lists all supported packages *)
let find_packages () =
List.map before_space (split_nl & run_and_read "ocamlfind list")
-
+
(* this is supposed to list available syntaxes, but I don't know how to do it. *)
let find_syntaxes () = ["camlp4o"; "camlp4r"]
-
+
(* ocamlfind command *)
let ocamlfind x = S[A"ocamlfind"; x]
-
+
let dispatch =
function
| Before_options ->
@@ -292,7 +294,7 @@ module MyOCamlbuildFindlib = struct
flag ["ocaml"; "infer_interface"; "pkg_"^pkg] & S[A"-package"; A pkg];
end
(find_packages ());
-
+
(* Like -package but for extensions syntax. Morover -syntax is useless
* when linking. *)
List.iter begin fun syntax ->
@@ -301,7 +303,7 @@ module MyOCamlbuildFindlib = struct
flag ["ocaml"; "doc"; "syntax_"^syntax] & S[A"-syntax"; A syntax];
flag ["ocaml"; "infer_interface"; "syntax_"^syntax] & S[A"-syntax"; A syntax];
end (find_syntaxes ());
-
+
(* The default "thread" tag is not compatible with ocamlfind.
* Indeed, the default rules add the "threads.cma" or "threads.cmxa"
* options when using this tag. When using the "-linkpkg" option with
@@ -314,47 +316,58 @@ module MyOCamlbuildFindlib = struct
flag ["ocaml"; "pkg_threads"; "doc"] (S[A "-I"; A "+threads"]);
flag ["ocaml"; "pkg_threads"; "link"] (S[A "-thread"]);
flag ["ocaml"; "pkg_threads"; "infer_interface"] (S[A "-thread"])
-
+
| _ ->
()
-
+
end
module MyOCamlbuildBase = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/plugins/ocamlbuild/MyOCamlbuildBase.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/plugins/ocamlbuild/MyOCamlbuildBase.ml"
+
(** Base functions for writing myocamlbuild.ml
@author Sylvain Le Gall
*)
-
-
-
+
+
+
open Ocamlbuild_plugin
-
+ module OC = Ocamlbuild_pack.Ocaml_compiler
+
type dir = string
type file = string
type name = string
type tag = string
-
-# 55 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/plugins/ocamlbuild/MyOCamlbuildBase.ml"
-
+
+# 56 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/plugins/ocamlbuild/MyOCamlbuildBase.ml"
+
type t =
{
lib_ocaml: (name * dir list) list;
lib_c: (name * dir * file list) list;
flags: (tag list * (spec OASISExpr.choices)) list;
+ (* Replace the 'dir: include' from _tags by a precise interdepends in
+ * directory.
+ *)
+ includes: (dir * dir list) list;
}
-
+
let env_filename =
Pathname.basename
BaseEnvLight.default_filename
-
+
let dispatch_combine lst =
fun e ->
List.iter
(fun dispatch -> dispatch e)
lst
-
+
+ let tag_libstubs nm =
+ "use_lib"^nm^"_stubs"
+
+ let nm_libstubs nm =
+ nm^"_stubs"
+
let dispatch t e =
let env =
BaseEnvLight.load
@@ -381,56 +394,64 @@ module MyOCamlbuildBase = struct
Options.ext_lib, "ext_lib";
Options.ext_dll, "ext_dll";
]
-
+
| After_rules ->
(* Declare OCaml libraries *)
List.iter
(function
- | lib, [] ->
- ocaml_lib lib;
- | lib, dir :: tl ->
- ocaml_lib ~dir:dir lib;
+ | nm, [] ->
+ ocaml_lib nm
+ | nm, dir :: tl ->
+ ocaml_lib ~dir:dir (dir^"/"^nm);
List.iter
(fun dir ->
- flag
- ["ocaml"; "use_"^lib; "compile"]
- (S[A"-I"; P dir]))
+ List.iter
+ (fun str ->
+ flag ["ocaml"; "use_"^nm; str] (S[A"-I"; P dir]))
+ ["compile"; "infer_interface"; "doc"])
tl)
t.lib_ocaml;
-
+
+ (* Declare directories dependencies, replace "include" in _tags. *)
+ List.iter
+ (fun (dir, include_dirs) ->
+ Pathname.define_context dir include_dirs)
+ t.includes;
+
(* Declare C libraries *)
List.iter
(fun (lib, dir, headers) ->
(* Handle C part of library *)
- flag ["link"; "library"; "ocaml"; "byte"; "use_lib"^lib]
- (S[A"-dllib"; A("-l"^lib); A"-cclib"; A("-l"^lib)]);
-
- flag ["link"; "library"; "ocaml"; "native"; "use_lib"^lib]
- (S[A"-cclib"; A("-l"^lib)]);
+ flag ["link"; "library"; "ocaml"; "byte"; tag_libstubs lib]
+ (S[A"-dllib"; A("-l"^(nm_libstubs lib)); A"-cclib";
+ A("-l"^(nm_libstubs lib))]);
+
+ flag ["link"; "library"; "ocaml"; "native"; tag_libstubs lib]
+ (S[A"-cclib"; A("-l"^(nm_libstubs lib))]);
- flag ["link"; "program"; "ocaml"; "byte"; "use_lib"^lib]
- (S[A"-dllib"; A("dll"^lib)]);
-
+ flag ["link"; "program"; "ocaml"; "byte"; tag_libstubs lib]
+ (S[A"-dllib"; A("dll"^(nm_libstubs lib))]);
+
(* When ocaml link something that use the C library, then one
need that file to be up to date.
*)
- dep ["link"; "ocaml"; "program"; "use_lib"^lib]
- [dir/"lib"^lib^"."^(!Options.ext_lib)];
-
- dep ["compile"; "ocaml"; "program"; "use_lib"^lib]
- [dir/"lib"^lib^"."^(!Options.ext_lib)];
-
+ dep ["link"; "ocaml"; "program"; tag_libstubs lib]
+ [dir/"lib"^(nm_libstubs lib)^"."^(!Options.ext_lib)];
+
+ dep ["compile"; "ocaml"; "program"; tag_libstubs lib]
+ [dir/"lib"^(nm_libstubs lib)^"."^(!Options.ext_lib)];
+
(* TODO: be more specific about what depends on headers *)
(* Depends on .h files *)
dep ["compile"; "c"]
headers;
-
+
(* Setup search path for lib *)
flag ["link"; "ocaml"; "use_"^lib]
(S[A"-I"; P(dir)]);
)
t.lib_c;
-
+
(* Add flags *)
List.iter
(fun (tags, cond_specs) ->
@@ -441,28 +462,30 @@ module MyOCamlbuildBase = struct
t.flags
| _ ->
()
-
+
let dispatch_default t =
dispatch_combine
[
dispatch t;
MyOCamlbuildFindlib.dispatch;
]
-
+
end
+# 476 "myocamlbuild.ml"
open Ocamlbuild_plugin;;
let package_default =
{
- MyOCamlbuildBase.lib_ocaml = [("src/react", ["src"])];
+ MyOCamlbuildBase.lib_ocaml = [("react", ["src"])];
lib_c = [];
flags = [];
+ includes = [("test", ["src"])];
}
;;
let dispatch_default = MyOCamlbuildBase.dispatch_default package_default;;
-# 467 "myocamlbuild.ml"
+# 490 "myocamlbuild.ml"
(* OASIS_STOP *)
Ocamlbuild_plugin.dispatch dispatch_default;;
diff --git a/setup.ml b/setup.ml
index 1bb1391..af1cf50 100644
--- a/setup.ml
+++ b/setup.ml
@@ -1,55 +1,56 @@
-(* setup.ml generated for the first time by OASIS v0.3.0~rc2 *)
+(* setup.ml generated for the first time by OASIS v0.3.0 *)
(* OASIS_START *)
-(* DO NOT EDIT (digest: c0f73af3f29a5a9c4570b553c653ef5e) *)
+(* DO NOT EDIT (digest: 80aa4c9fa91e67754a0644227176230f) *)
(*
- Regenerated by OASIS v0.3.0~rc2
+ Regenerated by OASIS v0.3.0
Visit http://oasis.forge.ocamlcore.org for more information and
documentation about functions used in this file.
*)
module OASISGettext = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISGettext.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISGettext.ml"
+
let ns_ str =
str
-
+
let s_ str =
str
-
+
let f_ (str : ('a, 'b, 'c, 'd) format4) =
str
-
+
let fn_ fmt1 fmt2 n =
if n = 1 then
fmt1^^""
else
fmt2^^""
-
+
let init =
[]
-
+
end
module OASISContext = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISContext.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISContext.ml"
+
open OASISGettext
-
+
type level =
[ `Debug
| `Info
| `Warning
| `Error]
-
+
type t =
{
- verbose: bool;
+ quiet: bool;
+ info: bool;
debug: bool;
ignore_plugins: bool;
ignore_unknown_fields: bool;
printf: level -> string -> unit;
}
-
+
let printf lvl str =
let beg =
match lvl with
@@ -59,117 +60,203 @@ module OASISContext = struct
| `Debug -> s_ "D: "
in
prerr_endline (beg^str)
-
+
let default =
ref
{
- verbose = true;
+ quiet = false;
+ info = false;
debug = false;
ignore_plugins = false;
ignore_unknown_fields = false;
printf = printf;
}
-
+
let quiet =
- {!default with
- verbose = false;
- debug = false;
- }
-
-
+ {!default with quiet = true}
+
+
let args () =
["-quiet",
- Arg.Unit (fun () -> default := {!default with verbose = false}),
+ Arg.Unit (fun () -> default := {!default with quiet = true}),
(s_ " Run quietly");
-
+
+ "-info",
+ Arg.Unit (fun () -> default := {!default with info = true}),
+ (s_ " Display information message");
+
+
"-debug",
Arg.Unit (fun () -> default := {!default with debug = true}),
(s_ " Output debug message")]
end
+module OASISString = struct
+# 1 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISString.ml"
+
+
+
+ (** Various string utilities.
+
+ Mostly inspired by extlib and batteries ExtString and BatString libraries.
+
+ @author Sylvain Le Gall
+ *)
+
+ let nsplitf str f =
+ if str = "" then
+ []
+ else
+ let buf = Buffer.create 13 in
+ let lst = ref [] in
+ let push () =
+ lst := Buffer.contents buf :: !lst;
+ Buffer.clear buf
+ in
+ let str_len = String.length str in
+ for i = 0 to str_len - 1 do
+ if f str.[i] then
+ push ()
+ else
+ Buffer.add_char buf str.[i]
+ done;
+ push ();
+ List.rev !lst
+
+ (** [nsplit c s] Split the string [s] at char [c]. It doesn't include the
+ separator.
+ *)
+ let nsplit str c =
+ nsplitf str ((=) c)
+
+ let find ~what ?(offset=0) str =
+ let what_idx = ref 0 in
+ let str_idx = ref offset in
+ while !str_idx < String.length str &&
+ !what_idx < String.length what do
+ if str.[!str_idx] = what.[!what_idx] then
+ incr what_idx
+ else
+ what_idx := 0;
+ incr str_idx
+ done;
+ if !what_idx <> String.length what then
+ raise Not_found
+ else
+ !str_idx - !what_idx
+
+ let sub_start str len =
+ let str_len = String.length str in
+ if len >= str_len then
+ ""
+ else
+ String.sub str len (str_len - len)
+
+ let sub_end ?(offset=0) str len =
+ let str_len = String.length str in
+ if len >= str_len then
+ ""
+ else
+ String.sub str 0 (str_len - len)
+
+ let starts_with ~what ?(offset=0) str =
+ let what_idx = ref 0 in
+ let str_idx = ref offset in
+ let ok = ref true in
+ while !ok &&
+ !str_idx < String.length str &&
+ !what_idx < String.length what do
+ if str.[!str_idx] = what.[!what_idx] then
+ incr what_idx
+ else
+ ok := false;
+ incr str_idx
+ done;
+ if !what_idx = String.length what then
+ true
+ else
+ false
+
+ let strip_starts_with ~what str =
+ if starts_with ~what str then
+ sub_start str (String.length what)
+ else
+ raise Not_found
+
+ let ends_with ~what ?(offset=0) str =
+ let what_idx = ref ((String.length what) - 1) in
+ let str_idx = ref ((String.length str) - 1) in
+ let ok = ref true in
+ while !ok &&
+ offset <= !str_idx &&
+ 0 <= !what_idx do
+ if str.[!str_idx] = what.[!what_idx] then
+ decr what_idx
+ else
+ ok := false;
+ decr str_idx
+ done;
+ if !what_idx = -1 then
+ true
+ else
+ false
+
+ let strip_ends_with ~what str =
+ if ends_with ~what str then
+ sub_end str (String.length what)
+ else
+ raise Not_found
+
+ let replace_chars f s =
+ let buf = String.make (String.length s) 'X' in
+ for i = 0 to String.length s - 1 do
+ buf.[i] <- f s.[i]
+ done;
+ buf
+
+end
+
module OASISUtils = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISUtils.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISUtils.ml"
+
open OASISGettext
-
+
module MapString = Map.Make(String)
-
+
let map_string_of_assoc assoc =
List.fold_left
(fun acc (k, v) -> MapString.add k v acc)
MapString.empty
assoc
-
+
module SetString = Set.Make(String)
-
+
let set_string_add_list st lst =
List.fold_left
(fun acc e -> SetString.add e acc)
st
lst
-
+
let set_string_of_list =
set_string_add_list
SetString.empty
-
-
+
+
let compare_csl s1 s2 =
String.compare (String.lowercase s1) (String.lowercase s2)
-
+
module HashStringCsl =
Hashtbl.Make
(struct
type t = string
-
+
let equal s1 s2 =
(String.lowercase s1) = (String.lowercase s2)
-
+
let hash s =
Hashtbl.hash (String.lowercase s)
end)
-
- let split sep str =
- let str_len =
- String.length str
- in
- let rec split_aux acc pos =
- if pos < str_len then
- (
- let pos_sep =
- try
- String.index_from str pos sep
- with Not_found ->
- str_len
- in
- let part =
- String.sub str pos (pos_sep - pos)
- in
- let acc =
- part :: acc
- in
- if pos_sep >= str_len then
- (
- (* Nothing more in the string *)
- List.rev acc
- )
- else if pos_sep = (str_len - 1) then
- (
- (* String end with a separator *)
- List.rev ("" :: acc)
- )
- else
- (
- split_aux acc (pos_sep + 1)
- )
- )
- else
- (
- List.rev acc
- )
- in
- split_aux [] 0
-
-
+
let varname_of_string ?(hyphen='_') s =
if String.length s = 0 then
begin
@@ -177,68 +264,64 @@ module OASISUtils = struct
end
else
begin
- let buff =
- Buffer.create (String.length s)
- in
- (* Start with a _ if digit *)
- if '0' <= s.[0] && s.[0] <= '9' then
- Buffer.add_char buff hyphen;
-
- String.iter
+ let buf =
+ OASISString.replace_chars
(fun c ->
if ('a' <= c && c <= 'z')
||
('A' <= c && c <= 'Z')
||
('0' <= c && c <= '9') then
- Buffer.add_char buff c
+ c
else
- Buffer.add_char buff hyphen)
+ hyphen)
s;
-
- String.lowercase (Buffer.contents buff)
+ in
+ let buf =
+ (* Start with a _ if digit *)
+ if '0' <= s.[0] && s.[0] <= '9' then
+ "_"^buf
+ else
+ buf
+ in
+ String.lowercase buf
end
-
+
let varname_concat ?(hyphen='_') p s =
+ let what = String.make 1 hyphen in
let p =
- let p_len =
- String.length p
- in
- if p_len > 0 && p.[p_len - 1] = hyphen then
- String.sub p 0 (p_len - 1)
- else
- p
+ try
+ OASISString.strip_ends_with ~what p
+ with Not_found ->
+ p
in
let s =
- let s_len =
- String.length s
- in
- if s_len > 0 && s.[0] = hyphen then
- String.sub s 1 (s_len - 1)
- else
- s
+ try
+ OASISString.strip_starts_with ~what s
+ with Not_found ->
+ s
in
- Printf.sprintf "%s%c%s" p hyphen s
-
-
+ p^what^s
+
+
let is_varname str =
str = varname_of_string str
-
+
let failwithf fmt = Printf.ksprintf failwith fmt
-
+
end
module PropList = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/PropList.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/PropList.ml"
+
open OASISGettext
-
+
type name = string
-
+
exception Not_set of name * string option
exception No_printer of name
exception Unknown_field of name * name
-
+
let () =
Printexc.register_printer
(function
@@ -256,25 +339,25 @@ module PropList = struct
(Printf.sprintf (f_ "Field %s is not defined in schema %s") nm schm)
| _ ->
None)
-
+
module Data =
struct
-
+
type t =
(name, unit -> unit) Hashtbl.t
-
+
let create () =
Hashtbl.create 13
-
+
let clear t =
Hashtbl.clear t
-
-# 71 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/PropList.ml"
+
+# 71 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/PropList.ml"
end
-
+
module Schema =
struct
-
+
type ('ctxt, 'extra) value =
{
get: Data.t -> string;
@@ -282,7 +365,7 @@ module PropList = struct
help: (unit -> string) option;
extra: 'extra;
}
-
+
type ('ctxt, 'extra) t =
{
name: name;
@@ -290,7 +373,7 @@ module PropList = struct
order: name Queue.t;
name_norm: string -> string;
}
-
+
let create ?(case_insensitive=false) nm =
{
name = nm;
@@ -302,12 +385,12 @@ module PropList = struct
else
fun s -> s);
}
-
+
let add t nm set get extra help =
let key =
t.name_norm nm
in
-
+
if Hashtbl.mem t.fields key then
failwith
(Printf.sprintf
@@ -323,25 +406,25 @@ module PropList = struct
extra = extra;
};
Queue.add nm t.order
-
+
let mem t nm =
Hashtbl.mem t.fields nm
-
+
let find t nm =
try
Hashtbl.find t.fields (t.name_norm nm)
with Not_found ->
raise (Unknown_field (nm, t.name))
-
+
let get t data nm =
(find t nm).get data
-
+
let set t data nm ?context x =
(find t nm).set
data
?context
x
-
+
let fold f acc t =
Queue.fold
(fun acc k ->
@@ -351,20 +434,20 @@ module PropList = struct
f acc k v.extra v.help)
acc
t.order
-
+
let iter f t =
fold
(fun () -> f)
()
t
-
+
let name t =
t.name
end
-
+
module Field =
struct
-
+
type ('ctxt, 'value, 'extra) t =
{
set: Data.t -> ?context:'ctxt -> 'value -> unit;
@@ -374,33 +457,33 @@ module PropList = struct
help: (unit -> string) option;
extra: 'extra;
}
-
+
let new_id =
let last_id =
ref 0
in
fun () -> incr last_id; !last_id
-
+
let create ?schema ?name ?parse ?print ?default ?update ?help extra =
(* Default value container *)
let v =
ref None
in
-
+
(* If name is not given, create unique one *)
let nm =
match name with
| Some s -> s
| None -> Printf.sprintf "_anon_%d" (new_id ())
in
-
+
(* Last chance to get a value: the default *)
let default () =
match default with
| Some d -> d
| None -> raise (Not_set (nm, Some (s_ "no default value")))
in
-
+
(* Get data *)
let get data =
(* Get value *)
@@ -412,7 +495,7 @@ module PropList = struct
with Not_found ->
default ()
in
-
+
(* Set data *)
let set data ?context x =
let x =
@@ -432,7 +515,7 @@ module PropList = struct
nm
(fun () -> v := Some x)
in
-
+
(* Parse string value, if possible *)
let parse =
match parse with
@@ -446,12 +529,12 @@ module PropList = struct
nm
s)
in
-
+
(* Set data, from string *)
let sets data ?context s =
set ?context data (parse ?context s)
in
-
+
(* Output value as string, if possible *)
let print =
match print with
@@ -460,12 +543,12 @@ module PropList = struct
| None ->
fun _ -> raise (No_printer nm)
in
-
+
(* Get data, as a string *)
let gets data =
print (get data)
in
-
+
begin
match schema with
| Some t ->
@@ -473,7 +556,7 @@ module PropList = struct
| None ->
()
end;
-
+
{
set = set;
get = get;
@@ -482,45 +565,49 @@ module PropList = struct
help = help;
extra = extra;
}
-
+
let fset data t ?context x =
t.set data ?context x
-
+
let fget data t =
t.get data
-
+
let fsets data t ?context s =
t.sets data ?context s
-
+
let fgets data t =
t.gets data
-
+
end
-
+
module FieldRO =
struct
-
+
let create ?schema ?name ?parse ?print ?default ?update ?help extra =
let fld =
Field.create ?schema ?name ?parse ?print ?default ?update ?help extra
in
fun data -> Field.fget data fld
-
+
end
end
module OASISMessage = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISMessage.ml"
-
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISMessage.ml"
+
+
open OASISGettext
open OASISContext
-
+
let generic_message ~ctxt lvl fmt =
let cond =
- match lvl with
- | `Debug -> ctxt.debug
- | _ -> ctxt.verbose
+ if ctxt.quiet then
+ false
+ else
+ match lvl with
+ | `Debug -> ctxt.debug
+ | `Info -> ctxt.info
+ | _ -> true
in
Printf.ksprintf
(fun str ->
@@ -529,32 +616,32 @@ module OASISMessage = struct
ctxt.printf lvl str
end)
fmt
-
+
let debug ~ctxt fmt =
generic_message ~ctxt `Debug fmt
-
+
let info ~ctxt fmt =
generic_message ~ctxt `Info fmt
-
+
let warning ~ctxt fmt =
generic_message ~ctxt `Warning fmt
-
+
let error ~ctxt fmt =
generic_message ~ctxt `Error fmt
-
+
end
module OASISVersion = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISVersion.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISVersion.ml"
+
open OASISGettext
-
-
-
+
+
+
type s = string
-
+
type t = string
-
+
type comparator =
| VGreater of t
| VGreaterEqual of t
@@ -564,19 +651,19 @@ module OASISVersion = struct
| VOr of comparator * comparator
| VAnd of comparator * comparator
-
+
(* Range of allowed characters *)
let is_digit c =
'0' <= c && c <= '9'
-
+
let is_alpha c =
('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')
-
+
let is_special =
function
| '.' | '+' | '-' | '~' -> true
| _ -> false
-
+
let rec version_compare v1 v2 =
if v1 <> "" || v2 <> "" then
begin
@@ -590,12 +677,12 @@ module OASISVersion = struct
else if is_alpha c then Char.code c
else (Char.code c) + 256
in
-
+
let len1 = String.length v1 in
let len2 = String.length v2 in
-
+
let p = ref 0 in
-
+
(** Compare ascii part *)
let compare_vascii () =
let cmp = ref 0 in
@@ -612,7 +699,7 @@ module OASISVersion = struct
else
!cmp
in
-
+
(** Compare digit part *)
let compare_digit () =
let extract_int v p =
@@ -634,7 +721,7 @@ module OASISVersion = struct
let i2, tl2 = extract_int v2 (ref !p) in
i1 - i2, tl1, tl2
in
-
+
match compare_vascii () with
| 0 ->
begin
@@ -656,24 +743,12 @@ module OASISVersion = struct
begin
0
end
-
-
- let version_of_string str =
- String.iter
- (fun c ->
- if is_alpha c || is_digit c || is_special c then
- ()
- else
- failwith
- (Printf.sprintf
- (f_ "Char %C is not allowed in version '%s'")
- c str))
- str;
- str
-
- let string_of_version t =
- t
-
+
+
+ let version_of_string str = str
+
+ let string_of_version t = t
+
let chop t =
try
let pos =
@@ -682,7 +757,7 @@ module OASISVersion = struct
String.sub t 0 pos
with Not_found ->
t
-
+
let rec comparator_apply v op =
match op with
| VGreater cv ->
@@ -699,7 +774,7 @@ module OASISVersion = struct
(comparator_apply v op1) || (comparator_apply v op2)
| VAnd (op1, op2) ->
(comparator_apply v op1) && (comparator_apply v op2)
-
+
let rec string_of_comparator =
function
| VGreater v -> "> "^(string_of_version v)
@@ -711,7 +786,7 @@ module OASISVersion = struct
(string_of_comparator c1)^" || "^(string_of_comparator c2)
| VAnd (c1, c2) ->
(string_of_comparator c1)^" && "^(string_of_comparator c2)
-
+
let rec varname_of_comparator =
let concat p v =
OASISUtils.varname_concat
@@ -729,53 +804,63 @@ module OASISVersion = struct
(varname_of_comparator c1)^"_or_"^(varname_of_comparator c2)
| VAnd (c1, c2) ->
(varname_of_comparator c1)^"_and_"^(varname_of_comparator c2)
-
+
+ let version_0_3_or_after t =
+ comparator_apply t (VGreaterEqual (string_of_version "0.3"))
+
end
module OASISLicense = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISLicense.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISLicense.ml"
+
(** License for _oasis fields
@author Sylvain Le Gall
*)
-
-
-
+
+
+
type license = string
-
+
type license_exception = string
-
+
type license_version =
| Version of OASISVersion.t
| VersionOrLater of OASISVersion.t
| NoVersion
-
+
+ type license_dep_5_unit =
+ {
+ license: license;
+ excption: license_exception option;
+ version: license_version;
+ }
+
+
type license_dep_5 =
- {
- license: license;
- exceptions: license_exception list;
- version: license_version;
- }
-
+ | DEP5Unit of license_dep_5_unit
+ | DEP5Or of license_dep_5 list
+ | DEP5And of license_dep_5 list
+
+
type t =
| DEP5License of license_dep_5
| OtherLicense of string (* URL *)
-
+
end
module OASISExpr = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISExpr.ml"
-
-
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISExpr.ml"
+
+
+
open OASISGettext
-
+
type test = string
-
+
type flag = string
-
+
type t =
| EBool of bool
| ENot of t
@@ -784,31 +869,31 @@ module OASISExpr = struct
| EFlag of flag
| ETest of test * string
-
+
type 'a choices = (t * 'a) list
-
+
let eval var_get t =
let rec eval' =
function
| EBool b ->
b
-
+
| ENot e ->
not (eval' e)
-
+
| EAnd (e1, e2) ->
(eval' e1) && (eval' e2)
-
+
| EOr (e1, e2) ->
(eval' e1) || (eval' e2)
-
+
| EFlag nm ->
let v =
var_get nm
in
assert(v = "true" || v = "false");
(v = "true")
-
+
| ETest (nm, vl) ->
let v =
var_get nm
@@ -816,7 +901,7 @@ module OASISExpr = struct
(v = vl)
in
eval' t
-
+
let choose ?printer ?name var_get lst =
let rec choose_aux =
function
@@ -852,15 +937,15 @@ module OASISExpr = struct
str_lst)
in
choose_aux (List.rev lst)
-
+
end
module OASISTypes = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISTypes.ml"
-
-
-
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISTypes.ml"
+
+
+
+
type name = string
type package_name = string
type url = string
@@ -872,26 +957,26 @@ module OASISTypes = struct
type arg = string
type args = string list
type command_line = (prog * arg list)
-
+
type findlib_name = string
type findlib_full = string
-
+
type compiled_object =
| Byte
| Native
| Best
-
+
type dependency =
| FindlibPackage of findlib_full * OASISVersion.comparator option
| InternalLibrary of name
-
+
type tool =
| ExternalTool of name
| InternalExecutable of name
-
+
type vcs =
| Darcs
| Git
@@ -903,7 +988,7 @@ module OASISTypes = struct
| Monotone
| OtherVCS of url
-
+
type plugin_kind =
[ `Configure
| `Build
@@ -912,7 +997,7 @@ module OASISTypes = struct
| `Install
| `Extra
]
-
+
type plugin_data_purpose =
[ `Configure
| `Build
@@ -926,24 +1011,24 @@ module OASISTypes = struct
| `Extra
| `Other of string
]
-
+
type 'a plugin = 'a * name * OASISVersion.t option
-
+
type all_plugin = plugin_kind plugin
-
+
type plugin_data = (all_plugin * plugin_data_purpose * (unit -> unit)) list
-
-# 102 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISTypes.ml"
-
+
+# 102 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISTypes.ml"
+
type 'a conditional = 'a OASISExpr.choices
-
+
type custom =
{
pre_command: (command_line option) conditional;
post_command: (command_line option) conditional;
}
-
+
type common_section =
{
cs_name: name;
@@ -951,7 +1036,7 @@ module OASISTypes = struct
cs_plugin_data: plugin_data;
}
-
+
type build_section =
{
bs_build: bool conditional;
@@ -970,7 +1055,7 @@ module OASISTypes = struct
bs_nativeopt: args conditional;
}
-
+
type library =
{
lib_modules: string list;
@@ -980,19 +1065,19 @@ module OASISTypes = struct
lib_findlib_name: findlib_name option;
lib_findlib_containers: findlib_name list;
}
-
+
type executable =
{
exec_custom: bool;
exec_main_is: unix_filename;
}
-
+
type flag =
{
flag_description: string option;
flag_default: bool conditional;
}
-
+
type source_repository =
{
src_repo_type: vcs;
@@ -1003,7 +1088,7 @@ module OASISTypes = struct
src_repo_tag: string option;
src_repo_subdir: unix_filename option;
}
-
+
type test =
{
test_type: [`Test] plugin;
@@ -1013,7 +1098,7 @@ module OASISTypes = struct
test_run: bool conditional;
test_tools: tool list;
}
-
+
type doc_format =
| HTML of unix_filename
| DocText
@@ -1023,7 +1108,7 @@ module OASISTypes = struct
| DVI
| OtherDoc
-
+
type doc =
{
doc_type: [`Doc] plugin;
@@ -1038,7 +1123,7 @@ module OASISTypes = struct
doc_data_files: (unix_filename * unix_filename option) list;
doc_build_tools: tool list;
}
-
+
type section =
| Library of common_section * build_section * library
| Executable of common_section * build_section * executable
@@ -1047,10 +1132,10 @@ module OASISTypes = struct
| Test of common_section * test
| Doc of common_section * doc
-
+
type section_kind =
[ `Library | `Executable | `Flag | `SrcRepo | `Test | `Doc ]
-
+
type package =
{
oasis_version: OASISVersion.t;
@@ -1067,50 +1152,54 @@ module OASISTypes = struct
synopsis: string;
description: string option;
categories: url list;
-
+
conf_type: [`Configure] plugin;
conf_custom: custom;
-
+
build_type: [`Build] plugin;
build_custom: custom;
-
+
install_type: [`Install] plugin;
install_custom: custom;
uninstall_custom: custom;
-
+
clean_custom: custom;
distclean_custom: custom;
-
+
files_ab: unix_filename list;
sections: section list;
plugins: [`Extra] plugin list;
schema_data: PropList.Data.t;
plugin_data: plugin_data;
}
-
+
end
module OASISUnixPath = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISUnixPath.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISUnixPath.ml"
+
type unix_filename = string
type unix_dirname = string
-
+
type host_filename = string
type host_dirname = string
-
+
let current_dir_name = "."
-
+
let parent_dir_name = ".."
-
+
+ let is_current_dir fn =
+ fn = current_dir_name || fn = ""
+
let concat f1 f2 =
- if f1 = current_dir_name then
+ if is_current_dir f1 then
f2
- else if f2 = current_dir_name then
- f1
else
- f1^"/"^f2
-
+ let f1' =
+ try OASISString.strip_ends_with ~what:"/" f1 with Not_found -> f1
+ in
+ f1'^"/"^f2
+
let make =
function
| hd :: tl ->
@@ -1120,13 +1209,13 @@ module OASISUnixPath = struct
tl
| [] ->
invalid_arg "OASISUnixPath.make"
-
+
let dirname f =
try
String.sub f 0 (String.rindex f '/')
with Not_found ->
current_dir_name
-
+
let basename f =
try
let pos_start =
@@ -1135,7 +1224,7 @@ module OASISUnixPath = struct
String.sub f pos_start ((String.length f) - pos_start)
with Not_found ->
f
-
+
let chop_extension f =
try
let last_dot =
@@ -1154,26 +1243,60 @@ module OASISUnixPath = struct
f
with Not_found ->
sub
-
+
with Not_found ->
f
-
+
let capitalize_file f =
let dir = dirname f in
let base = basename f in
concat dir (String.capitalize base)
-
+
let uncapitalize_file f =
let dir = dirname f in
let base = basename f in
concat dir (String.uncapitalize base)
+
+end
+
+module OASISHostPath = struct
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISHostPath.ml"
+
+
+ open Filename
+
+ module Unix = OASISUnixPath
+
+ let make =
+ function
+ | [] ->
+ invalid_arg "OASISHostPath.make"
+ | hd :: tl ->
+ List.fold_left Filename.concat hd tl
+
+ let of_unix ufn =
+ if Sys.os_type = "Unix" then
+ ufn
+ else
+ make
+ (List.map
+ (fun p ->
+ if p = Unix.current_dir_name then
+ current_dir_name
+ else if p = Unix.parent_dir_name then
+ parent_dir_name
+ else
+ p)
+ (OASISString.nsplit ufn '/'))
+
+
end
module OASISSection = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISSection.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISSection.ml"
+
open OASISTypes
-
+
let section_kind_common =
function
| Library (cs, _, _) ->
@@ -1188,10 +1311,10 @@ module OASISSection = struct
`Test, cs
| Doc (cs, _) ->
`Doc, cs
-
+
let section_common sct =
snd (section_kind_common sct)
-
+
let section_common_set cs =
function
| Library (_, bs, lib) -> Library (cs, bs, lib)
@@ -1200,7 +1323,7 @@ module OASISSection = struct
| SrcRepo (_, src_repo) -> SrcRepo (cs, src_repo)
| Test (_, tst) -> Test (cs, tst)
| Doc (_, doc) -> Doc (cs, doc)
-
+
(** Key used to identify section
*)
let section_id sct =
@@ -1208,7 +1331,7 @@ module OASISSection = struct
section_kind_common sct
in
k, cs.cs_name
-
+
let string_of_section sct =
let k, nm =
section_id sct
@@ -1221,19 +1344,43 @@ module OASISSection = struct
| `Test -> "test"
| `Doc -> "doc")
^" "^nm
-
+
+ let section_find id scts =
+ List.find
+ (fun sct -> id = section_id sct)
+ scts
+
+ module CSection =
+ struct
+ type t = section
+
+ let id = section_id
+
+ let compare t1 t2 =
+ compare (id t1) (id t2)
+
+ let equal t1 t2 =
+ (id t1) = (id t2)
+
+ let hash t =
+ Hashtbl.hash (id t)
+ end
+
+ module MapSection = Map.Make(CSection)
+ module SetSection = Set.Make(CSection)
+
end
module OASISBuildSection = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISBuildSection.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISBuildSection.ml"
+
end
module OASISExecutable = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISExecutable.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISExecutable.ml"
+
open OASISTypes
-
+
let unix_exec_is (cs, bs, exec) is_native ext_dll suffix_program =
let dir =
OASISUnixPath.concat
@@ -1246,29 +1393,43 @@ module OASISExecutable = struct
| Best -> is_native ()
| Byte -> false
in
-
+
OASISUnixPath.concat
dir
(cs.cs_name^(suffix_program ())),
-
+
if not is_native_exec &&
not exec.exec_custom &&
bs.bs_c_sources <> [] then
- Some (dir^"/dll"^cs.cs_name^(ext_dll ()))
+ Some (dir^"/dll"^cs.cs_name^"_stubs"^(ext_dll ()))
else
None
-
+
end
module OASISLibrary = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISLibrary.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISLibrary.ml"
+
open OASISTypes
open OASISUtils
open OASISGettext
-
+ open OASISSection
+
type library_name = name
-
+ type findlib_part_name = name
+ type 'a map_of_findlib_part_name = 'a OASISUtils.MapString.t
+
+ exception InternalLibraryNotFound of library_name
+ exception FindlibPackageNotFound of findlib_name
+
+ type group_t =
+ | Container of findlib_name * group_t list
+ | Package of (findlib_name *
+ common_section *
+ build_section *
+ library *
+ group_t list)
+
(* Look for a module file, considering capitalization or not. *)
let find_module source_file_exists (cs, bs, lib) modul =
let possible_base_fn =
@@ -1307,7 +1468,7 @@ module OASISLibrary = struct
acc)
(`No_sources possible_base_fn)
possible_base_fn
-
+
let source_unix_files ~ctxt (cs, bs, lib) source_file_exists =
List.fold_left
(fun acc modul ->
@@ -1323,10 +1484,16 @@ module OASISLibrary = struct
acc)
[]
(lib.lib_modules @ lib.lib_internal_modules)
-
- let generated_unix_files ~ctxt (cs, bs, lib)
- source_file_exists is_native ext_lib ext_dll =
-
+
+ let generated_unix_files
+ ~ctxt
+ ~is_native
+ ~has_native_dynlink
+ ~ext_lib
+ ~ext_dll
+ ~source_file_exists
+ (cs, bs, lib) =
+
let find_modules lst ext =
let find_module modul =
match find_module source_file_exists (cs, bs, lib) modul with
@@ -1347,7 +1514,7 @@ module OASISLibrary = struct
(find_module nm))
lst
in
-
+
(* The headers that should be compiled along *)
let headers =
if lib.lib_pack then
@@ -1357,14 +1524,14 @@ module OASISLibrary = struct
lib.lib_modules
"cmi"
in
-
+
(* The .cmx that be compiled along *)
let cmxs =
let should_be_built =
(not lib.lib_pack) && (* Do not install .cmx packed submodules *)
match bs.bs_compiled_object with
| Native -> true
- | Best -> is_native ()
+ | Best -> is_native
| Byte -> false
in
if should_be_built then
@@ -1374,11 +1541,11 @@ module OASISLibrary = struct
else
[]
in
-
+
let acc_nopath =
[]
in
-
+
(* Compute what libraries should be built *)
let acc_nopath =
(* Add the packed header file if required *)
@@ -1392,31 +1559,37 @@ module OASISLibrary = struct
add_pack_header ([cs.cs_name^".cma"] :: acc)
in
let native acc =
- add_pack_header ([cs.cs_name^".cmxa"] :: [cs.cs_name^(ext_lib ())] :: acc)
+ let acc =
+ add_pack_header
+ (if has_native_dynlink then
+ [cs.cs_name^".cmxs"] :: acc
+ else acc)
+ in
+ [cs.cs_name^".cmxa"] :: [cs.cs_name^ext_lib] :: acc
in
match bs.bs_compiled_object with
| Native ->
byte (native acc_nopath)
- | Best when is_native () ->
+ | Best when is_native ->
byte (native acc_nopath)
| Byte | Best ->
byte acc_nopath
in
-
+
(* Add C library to be built *)
let acc_nopath =
if bs.bs_c_sources <> [] then
begin
- ["lib"^cs.cs_name^(ext_lib ())]
+ ["lib"^cs.cs_name^"_stubs"^ext_lib]
::
- ["dll"^cs.cs_name^(ext_dll ())]
+ ["dll"^cs.cs_name^"_stubs"^ext_dll]
::
acc_nopath
end
else
acc_nopath
in
-
+
(* All the files generated *)
List.rev_append
(List.rev_map
@@ -1424,248 +1597,561 @@ module OASISLibrary = struct
(OASISUnixPath.concat bs.bs_path))
acc_nopath)
(headers @ cmxs)
-
-
- type group_t =
- | Container of findlib_name * (group_t list)
- | Package of (findlib_name *
- common_section *
- build_section *
- library *
- (group_t list))
-
- let group_libs pkg =
- (** Associate a name with its children *)
- let children =
+
+ type data = common_section * build_section * library
+ type tree =
+ | Node of (data option) * (tree MapString.t)
+ | Leaf of data
+
+ let findlib_mapping pkg =
+ (* Map from library name to either full findlib name or parts + parent. *)
+ let fndlb_parts_of_lib_name =
+ let fndlb_parts cs lib =
+ let name =
+ match lib.lib_findlib_name with
+ | Some nm -> nm
+ | None -> cs.cs_name
+ in
+ let name =
+ String.concat "." (lib.lib_findlib_containers @ [name])
+ in
+ name
+ in
+ List.fold_left
+ (fun mp ->
+ function
+ | Library (cs, _, lib) ->
+ begin
+ let lib_name = cs.cs_name in
+ let fndlb_parts = fndlb_parts cs lib in
+ if MapString.mem lib_name mp then
+ failwithf
+ (f_ "The library name '%s' is used more than once.")
+ lib_name;
+ match lib.lib_findlib_parent with
+ | Some lib_name_parent ->
+ MapString.add
+ lib_name
+ (`Unsolved (lib_name_parent, fndlb_parts))
+ mp
+ | None ->
+ MapString.add
+ lib_name
+ (`Solved fndlb_parts)
+ mp
+ end
+
+ | Executable _ | Test _ | Flag _ | SrcRepo _ | Doc _ ->
+ mp)
+ MapString.empty
+ pkg.sections
+ in
+
+ (* Solve the above graph to be only library name to full findlib name. *)
+ let fndlb_name_of_lib_name =
+ let rec solve visited mp lib_name lib_name_child =
+ if SetString.mem lib_name visited then
+ failwithf
+ (f_ "Library '%s' is involved in a cycle \
+ with regard to findlib naming.")
+ lib_name;
+ let visited = SetString.add lib_name visited in
+ try
+ match MapString.find lib_name mp with
+ | `Solved fndlb_nm ->
+ fndlb_nm, mp
+ | `Unsolved (lib_nm_parent, post_fndlb_nm) ->
+ let pre_fndlb_nm, mp =
+ solve visited mp lib_nm_parent lib_name
+ in
+ let fndlb_nm = pre_fndlb_nm^"."^post_fndlb_nm in
+ fndlb_nm, MapString.add lib_name (`Solved fndlb_nm) mp
+ with Not_found ->
+ failwithf
+ (f_ "Library '%s', which is defined as the findlib parent of \
+ library '%s', doesn't exist.")
+ lib_name lib_name_child
+ in
+ let mp =
+ MapString.fold
+ (fun lib_name status mp ->
+ match status with
+ | `Solved _ ->
+ (* Solved initialy, no need to go further *)
+ mp
+ | `Unsolved _ ->
+ let _, mp = solve SetString.empty mp lib_name "<none>" in
+ mp)
+ fndlb_parts_of_lib_name
+ fndlb_parts_of_lib_name
+ in
+ MapString.map
+ (function
+ | `Solved fndlb_nm -> fndlb_nm
+ | `Unsolved _ -> assert false)
+ mp
+ in
+
+ (* Convert an internal library name to a findlib name. *)
+ let findlib_name_of_library_name lib_nm =
+ try
+ MapString.find lib_nm fndlb_name_of_lib_name
+ with Not_found ->
+ raise (InternalLibraryNotFound lib_nm)
+ in
+
+ (* Add a library to the tree.
+ *)
+ let add sct mp =
+ let fndlb_fullname =
+ let cs, _, _ = sct in
+ let lib_name = cs.cs_name in
+ findlib_name_of_library_name lib_name
+ in
+ let rec add_children nm_lst (children : tree MapString.t) =
+ match nm_lst with
+ | (hd :: tl) ->
+ begin
+ let node =
+ try
+ add_node tl (MapString.find hd children)
+ with Not_found ->
+ (* New node *)
+ new_node tl
+ in
+ MapString.add hd node children
+ end
+ | [] ->
+ (* Should not have a nameless library. *)
+ assert false
+ and add_node tl node =
+ if tl = [] then
+ begin
+ match node with
+ | Node (None, children) ->
+ Node (Some sct, children)
+ | Leaf (cs', _, _) | Node (Some (cs', _, _), _) ->
+ (* TODO: allow to merge Package, i.e.
+ * archive(byte) = "foo.cma foo_init.cmo"
+ *)
+ let cs, _, _ = sct in
+ failwithf
+ (f_ "Library '%s' and '%s' have the same findlib name '%s'")
+ cs.cs_name cs'.cs_name fndlb_fullname
+ end
+ else
+ begin
+ match node with
+ | Leaf data ->
+ Node (Some data, add_children tl MapString.empty)
+ | Node (data_opt, children) ->
+ Node (data_opt, add_children tl children)
+ end
+ and new_node =
+ function
+ | [] ->
+ Leaf sct
+ | hd :: tl ->
+ Node (None, MapString.add hd (new_node tl) MapString.empty)
+ in
+ add_children (OASISString.nsplit fndlb_fullname '.') mp
+ in
+
+ let rec group_of_tree mp =
+ MapString.fold
+ (fun nm node acc ->
+ let cur =
+ match node with
+ | Node (Some (cs, bs, lib), children) ->
+ Package (nm, cs, bs, lib, group_of_tree children)
+ | Node (None, children) ->
+ Container (nm, group_of_tree children)
+ | Leaf (cs, bs, lib) ->
+ Package (nm, cs, bs, lib, [])
+ in
+ cur :: acc)
+ mp []
+ in
+
+ let group_mp =
List.fold_left
(fun mp ->
function
| Library (cs, bs, lib) ->
- begin
- match lib.lib_findlib_parent with
- | Some p_nm ->
- begin
- let children =
- try
- MapString.find p_nm mp
- with Not_found ->
- []
- in
- MapString.add p_nm ((cs, bs, lib) :: children) mp
- end
- | None ->
- mp
- end
+ add (cs, bs, lib) mp
| _ ->
mp)
MapString.empty
pkg.sections
in
-
- (* Compute findlib name of a single node *)
- let findlib_name (cs, _, lib) =
- match lib.lib_findlib_name with
- | Some nm -> nm
- | None -> cs.cs_name
- in
-
- (** Build a package tree *)
- let rec tree_of_library containers ((cs, bs, lib) as acc) =
- match containers with
- | hd :: tl ->
- Container (hd, [tree_of_library tl acc])
- | [] ->
- Package
- (findlib_name acc, cs, bs, lib,
- (try
- List.rev_map
- (fun ((_, _, child_lib) as child_acc) ->
- tree_of_library
- child_lib.lib_findlib_containers
- child_acc)
- (MapString.find cs.cs_name children)
- with Not_found ->
- []))
- in
-
- (** Merge containers with the same name *)
- let rec merge_containers groups =
- (* Collect packages and create the map "container name -> merged children" *)
- let packages, containers =
- List.fold_left
- (fun (packages, containers) group ->
- match group with
- | Container(name, children) ->
- let children' =
- try
- MapString.find name containers
- with Not_found ->
- []
- in
- (packages,
- MapString.add name (children' @ children) containers)
- | Package(name, cs, bs, lib, children) ->
- (Package(name, cs, bs, lib, merge_containers children) :: packages,
- containers))
- ([], MapString.empty)
- groups
- in
- (* Recreate the list of groups *)
- packages @
- (MapString.fold
- (fun name children acc ->
- Container(name, merge_containers children) :: acc)
- containers [])
+
+ let groups =
+ group_of_tree group_mp
in
-
- (* TODO: check that libraries are unique *)
- merge_containers
- (List.fold_left
- (fun acc ->
- function
- | Library (cs, bs, lib) when lib.lib_findlib_parent = None ->
- (tree_of_library lib.lib_findlib_containers (cs, bs, lib)) :: acc
- | _ ->
- acc)
- []
- pkg.sections)
-
- (** Compute internal to findlib library matchings, including subpackage
- and return a map of it.
- *)
- let findlib_name_map pkg =
-
- (* Compute names in a tree *)
- let rec findlib_names_aux path mp grp =
- let fndlb_nm, children, mp =
- match grp with
- | Container (fndlb_nm, children) ->
- fndlb_nm, children, mp
-
- | Package (fndlb_nm, {cs_name = nm}, _, _, children) ->
- fndlb_nm, children, (MapString.add nm (path, fndlb_nm) mp)
- in
- let fndlb_nm_full =
- (match path with
- | Some pth -> pth^"."
- | None -> "")^
- fndlb_nm
- in
- List.fold_left
- (findlib_names_aux (Some fndlb_nm_full))
- mp
- children
+
+ let library_name_of_findlib_name =
+ Lazy.lazy_from_fun
+ (fun () ->
+ (* Revert findlib_name_of_library_name. *)
+ MapString.fold
+ (fun k v mp -> MapString.add v k mp)
+ fndlb_name_of_lib_name
+ MapString.empty)
in
-
- List.fold_left
- (findlib_names_aux None)
- MapString.empty
- (group_libs pkg)
-
-
- let findlib_of_name ?(recurse=false) map nm =
- try
- let (path, fndlb_nm) =
- MapString.find nm map
- in
- match path with
- | Some pth when recurse -> pth^"."^fndlb_nm
- | _ -> fndlb_nm
-
- with Not_found ->
- failwithf
- (f_ "Unable to translate internal library '%s' to findlib name")
- nm
-
- let name_findlib_map pkg =
- let mp =
- findlib_name_map pkg
+ let library_name_of_findlib_name fndlb_nm =
+ try
+ MapString.find fndlb_nm (Lazy.force library_name_of_findlib_name)
+ with Not_found ->
+ raise (FindlibPackageNotFound fndlb_nm)
in
- MapString.fold
- (fun nm _ acc ->
- let fndlb_nm_full =
- findlib_of_name
- ~recurse:true
- mp
- nm
- in
- MapString.add fndlb_nm_full nm acc)
- mp
- MapString.empty
-
+
+ groups,
+ findlib_name_of_library_name,
+ library_name_of_findlib_name
+
let findlib_of_group =
function
| Container (fndlb_nm, _)
| Package (fndlb_nm, _, _, _, _) -> fndlb_nm
-
+
let root_of_group grp =
let rec root_lib_aux =
+ (* We do a DFS in the group. *)
function
| Container (_, children) ->
- root_lib_lst children
- | Package (_, cs, bs, lib, children) ->
- if lib.lib_findlib_parent = None then
- cs, bs, lib
- else
- root_lib_lst children
- and root_lib_lst =
- function
- | [] ->
- raise Not_found
- | hd :: tl ->
- try
- root_lib_aux hd
- with Not_found ->
- root_lib_lst tl
+ List.fold_left
+ (fun res grp ->
+ if res = None then
+ root_lib_aux grp
+ else
+ res)
+ None
+ children
+ | Package (_, cs, bs, lib, _) ->
+ Some (cs, bs, lib)
in
- try
- root_lib_aux grp
- with Not_found ->
- failwithf
- (f_ "Unable to determine root library of findlib library '%s'")
- (findlib_of_group grp)
-
-
+ match root_lib_aux grp with
+ | Some res ->
+ res
+ | None ->
+ failwithf
+ (f_ "Unable to determine root library of findlib library '%s'")
+ (findlib_of_group grp)
+
end
module OASISFlag = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISFlag.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISFlag.ml"
+
end
module OASISPackage = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISPackage.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISPackage.ml"
+
end
module OASISSourceRepository = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISSourceRepository.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISSourceRepository.ml"
+
end
module OASISTest = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISTest.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISTest.ml"
+
end
module OASISDocument = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/oasis/OASISDocument.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISDocument.ml"
+
+end
+
+module OASISExec = struct
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISExec.ml"
+
+ open OASISGettext
+ open OASISUtils
+ open OASISMessage
+
+ (* TODO: I don't like this quote, it is there because $(rm) foo expands to
+ * 'rm -f' foo...
+ *)
+ let run ~ctxt ?f_exit_code ?(quote=true) cmd args =
+ let cmd =
+ if quote then
+ if Sys.os_type = "Win32" then
+ if String.contains cmd ' ' then
+ (* Double the 1st double quote... win32... sigh *)
+ "\""^(Filename.quote cmd)
+ else
+ cmd
+ else
+ Filename.quote cmd
+ else
+ cmd
+ in
+ let cmdline =
+ String.concat " " (cmd :: args)
+ in
+ info ~ctxt (f_ "Running command '%s'") cmdline;
+ match f_exit_code, Sys.command cmdline with
+ | None, 0 -> ()
+ | None, i ->
+ failwithf
+ (f_ "Command '%s' terminated with error code %d")
+ cmdline i
+ | Some f, i ->
+ f i
+
+ let run_read_output ~ctxt ?f_exit_code cmd args =
+ let fn =
+ Filename.temp_file "oasis-" ".txt"
+ in
+ try
+ begin
+ let () =
+ run ~ctxt ?f_exit_code cmd (args @ [">"; Filename.quote fn])
+ in
+ let chn =
+ open_in fn
+ in
+ let routput =
+ ref []
+ in
+ begin
+ try
+ while true do
+ routput := (input_line chn) :: !routput
+ done
+ with End_of_file ->
+ ()
+ end;
+ close_in chn;
+ Sys.remove fn;
+ List.rev !routput
+ end
+ with e ->
+ (try Sys.remove fn with _ -> ());
+ raise e
+
+ let run_read_one_line ~ctxt ?f_exit_code cmd args =
+ match run_read_output ~ctxt ?f_exit_code cmd args with
+ | [fst] ->
+ fst
+ | lst ->
+ failwithf
+ (f_ "Command return unexpected output %S")
+ (String.concat "\n" lst)
+end
+
+module OASISFileUtil = struct
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/oasis/OASISFileUtil.ml"
+
+ open OASISGettext
+
+ let file_exists_case fn =
+ let dirname = Filename.dirname fn in
+ let basename = Filename.basename fn in
+ if Sys.file_exists dirname then
+ if basename = Filename.current_dir_name then
+ true
+ else
+ List.mem
+ basename
+ (Array.to_list (Sys.readdir dirname))
+ else
+ false
+
+ let find_file ?(case_sensitive=true) paths exts =
+
+ (* Cardinal product of two list *)
+ let ( * ) lst1 lst2 =
+ List.flatten
+ (List.map
+ (fun a ->
+ List.map
+ (fun b -> a,b)
+ lst2)
+ lst1)
+ in
+
+ let rec combined_paths lst =
+ match lst with
+ | p1 :: p2 :: tl ->
+ let acc =
+ (List.map
+ (fun (a,b) -> Filename.concat a b)
+ (p1 * p2))
+ in
+ combined_paths (acc :: tl)
+ | [e] ->
+ e
+ | [] ->
+ []
+ in
+
+ let alternatives =
+ List.map
+ (fun (p,e) ->
+ if String.length e > 0 && e.[0] <> '.' then
+ p ^ "." ^ e
+ else
+ p ^ e)
+ ((combined_paths paths) * exts)
+ in
+ List.find
+ (if case_sensitive then
+ file_exists_case
+ else
+ Sys.file_exists)
+ alternatives
+
+ let which ~ctxt prg =
+ let path_sep =
+ match Sys.os_type with
+ | "Win32" ->
+ ';'
+ | _ ->
+ ':'
+ in
+ let path_lst = OASISString.nsplit (Sys.getenv "PATH") path_sep in
+ let exec_ext =
+ match Sys.os_type with
+ | "Win32" ->
+ "" :: (OASISString.nsplit (Sys.getenv "PATHEXT") path_sep)
+ | _ ->
+ [""]
+ in
+ find_file ~case_sensitive:false [path_lst; [prg]] exec_ext
+
+ (**/**)
+ let rec fix_dir dn =
+ (* Windows hack because Sys.file_exists "src\\" = false when
+ * Sys.file_exists "src" = true
+ *)
+ let ln =
+ String.length dn
+ in
+ if Sys.os_type = "Win32" && ln > 0 && dn.[ln - 1] = '\\' then
+ fix_dir (String.sub dn 0 (ln - 1))
+ else
+ dn
+
+ let q = Filename.quote
+ (**/**)
+
+ let cp ~ctxt ?(recurse=false) src tgt =
+ if recurse then
+ match Sys.os_type with
+ | "Win32" ->
+ OASISExec.run ~ctxt
+ "xcopy" [q src; q tgt; "/E"]
+ | _ ->
+ OASISExec.run ~ctxt
+ "cp" ["-r"; q src; q tgt]
+ else
+ OASISExec.run ~ctxt
+ (match Sys.os_type with
+ | "Win32" -> "copy"
+ | _ -> "cp")
+ [q src; q tgt]
+
+ let mkdir ~ctxt tgt =
+ OASISExec.run ~ctxt
+ (match Sys.os_type with
+ | "Win32" -> "md"
+ | _ -> "mkdir")
+ [q tgt]
+
+ let rec mkdir_parent ~ctxt f tgt =
+ let tgt =
+ fix_dir tgt
+ in
+ if Sys.file_exists tgt then
+ begin
+ if not (Sys.is_directory tgt) then
+ OASISUtils.failwithf
+ (f_ "Cannot create directory '%s', a file of the same name already \
+ exists")
+ tgt
+ end
+ else
+ begin
+ mkdir_parent ~ctxt f (Filename.dirname tgt);
+ if not (Sys.file_exists tgt) then
+ begin
+ f tgt;
+ mkdir ~ctxt tgt
+ end
+ end
+
+ let rmdir ~ctxt tgt =
+ if Sys.readdir tgt = [||] then
+ begin
+ match Sys.os_type with
+ | "Win32" ->
+ OASISExec.run ~ctxt "rd" [q tgt]
+ | _ ->
+ OASISExec.run ~ctxt "rm" ["-r"; q tgt]
+ end
+
+ let glob ~ctxt fn =
+ let basename =
+ Filename.basename fn
+ in
+ if String.length basename >= 2 &&
+ basename.[0] = '*' &&
+ basename.[1] = '.' then
+ begin
+ let ext_len =
+ (String.length basename) - 2
+ in
+ let ext =
+ String.sub basename 2 ext_len
+ in
+ let dirname =
+ Filename.dirname fn
+ in
+ Array.fold_left
+ (fun acc fn ->
+ try
+ let fn_ext =
+ String.sub
+ fn
+ ((String.length fn) - ext_len)
+ ext_len
+ in
+ if fn_ext = ext then
+ (Filename.concat dirname fn) :: acc
+ else
+ acc
+ with Invalid_argument _ ->
+ acc)
+ []
+ (Sys.readdir dirname)
+ end
+ else
+ begin
+ if file_exists_case fn then
+ [fn]
+ else
+ []
+ end
end
+# 2142 "setup.ml"
module BaseEnvLight = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseEnvLight.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/base/BaseEnvLight.ml"
+
module MapString = Map.Make(String)
-
+
type t = string MapString.t
-
+
let default_filename =
Filename.concat
(Sys.getcwd ())
"setup.data"
-
+
let load ?(allow_empty=false) ?(filename=default_filename) () =
if Sys.file_exists filename then
begin
@@ -1722,7 +2208,7 @@ module BaseEnvLight = struct
"Unable to load environment, the file '%s' doesn't exist."
filename)
end
-
+
let var_get name env =
let rec var_expand str =
let buff =
@@ -1743,7 +2229,7 @@ module BaseEnvLight = struct
Buffer.contents buff
in
var_expand (MapString.find name env)
-
+
let var_choose lst env =
OASISExpr.choose
(fun nm -> var_get nm env)
@@ -1751,90 +2237,59 @@ module BaseEnvLight = struct
end
+# 2240 "setup.ml"
module BaseContext = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseContext.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/base/BaseContext.ml"
+
open OASISContext
-
+
let args = args
-
+
let default = default
-
+
end
module BaseMessage = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseMessage.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/base/BaseMessage.ml"
+
(** Message to user, overrid for Base
@author Sylvain Le Gall
*)
open OASISMessage
open BaseContext
-
+
let debug fmt = debug ~ctxt:!default fmt
-
+
let info fmt = info ~ctxt:!default fmt
-
+
let warning fmt = warning ~ctxt:!default fmt
-
+
let error fmt = error ~ctxt:!default fmt
-
-end
-module BaseFilePath = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseFilePath.ml"
-
-
- open Filename
-
- module Unix = OASISUnixPath
-
- let make =
- function
- | [] ->
- invalid_arg "BaseFilename.make"
- | hd :: tl ->
- List.fold_left Filename.concat hd tl
-
- let of_unix ufn =
- if Sys.os_type = "Unix" then
- ufn
- else
- make
- (List.map
- (fun p ->
- if p = Unix.current_dir_name then
- current_dir_name
- else if p = Unix.parent_dir_name then
- parent_dir_name
- else
- p)
- (OASISUtils.split '/' ufn))
-
end
module BaseEnv = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseEnv.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/base/BaseEnv.ml"
+
open OASISGettext
open OASISUtils
open PropList
-
+
module MapString = BaseEnvLight.MapString
-
+
type origin_t =
| ODefault
| OGetEnv
| OFileLoad
| OCommandLine
-
+
type cli_handle_t =
| CLINone
| CLIAuto
| CLIWith
| CLIEnable
| CLIUser of (Arg.key * Arg.spec * Arg.doc) list
-
+
type definition_t =
{
hide: bool;
@@ -1843,22 +2298,22 @@ module BaseEnv = struct
arg_help: string option;
group: string option;
}
-
+
let schema =
Schema.create "environment"
-
+
(* Environment data *)
let env =
Data.create ()
-
+
(* Environment data from file *)
let env_from_file =
ref MapString.empty
-
+
(* Lexer for var *)
let var_lxr =
Genlex.make_lexer []
-
+
let rec var_expand str =
let buff =
Buffer.create ((String.length str) * 2)
@@ -1879,9 +2334,9 @@ module BaseEnv = struct
in
match Stream.npeek 3 st with
| [Genlex.Ident "utoh"; Genlex.Ident nm] ->
- BaseFilePath.of_unix (var_get nm)
+ OASISHostPath.of_unix (var_get nm)
| [Genlex.Ident "utoh"; Genlex.String s] ->
- BaseFilePath.of_unix s
+ OASISHostPath.of_unix s
| [Genlex.Ident "ocaml_escaped"; Genlex.Ident nm] ->
String.escaped (var_get nm)
| [Genlex.Ident "ocaml_escaped"; Genlex.String s] ->
@@ -1908,7 +2363,7 @@ module BaseEnv = struct
e)
str;
Buffer.contents buff
-
+
and var_get name =
let vl =
try
@@ -1922,14 +2377,14 @@ module BaseEnv = struct
end
in
var_expand vl
-
+
let var_choose ?printer ?name lst =
OASISExpr.choose
?printer
?name
var_get
lst
-
+
let var_protect vl =
let buff =
Buffer.create (String.length vl)
@@ -1940,7 +2395,7 @@ module BaseEnv = struct
| c -> Buffer.add_char buff c)
vl;
Buffer.contents buff
-
+
let var_define
?(hide=false)
?(dump=true)
@@ -1951,7 +2406,7 @@ module BaseEnv = struct
name (* TODO: type constraint on the fact that name must be a valid OCaml
id *)
dflt =
-
+
let default =
[
OFileLoad, (fun () -> MapString.find name !env_from_file);
@@ -1959,7 +2414,7 @@ module BaseEnv = struct
OGetEnv, (fun () -> Sys.getenv name);
]
in
-
+
let extra =
{
hide = hide;
@@ -1969,7 +2424,7 @@ module BaseEnv = struct
group = group;
}
in
-
+
(* Try to find a value that can be defined
*)
let var_get_low lst =
@@ -2004,13 +2459,13 @@ module BaseEnv = struct
| None, lst ->
raise (Not_set (name, Some (String.concat (s_ ", ") lst)))
in
-
+
let help =
match short_desc with
| Some fs -> Some fs
| None -> None
in
-
+
let var_get_lst =
FieldRO.create
~schema
@@ -2022,10 +2477,10 @@ module BaseEnv = struct
?help
extra
in
-
+
fun () ->
var_expand (var_get_low (var_get_lst env))
-
+
let var_redefine
?hide
?dump
@@ -2053,10 +2508,10 @@ module BaseEnv = struct
name
dflt
end
-
+
let var_ignore (e : unit -> string) =
()
-
+
let print_hidden =
var_define
~hide:true
@@ -2065,7 +2520,7 @@ module BaseEnv = struct
~arg_help:"Print even non-printable variable. (debug)"
"print_hidden"
(fun () -> "false")
-
+
let var_all () =
List.rev
(Schema.fold
@@ -2076,17 +2531,17 @@ module BaseEnv = struct
acc)
[]
schema)
-
+
let default_filename =
BaseEnvLight.default_filename
-
+
let load ?allow_empty ?filename () =
env_from_file := BaseEnvLight.load ?allow_empty ?filename ()
-
+
let unload () =
env_from_file := MapString.empty;
Data.clear env
-
+
let dump ?(filename=default_filename) () =
let chn =
open_out_bin filename
@@ -2117,10 +2572,10 @@ module BaseEnv = struct
in
(* Dump data defined outside of schema *)
MapString.iter output mp_todo;
-
+
(* End of the dump *)
close_out chn
-
+
let print () =
let printable_vars =
Schema.fold
@@ -2156,14 +2611,14 @@ module BaseEnv = struct
let dot_pad str =
String.make ((max_length - (String.length str)) + 3) '.'
in
-
+
Printf.printf "\nConfiguration: \n";
List.iter
(fun (name,value) ->
Printf.printf "%s: %s %s\n" name (dot_pad name) value)
(List.rev printable_vars);
Printf.printf "\n%!"
-
+
let args () =
let arg_concat =
OASISUtils.varname_concat ~hyphen:'-'
@@ -2190,7 +2645,7 @@ module BaseEnv = struct
]
),
"var+val Override any configuration variable.";
-
+
]
@
List.flatten
@@ -2204,23 +2659,23 @@ module BaseEnv = struct
name
s
in
-
+
let arg_name =
OASISUtils.varname_of_string ~hyphen:'-' name
in
-
+
let hlp =
match short_descr_opt with
| Some txt -> txt ()
| None -> ""
in
-
+
let arg_hlp =
match def.arg_help with
| Some s -> s
| None -> "str"
in
-
+
let default_value =
try
Printf.sprintf
@@ -2232,7 +2687,7 @@ module BaseEnv = struct
with Not_set _ ->
""
in
-
+
let args =
match def.cli with
| CLINone ->
@@ -2260,7 +2715,7 @@ module BaseEnv = struct
arg_concat "--enable-" arg_name,
Arg.Unit (fun () -> var_set "true"),
Printf.sprintf (f_ " %s%s") hlp dflt;
-
+
arg_concat "--disable-" arg_name,
Arg.Unit (fun () -> var_set "false"),
Printf.sprintf (f_ " %s%s") hlp dflt
@@ -2273,256 +2728,18 @@ module BaseEnv = struct
schema)
end
-module BaseExec = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseExec.ml"
-
- open OASISGettext
- open OASISUtils
- open BaseMessage
-
- let run ?f_exit_code cmd args =
- let cmdline =
- String.concat " " (cmd :: args)
- in
- info (f_ "Running command '%s'") cmdline;
- match f_exit_code, Sys.command cmdline with
- | None, 0 -> ()
- | None, i ->
- failwithf
- (f_ "Command '%s' terminated with error code %d")
- cmdline i
- | Some f, i ->
- f i
-
- let run_read_output ?f_exit_code cmd args =
- let fn =
- Filename.temp_file "oasis-" ".txt"
- in
- let () =
- try
- run ?f_exit_code cmd (args @ [">"; Filename.quote fn])
- with e ->
- Sys.remove fn;
- raise e
- in
- let chn =
- open_in fn
- in
- let routput =
- ref []
- in
- (
- try
- while true do
- routput := (input_line chn) :: !routput
- done
- with End_of_file ->
- ()
- );
- close_in chn;
- Sys.remove fn;
- List.rev !routput
-
- let run_read_one_line ?f_exit_code cmd args =
- match run_read_output ?f_exit_code cmd args with
- | [fst] ->
- fst
- | lst ->
- failwithf
- (f_ "Command return unexpected output %S")
- (String.concat "\n" lst)
-end
-
-module BaseFileUtil = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseFileUtil.ml"
-
- open OASISGettext
-
- let find_file paths exts =
-
- (* Cardinal product of two list *)
- let ( * ) lst1 lst2 =
- List.flatten
- (List.map
- (fun a ->
- List.map
- (fun b -> a,b)
- lst2)
- lst1)
- in
-
- let rec combined_paths lst =
- match lst with
- | p1 :: p2 :: tl ->
- let acc =
- (List.map
- (fun (a,b) -> Filename.concat a b)
- (p1 * p2))
- in
- combined_paths (acc :: tl)
- | [e] ->
- e
- | [] ->
- []
- in
-
- let alternatives =
- List.map
- (fun (p,e) ->
- if String.length e > 0 && e.[0] <> '.' then
- p ^ "." ^ e
- else
- p ^ e)
- ((combined_paths paths) * exts)
- in
- List.find
- Sys.file_exists
- alternatives
-
- let which prg =
- let path_sep =
- match Sys.os_type with
- | "Win32" ->
- ';'
- | _ ->
- ':'
- in
- let path_lst =
- OASISUtils.split
- path_sep
- (Sys.getenv "PATH")
- in
- let exec_ext =
- match Sys.os_type with
- | "Win32" ->
- ""
- ::
- (OASISUtils.split
- path_sep
- (Sys.getenv "PATHEXT"))
- | _ ->
- [""]
- in
- find_file [path_lst; [prg]] exec_ext
-
- (**/**)
- let rec fix_dir dn =
- (* Windows hack because Sys.file_exists "src\\" = false when
- * Sys.file_exists "src" = true
- *)
- let ln =
- String.length dn
- in
- if Sys.os_type = "Win32" && ln > 0 && dn.[ln - 1] = '\\' then
- fix_dir (String.sub dn 0 (ln - 1))
- else
- dn
-
- let q = Filename.quote
- (**/**)
-
- let cp src tgt =
- BaseExec.run
- (match Sys.os_type with
- | "Win32" -> "copy"
- | _ -> "cp")
- [q src; q tgt]
-
- let mkdir tgt =
- BaseExec.run
- (match Sys.os_type with
- | "Win32" -> "md"
- | _ -> "mkdir")
- [q tgt]
-
- let rec mkdir_parent f tgt =
- let tgt =
- fix_dir tgt
- in
- if Sys.file_exists tgt then
- begin
- if not (Sys.is_directory tgt) then
- OASISUtils.failwithf
- (f_ "Cannot create directory '%s', a file of the same name already \
- exists")
- tgt
- end
- else
- begin
- mkdir_parent f (Filename.dirname tgt);
- if not (Sys.file_exists tgt) then
- begin
- f tgt;
- mkdir tgt
- end
- end
-
- let rmdir tgt =
- if Sys.readdir tgt = [||] then
- begin
- match Sys.os_type with
- | "Win32" ->
- BaseExec.run "rd" [q tgt]
- | _ ->
- BaseExec.run "rm" ["-r"; q tgt]
- end
-
- let glob fn =
- let basename =
- Filename.basename fn
- in
- if String.length basename >= 2 &&
- basename.[0] = '*' &&
- basename.[1] = '.' then
- begin
- let ext_len =
- (String.length basename) - 2
- in
- let ext =
- String.sub basename 2 ext_len
- in
- let dirname =
- Filename.dirname fn
- in
- Array.fold_left
- (fun acc fn ->
- try
- let fn_ext =
- String.sub
- fn
- ((String.length fn) - ext_len)
- ext_len
- in
- if fn_ext = ext then
- (Filename.concat dirname fn) :: acc
- else
- acc
- with Invalid_argument _ ->
- acc)
- []
- (Sys.readdir dirname)
- end
- else
- begin
- if Sys.file_exists fn then
- [fn]
- else
- []
- end
-end
-
module BaseArgExt = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseArgExt.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/base/BaseArgExt.ml"
+
open OASISUtils
open OASISGettext
-
+
let parse argv args =
(* Simulate command line for Arg *)
let current =
ref 0
in
-
+
try
Arg.parse_argv
~current:current
@@ -2540,13 +2757,13 @@ module BaseArgExt = struct
end
module BaseCheck = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseCheck.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/base/BaseCheck.ml"
+
open BaseEnv
open BaseMessage
open OASISUtils
open OASISGettext
-
+
let prog_best prg prg_lst =
var_redefine
prg
@@ -2559,7 +2776,7 @@ module BaseCheck = struct
res
| None ->
try
- Some (BaseFileUtil.which e)
+ Some (OASISFileUtil.which ~ctxt:!BaseContext.default e)
with Not_found ->
None)
None
@@ -2568,16 +2785,16 @@ module BaseCheck = struct
match alternate with
| Some prg -> prg
| None -> raise Not_found)
-
+
let prog prg =
prog_best prg [prg]
-
+
let prog_opt prg =
prog_best prg [prg^".opt"; prg]
-
+
let ocamlfind =
prog "ocamlfind"
-
+
let version
var_prefix
cmp
@@ -2618,12 +2835,12 @@ module BaseCheck = struct
(OASISVersion.string_of_comparator cmp)
version_str)
()
-
+
let package_version pkg =
- BaseExec.run_read_one_line
+ OASISExec.run_read_one_line ~ctxt:!BaseContext.default
(ocamlfind ())
["query"; "-format"; "%v"; pkg]
-
+
let package ?version_comparator pkg () =
let var =
OASISUtils.varname_concat
@@ -2632,7 +2849,7 @@ module BaseCheck = struct
in
let findlib_dir pkg =
let dir =
- BaseExec.run_read_one_line
+ OASISExec.run_read_one_line ~ctxt:!BaseContext.default
(ocamlfind ())
["query"; "-format"; "%d"; pkg]
in
@@ -2666,18 +2883,18 @@ module BaseCheck = struct
end
module BaseOCamlcConfig = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseOCamlcConfig.ml"
-
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/base/BaseOCamlcConfig.ml"
+
+
open BaseEnv
open OASISUtils
open OASISGettext
-
+
module SMap = Map.Make(String)
-
+
let ocamlc =
BaseCheck.prog_opt "ocamlc"
-
+
let ocamlc_config_map =
(* Map name to value for ocamlc -config output
(name ^": "^value)
@@ -2722,14 +2939,15 @@ module BaseOCamlcConfig = struct
| [] ->
mp
in
-
+
let cache =
lazy
(var_protect
(Marshal.to_string
(split_field
SMap.empty
- (BaseExec.run_read_output
+ (OASISExec.run_read_output
+ ~ctxt:!BaseContext.default
(ocamlc ()) ["-config"]))
[]))
in
@@ -2740,7 +2958,7 @@ module BaseOCamlcConfig = struct
(fun () ->
(* TODO: update if ocamlc change !!! *)
Lazy.force cache)
-
+
let var_define nm =
(* Extract data from ocamlc -config *)
let avlbl_config_get () =
@@ -2754,7 +2972,7 @@ module BaseOCamlcConfig = struct
with _ ->
s
in
-
+
let nm_config, value_config =
match nm with
| "ocaml_version" ->
@@ -2777,58 +2995,72 @@ module BaseOCamlcConfig = struct
(f_ "Cannot find field '%s' in '%s -config' output")
nm
(ocamlc ()))
-
+
end
module BaseStandardVar = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseStandardVar.ml"
-
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/base/BaseStandardVar.ml"
+
+
open OASISGettext
open OASISTypes
open OASISExpr
open BaseCheck
open BaseEnv
-
+
let ocamlfind = BaseCheck.ocamlfind
let ocamlc = BaseOCamlcConfig.ocamlc
let ocamlopt = prog_opt "ocamlopt"
let ocamlbuild = prog "ocamlbuild"
-
-
+
+
(**/**)
let rpkg =
ref None
-
+
let pkg_get () =
match !rpkg with
| Some pkg -> pkg
| None -> failwith (s_ "OASIS Package is not set")
+
+ let var_cond = ref []
+
+ let var_define_cond ~since_version f dflt =
+ let holder = ref (fun () -> dflt) in
+ let since_version =
+ OASISVersion.VGreaterEqual (OASISVersion.version_of_string since_version)
+ in
+ var_cond :=
+ (fun ver ->
+ if OASISVersion.comparator_apply ver since_version then
+ holder := f ()) :: !var_cond;
+ fun () -> !holder ()
+
(**/**)
-
+
let pkg_name =
var_define
~short_desc:(fun () -> s_ "Package name")
"pkg_name"
(fun () -> (pkg_get ()).name)
-
+
let pkg_version =
var_define
~short_desc:(fun () -> s_ "Package version")
"pkg_version"
(fun () ->
(OASISVersion.string_of_version (pkg_get ()).version))
-
+
let c = BaseOCamlcConfig.var_define
-
+
let os_type = c "os_type"
let system = c "system"
let architecture = c "architecture"
let ccomp_type = c "ccomp_type"
let ocaml_version = c "ocaml_version"
-
+
(* TODO: Check standard variable presence at runtime *)
-
+
let standard_library_default = c "standard_library_default"
let standard_library = c "standard_library"
let standard_runtime = c "standard_runtime"
@@ -2841,8 +3073,25 @@ module BaseStandardVar = struct
let ext_dll = c "ext_dll"
let default_executable_name = c "default_executable_name"
let systhread_supported = c "systhread_supported"
-
-
+
+ let flexlink =
+ BaseCheck.prog "flexlink"
+
+ let flexdll_version =
+ var_define
+ ~short_desc:(fun () -> "FlexDLL version (Win32)")
+ "flexdll_version"
+ (fun () ->
+ let lst =
+ OASISExec.run_read_output ~ctxt:!BaseContext.default
+ (flexlink ()) ["-help"]
+ in
+ match lst with
+ | line :: _ ->
+ Scanf.sscanf line "FlexDLL version %s" (fun ver -> ver)
+ | [] ->
+ raise Not_found)
+
(**/**)
let p name hlp dflt =
var_define
@@ -2851,17 +3100,17 @@ module BaseStandardVar = struct
~arg_help:"dir"
name
dflt
-
+
let (/) a b =
if os_type () = Sys.os_type then
Filename.concat a b
else if os_type () = "Unix" then
- BaseFilePath.Unix.concat a b
+ OASISUnixPath.concat a b
else
OASISUtils.failwithf (f_ "Cannot handle os_type %s filename concat")
(os_type ())
(**/**)
-
+
let prefix =
p "prefix"
(fun () -> s_ "Install architecture-independent files dir")
@@ -2874,97 +3123,97 @@ module BaseStandardVar = struct
program_files/(pkg_name ())
| _ ->
"/usr/local")
-
+
let exec_prefix =
p "exec_prefix"
(fun () -> s_ "Install architecture-dependent files in dir")
(fun () -> "$prefix")
-
+
let bindir =
p "bindir"
(fun () -> s_ "User executables")
(fun () -> "$exec_prefix"/"bin")
-
+
let sbindir =
p "sbindir"
(fun () -> s_ "System admin executables")
(fun () -> "$exec_prefix"/"sbin")
-
+
let libexecdir =
p "libexecdir"
(fun () -> s_ "Program executables")
(fun () -> "$exec_prefix"/"libexec")
-
+
let sysconfdir =
p "sysconfdir"
(fun () -> s_ "Read-only single-machine data")
(fun () -> "$prefix"/"etc")
-
+
let sharedstatedir =
p "sharedstatedir"
(fun () -> s_ "Modifiable architecture-independent data")
(fun () -> "$prefix"/"com")
-
+
let localstatedir =
p "localstatedir"
(fun () -> s_ "Modifiable single-machine data")
(fun () -> "$prefix"/"var")
-
+
let libdir =
p "libdir"
(fun () -> s_ "Object code libraries")
(fun () -> "$exec_prefix"/"lib")
-
+
let datarootdir =
p "datarootdir"
(fun () -> s_ "Read-only arch-independent data root")
(fun () -> "$prefix"/"share")
-
+
let datadir =
p "datadir"
(fun () -> s_ "Read-only architecture-independent data")
(fun () -> "$datarootdir")
-
+
let infodir =
p "infodir"
(fun () -> s_ "Info documentation")
(fun () -> "$datarootdir"/"info")
-
+
let localedir =
p "localedir"
(fun () -> s_ "Locale-dependent data")
(fun () -> "$datarootdir"/"locale")
-
+
let mandir =
p "mandir"
(fun () -> s_ "Man documentation")
(fun () -> "$datarootdir"/"man")
-
+
let docdir =
p "docdir"
(fun () -> s_ "Documentation root")
(fun () -> "$datarootdir"/"doc"/"$pkg_name")
-
+
let htmldir =
p "htmldir"
(fun () -> s_ "HTML documentation")
(fun () -> "$docdir")
-
+
let dvidir =
p "dvidir"
(fun () -> s_ "DVI documentation")
(fun () -> "$docdir")
-
+
let pdfdir =
p "pdfdir"
(fun () -> s_ "PDF documentation")
(fun () -> "$docdir")
-
+
let psdir =
p "psdir"
(fun () -> s_ "PS documentation")
(fun () -> "$docdir")
-
+
let destdir =
p "destdir"
(fun () -> s_ "Prepend a path when installing package")
@@ -2973,13 +3222,13 @@ module BaseStandardVar = struct
(PropList.Not_set
("destdir",
Some (s_ "undefined by construct"))))
-
+
let findlib_version =
var_define
"findlib_version"
(fun () ->
BaseCheck.package_version "findlib")
-
+
let is_native =
var_define
"is_native"
@@ -2994,7 +3243,7 @@ module BaseStandardVar = struct
ocamlc ()
in
"false")
-
+
let ext_program =
var_define
"suffix_program"
@@ -3002,7 +3251,7 @@ module BaseStandardVar = struct
match os_type () with
| "Win32" -> ".exe"
| _ -> "")
-
+
let rm =
var_define
~short_desc:(fun () -> s_ "Remove a file.")
@@ -3011,7 +3260,7 @@ module BaseStandardVar = struct
match os_type () with
| "Win32" -> "del"
| _ -> "rm -f")
-
+
let rmdir =
var_define
~short_desc:(fun () -> s_ "Remove a directory.")
@@ -3020,58 +3269,116 @@ module BaseStandardVar = struct
match os_type () with
| "Win32" -> "rd"
| _ -> "rm -rf")
-
+
let debug =
var_define
~short_desc:(fun () -> s_ "Turn ocaml debug flag on")
~cli:CLIEnable
"debug"
(fun () -> "true")
-
+
let profile =
var_define
~short_desc:(fun () -> s_ "Turn ocaml profile flag on")
~cli:CLIEnable
"profile"
(fun () -> "false")
-
+
let tests =
- var_define
- ~short_desc:(fun () ->
- s_ "Compile tests executable and library and run them")
- ~cli:CLIEnable
- "tests"
- (fun () -> "false")
-
+ var_define_cond ~since_version:"0.3"
+ (fun () ->
+ var_define
+ ~short_desc:(fun () ->
+ s_ "Compile tests executable and library and run them")
+ ~cli:CLIEnable
+ "tests"
+ (fun () -> "false"))
+ "true"
+
let docs =
+ var_define_cond ~since_version:"0.3"
+ (fun () ->
+ var_define
+ ~short_desc:(fun () -> s_ "Create documentations")
+ ~cli:CLIEnable
+ "docs"
+ (fun () -> "true"))
+ "true"
+
+ let native_dynlink =
var_define
- ~short_desc:(fun () -> s_ "Create documentations")
- ~cli:CLIEnable
- "docs"
- (fun () -> "true")
-
+ ~short_desc:(fun () -> s_ "Compiler support generation of .cmxs.")
+ ~cli:CLINone
+ "native_dynlink"
+ (fun () ->
+ let res =
+ let ocaml_lt_312 () =
+ OASISVersion.comparator_apply
+ (OASISVersion.version_of_string (ocaml_version ()))
+ (OASISVersion.VLesser
+ (OASISVersion.version_of_string "3.12.0"))
+ in
+ let flexdll_lt_030 () =
+ OASISVersion.comparator_apply
+ (OASISVersion.version_of_string (flexdll_version ()))
+ (OASISVersion.VLesser
+ (OASISVersion.version_of_string "0.30"))
+ in
+ let has_native_dynlink =
+ let ocamlfind = ocamlfind () in
+ try
+ let fn =
+ OASISExec.run_read_one_line
+ ~ctxt:!BaseContext.default
+ ocamlfind
+ ["query"; "-predicates"; "native"; "dynlink";
+ "-format"; "%d/%a"]
+ in
+ Sys.file_exists fn
+ with _ ->
+ false
+ in
+ if not has_native_dynlink then
+ false
+ else if ocaml_lt_312 () then
+ false
+ else if (os_type () = "Win32" || os_type () = "Cygwin")
+ && flexdll_lt_030 () then
+ begin
+ BaseMessage.warning
+ (f_ ".cmxs generation disabled because FlexDLL needs to be \
+ at least 0.30. Please upgrade FlexDLL from %s to 0.30.")
+ (flexdll_version ());
+ false
+ end
+ else
+ true
+ in
+ string_of_bool res)
+
let init pkg =
- rpkg := Some pkg
-
+ rpkg := Some pkg;
+ List.iter (fun f -> f pkg.oasis_version) !var_cond
+
end
module BaseFileAB = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseFileAB.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/base/BaseFileAB.ml"
+
open BaseEnv
open OASISGettext
open BaseMessage
-
+
let to_filename fn =
let fn =
- BaseFilePath.of_unix fn
+ OASISHostPath.of_unix fn
in
if not (Filename.check_suffix fn ".ab") then
warning
(f_ "File '%s' doesn't have '.ab' extension")
fn;
Filename.chop_extension fn
-
+
let replace fn_lst =
let buff =
Buffer.create 13
@@ -3079,7 +3386,7 @@ module BaseFileAB = struct
List.iter
(fun fn ->
let fn =
- BaseFilePath.of_unix fn
+ OASISHostPath.of_unix fn
in
let chn_in =
open_in fn
@@ -3104,15 +3411,15 @@ module BaseFileAB = struct
end
module BaseLog = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseLog.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/base/BaseLog.ml"
+
open OASISUtils
-
+
let default_filename =
Filename.concat
(Filename.dirname BaseEnv.default_filename)
"setup.log"
-
+
module SetTupleString =
Set.Make
(struct
@@ -3122,7 +3429,7 @@ module BaseLog = struct
| 0 -> String.compare s12 s22
| n -> n
end)
-
+
let load () =
if Sys.file_exists default_filename then
begin
@@ -3171,14 +3478,14 @@ module BaseLog = struct
begin
[]
end
-
+
let register event data =
let chn_out =
open_out_gen [Open_append; Open_creat; Open_text] 0o644 default_filename
in
Printf.fprintf chn_out "%S %S\n" event data;
close_out chn_out
-
+
let unregister event data =
if Sys.file_exists default_filename then
begin
@@ -3203,7 +3510,7 @@ module BaseLog = struct
if not !write_something then
Sys.remove default_filename
end
-
+
let filter events =
let st_events =
List.fold_left
@@ -3215,7 +3522,7 @@ module BaseLog = struct
List.filter
(fun (e, _) -> SetString.mem e st_events)
(load ())
-
+
let exists event data =
List.exists
(fun v -> (event, data) = v)
@@ -3223,19 +3530,19 @@ module BaseLog = struct
end
module BaseBuilt = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseBuilt.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/base/BaseBuilt.ml"
+
open OASISTypes
open OASISGettext
open BaseStandardVar
open BaseMessage
-
+
type t =
| BExec (* Executable *)
| BExecLib (* Library coming with executable *)
| BLib (* Library *)
| BDoc (* Document *)
-
+
let to_log_event_file t nm =
"built_"^
(match t with
@@ -3244,10 +3551,10 @@ module BaseBuilt = struct
| BLib -> "lib"
| BDoc -> "doc")^
"_"^nm
-
+
let to_log_event_done t nm =
"is_"^(to_log_event_file t nm)
-
+
let register t nm lst =
BaseLog.register
(to_log_event_done t nm)
@@ -3257,7 +3564,7 @@ module BaseBuilt = struct
let registered =
List.fold_left
(fun registered fn ->
- if Sys.file_exists fn then
+ if OASISFileUtil.file_exists_case fn then
begin
BaseLog.register
(to_log_event_file t nm)
@@ -3277,7 +3584,7 @@ module BaseBuilt = struct
(f_ "Cannot find an existing alternative files among: %s")
(String.concat (s_ ", ") alt))
lst
-
+
let unregister t nm =
List.iter
(fun (e, d) ->
@@ -3285,11 +3592,11 @@ module BaseBuilt = struct
(BaseLog.filter
[to_log_event_file t nm;
to_log_event_done t nm])
-
+
let fold t nm f acc =
List.fold_left
(fun acc (_, fn) ->
- if Sys.file_exists fn then
+ if OASISFileUtil.file_exists_case fn then
begin
f acc fn
end
@@ -3313,7 +3620,7 @@ module BaseBuilt = struct
acc
(BaseLog.filter
[to_log_event_file t nm])
-
+
let is_built t nm =
List.fold_left
(fun is_built (_, d) ->
@@ -3324,7 +3631,7 @@ module BaseBuilt = struct
false
(BaseLog.filter
[to_log_event_done t nm])
-
+
let of_executable ffn (cs, bs, exec) =
let unix_exec_is, unix_dll_opt =
OASISExecutable.unix_exec_is
@@ -3347,18 +3654,18 @@ module BaseBuilt = struct
evs,
unix_exec_is,
unix_dll_opt
-
+
let of_library ffn (cs, bs, lib) =
let unix_lst =
OASISLibrary.generated_unix_files
~ctxt:!BaseContext.default
+ ~source_file_exists:(fun fn ->
+ OASISFileUtil.file_exists_case (OASISHostPath.of_unix fn))
+ ~is_native:(bool_of_string (is_native ()))
+ ~has_native_dynlink:(bool_of_string (native_dynlink ()))
+ ~ext_lib:(ext_lib ())
+ ~ext_dll:(ext_dll ())
(cs, bs, lib)
- (fun fn ->
- Sys.file_exists (BaseFilePath.of_unix fn))
- (fun () ->
- bool_of_string (is_native ()))
- ext_lib
- ext_dll
in
let evs =
[BLib,
@@ -3366,24 +3673,24 @@ module BaseBuilt = struct
List.map (List.map ffn) unix_lst]
in
evs, unix_lst
-
+
end
module BaseCustom = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseCustom.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/base/BaseCustom.ml"
+
open BaseEnv
open BaseMessage
open OASISTypes
open OASISGettext
-
+
let run cmd args extra_args =
- BaseExec.run
+ OASISExec.run ~ctxt:!BaseContext.default ~quote:false
(var_expand cmd)
(List.map
var_expand
(args @ (Array.to_list extra_args)))
-
+
let hook ?(failsafe=false) cstm f e =
let optional_command lst =
let printer =
@@ -3420,15 +3727,17 @@ module BaseCustom = struct
end
module BaseDynVar = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseDynVar.ml"
-
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/base/BaseDynVar.ml"
+
+
open OASISTypes
open OASISGettext
open BaseEnv
open BaseBuilt
-
+
let init pkg =
+ (* TODO: disambiguate exec vs other variable by adding exec_VARNAME. *)
+ (* TODO: provide compile option for library libary_byte_args_VARNAME... *)
List.iter
(function
| Executable (cs, bs, exec) ->
@@ -3441,7 +3750,7 @@ module BaseDynVar = struct
Printf.sprintf
(f_ "Filename of executable '%s'")
cs.cs_name)
- cs.cs_name
+ (OASISUtils.varname_of_string cs.cs_name)
(fun () ->
let fn_opt =
fold
@@ -3458,23 +3767,23 @@ module BaseDynVar = struct
Some (Printf.sprintf
(f_ "Executable '%s' not yet built.")
cs.cs_name)))))
-
+
| Library _ | Flag _ | Test _ | SrcRepo _ | Doc _ ->
())
pkg.sections
end
module BaseTest = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseTest.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/base/BaseTest.ml"
+
open BaseEnv
open BaseMessage
open OASISTypes
open OASISExpr
open OASISGettext
-
+
let test lst pkg extra_args =
-
+
let one_test (failure, n) (test_plugin, cs, test) =
if var_choose
~name:(Printf.sprintf
@@ -3498,7 +3807,7 @@ module BaseTest = struct
in
chdir dir;
fun () -> chdir cwd
-
+
| None ->
fun () -> ()
in
@@ -3543,19 +3852,27 @@ module BaseTest = struct
if failure_percent > 0.0 then
failwith msg
else
- info "%s" msg
+ info "%s" msg;
+
+ (* Possible explanation why the tests where not run. *)
+ if OASISVersion.version_0_3_or_after pkg.oasis_version &&
+ not (bool_of_string (BaseStandardVar.tests ())) &&
+ lst <> [] then
+ BaseMessage.warning
+ "Tests are turned off, consider enabling with \
+ 'ocaml setup.ml -configure --enable-tests'"
end
module BaseDoc = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseDoc.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/base/BaseDoc.ml"
+
open BaseEnv
open BaseMessage
open OASISTypes
open OASISGettext
-
+
let doc lst pkg extra_args =
-
+
let one_doc (doc_plugin, cs, doc) =
if var_choose
~name:(Printf.sprintf
@@ -3571,45 +3888,55 @@ module BaseDoc = struct
extra_args
end
in
- List.iter
- one_doc
- lst
+ List.iter one_doc lst;
+
+ if OASISVersion.version_0_3_or_after pkg.oasis_version &&
+ not (bool_of_string (BaseStandardVar.docs ())) &&
+ lst <> [] then
+ BaseMessage.warning
+ "Docs are turned off, consider enabling with \
+ 'ocaml setup.ml -configure --enable-docs'"
end
module BaseSetup = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseSetup.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/base/BaseSetup.ml"
+
open BaseEnv
open BaseMessage
open OASISTypes
open OASISSection
open OASISGettext
open OASISUtils
-
+
type std_args_fun =
package -> string array -> unit
-
+
type ('a, 'b) section_args_fun =
name * (package -> (common_section * 'a) -> string array -> 'b)
-
+
type t =
{
- configure: std_args_fun;
- build: std_args_fun;
- doc: ((doc, unit) section_args_fun) list;
- test: ((test, float) section_args_fun) list;
- install: std_args_fun;
- uninstall: std_args_fun;
- clean: std_args_fun list;
- clean_doc: (doc, unit) section_args_fun list;
- clean_test: (test, unit) section_args_fun list;
- distclean: std_args_fun list;
- distclean_doc: (doc, unit) section_args_fun list;
- distclean_test: (test, unit) section_args_fun list;
- package: package;
- version: string;
+ configure: std_args_fun;
+ build: std_args_fun;
+ doc: ((doc, unit) section_args_fun) list;
+ test: ((test, float) section_args_fun) list;
+ install: std_args_fun;
+ uninstall: std_args_fun;
+ clean: std_args_fun list;
+ clean_doc: (doc, unit) section_args_fun list;
+ clean_test: (test, unit) section_args_fun list;
+ distclean: std_args_fun list;
+ distclean_doc: (doc, unit) section_args_fun list;
+ distclean_test: (test, unit) section_args_fun list;
+ package: package;
+ oasis_fn: string option;
+ oasis_version: string;
+ oasis_digest: Digest.t option;
+ oasis_exec: string option;
+ oasis_setup_args: string list;
+ setup_update: bool;
}
-
+
(* Associate a plugin function with data from package *)
let join_plugin_sections filter_map lst =
List.rev
@@ -3622,7 +3949,7 @@ module BaseSetup = struct
acc)
[]
lst)
-
+
(* Search for plugin data associated with a section name *)
let lookup_plugin_section plugin action nm lst =
try
@@ -3633,7 +3960,7 @@ module BaseSetup = struct
plugin
nm
action
-
+
let configure t args =
(* Run configure *)
BaseCustom.hook
@@ -3647,78 +3974,68 @@ module BaseSetup = struct
with _ ->
()
end;
-
+
(* Run plugin's configure *)
t.configure t.package args;
-
+
(* Dump to allow postconf to change it *)
dump ())
();
-
+
(* Reload environment *)
unload ();
load ();
-
+
(* Save environment *)
print ();
-
+
(* Replace data in file *)
BaseFileAB.replace t.package.files_ab
-
+
let build t args =
BaseCustom.hook
t.package.build_custom
(t.build t.package)
args
-
+
let doc t args =
- if bool_of_string (BaseStandardVar.docs ()) then
- BaseDoc.doc
- (join_plugin_sections
- (function
- | Doc (cs, e) ->
- Some
- (lookup_plugin_section
- "documentation"
- (s_ "build")
- cs.cs_name
- t.doc,
- cs,
- e)
- | _ ->
- None)
- t.package.sections)
- t.package
- args
- else
- BaseMessage.warning
- "Docs are turned off, consider enabling with \
- 'ocaml setup.ml -configure --enable-docs'"
-
+ BaseDoc.doc
+ (join_plugin_sections
+ (function
+ | Doc (cs, e) ->
+ Some
+ (lookup_plugin_section
+ "documentation"
+ (s_ "build")
+ cs.cs_name
+ t.doc,
+ cs,
+ e)
+ | _ ->
+ None)
+ t.package.sections)
+ t.package
+ args
+
let test t args =
- if bool_of_string (BaseStandardVar.tests ()) then
- BaseTest.test
- (join_plugin_sections
- (function
- | Test (cs, e) ->
- Some
- (lookup_plugin_section
- "test"
- (s_ "run")
- cs.cs_name
- t.test,
- cs,
- e)
- | _ ->
- None)
- t.package.sections)
- t.package
- args
- else
- BaseMessage.warning
- "Tests are turned off, consider enabling with \
- 'ocaml setup.ml -configure --enable-tests'"
-
+ BaseTest.test
+ (join_plugin_sections
+ (function
+ | Test (cs, e) ->
+ Some
+ (lookup_plugin_section
+ "test"
+ (s_ "run")
+ cs.cs_name
+ t.test,
+ cs,
+ e)
+ | _ ->
+ None)
+ t.package.sections)
+ t.package
+ args
+
let all t args =
let rno_doc =
ref false
@@ -3735,23 +4052,23 @@ module BaseSetup = struct
"-no-doc",
Arg.Set rno_doc,
s_ "Don't run doc target";
-
+
"-no-test",
Arg.Set rno_test,
s_ "Don't run test target";
]
(failwithf (f_ "Don't know what to do with '%s'"))
"";
-
+
info "Running configure step";
configure t [||];
-
+
info "Running build step";
build t [||];
-
+
(* Load setup.log dynamic variables *)
BaseDynVar.init t.package;
-
+
if not !rno_doc then
begin
info "Running doc step";
@@ -3761,7 +4078,7 @@ module BaseSetup = struct
begin
info "Skipping doc step"
end;
-
+
if not !rno_test then
begin
info "Running test step";
@@ -3771,23 +4088,23 @@ module BaseSetup = struct
begin
info "Skipping test step"
end
-
+
let install t args =
BaseCustom.hook
t.package.install_custom
(t.install t.package)
args
-
+
let uninstall t args =
BaseCustom.hook
t.package.uninstall_custom
(t.uninstall t.package)
args
-
+
let reinstall t args =
uninstall t args;
install t args
-
+
let clean, distclean =
let failsafe f a =
try
@@ -3799,7 +4116,7 @@ module BaseSetup = struct
| Failure msg -> msg
| e -> Printexc.to_string e)
in
-
+
let generic_clean t cstm mains docs tests args =
BaseCustom.hook
~failsafe:true
@@ -3843,7 +4160,7 @@ module BaseSetup = struct
mains)
()
in
-
+
let clean t args =
generic_clean
t
@@ -3853,11 +4170,20 @@ module BaseSetup = struct
t.clean_test
args
in
-
+
let distclean t args =
(* Call clean *)
clean t args;
-
+
+ (* Call distclean code *)
+ generic_clean
+ t
+ t.package.distclean_custom
+ t.distclean
+ t.distclean_doc
+ t.distclean_test
+ args;
+
(* Remove generated file *)
List.iter
(fun fn ->
@@ -3870,23 +4196,143 @@ module BaseSetup = struct
::
BaseLog.default_filename
::
- (List.rev_map BaseFileAB.to_filename t.package.files_ab));
-
- (* Call distclean code *)
- generic_clean
- t
- t.package.distclean_custom
- t.distclean
- t.distclean_doc
- t.distclean_test
- args
+ (List.rev_map BaseFileAB.to_filename t.package.files_ab))
in
-
+
clean, distclean
-
+
let version t _ =
- print_endline t.version
-
+ print_endline t.oasis_version
+
+ let update_setup_ml, no_update_setup_ml_cli =
+ let b = ref true in
+ b,
+ ("-no-update-setup-ml",
+ Arg.Clear b,
+ s_ " Don't try to update setup.ml, even if _oasis has changed.")
+
+ let update_setup_ml t =
+ let oasis_fn =
+ match t.oasis_fn with
+ | Some fn -> fn
+ | None -> "_oasis"
+ in
+ let oasis_exec =
+ match t.oasis_exec with
+ | Some fn -> fn
+ | None -> "oasis"
+ in
+ let ocaml =
+ Sys.executable_name
+ in
+ let setup_ml, args =
+ match Array.to_list Sys.argv with
+ | setup_ml :: args ->
+ setup_ml, args
+ | [] ->
+ failwith
+ (s_ "Expecting non-empty command line arguments.")
+ in
+ let ocaml, setup_ml =
+ if Sys.executable_name = Sys.argv.(0) then
+ (* We are not running in standard mode, probably the script
+ * is precompiled.
+ *)
+ "ocaml", "setup.ml"
+ else
+ ocaml, setup_ml
+ in
+ let no_update_setup_ml_cli, _, _ = no_update_setup_ml_cli in
+ let do_update () =
+ let oasis_exec_version =
+ OASISExec.run_read_one_line
+ ~ctxt:!BaseContext.default
+ ~f_exit_code:
+ (function
+ | 0 ->
+ ()
+ | 1 ->
+ failwithf
+ (f_ "Executable '%s' is probably an old version \
+ of oasis (< 0.3.0), please update to version \
+ v%s.")
+ oasis_exec t.oasis_version
+ | 127 ->
+ failwithf
+ (f_ "Cannot find executable '%s', please install \
+ oasis v%s.")
+ oasis_exec t.oasis_version
+ | n ->
+ failwithf
+ (f_ "Command '%s version' exited with code %d.")
+ oasis_exec n)
+ oasis_exec ["version"]
+ in
+ if OASISVersion.comparator_apply
+ (OASISVersion.version_of_string oasis_exec_version)
+ (OASISVersion.VGreaterEqual
+ (OASISVersion.version_of_string t.oasis_version)) then
+ begin
+ (* We have a version >= for the executable oasis, proceed with
+ * update.
+ *)
+ (* TODO: delegate this check to 'oasis setup'. *)
+ if Sys.os_type = "Win32" then
+ failwithf
+ (f_ "It is not possible to update the running script \
+ setup.ml on Windows. Please update setup.ml by \
+ running '%s'.")
+ (String.concat " " (oasis_exec :: "setup" :: t.oasis_setup_args))
+ else
+ begin
+ OASISExec.run
+ ~ctxt:!BaseContext.default
+ ~f_exit_code:
+ (function
+ | 0 ->
+ ()
+ | n ->
+ failwithf
+ (f_ "Unable to update setup.ml using '%s', \
+ please fix the problem and retry.")
+ oasis_exec)
+ oasis_exec ("setup" :: t.oasis_setup_args);
+ OASISExec.run ~ctxt:!BaseContext.default ocaml (setup_ml :: args)
+ end
+ end
+ else
+ failwithf
+ (f_ "The version of '%s' (v%s) doesn't match the version of \
+ oasis used to generate the %s file. Please install at \
+ least oasis v%s.")
+ oasis_exec oasis_exec_version setup_ml t.oasis_version
+ in
+
+ if !update_setup_ml then
+ begin
+ try
+ match t.oasis_digest with
+ | Some dgst ->
+ if Sys.file_exists oasis_fn && dgst <> Digest.file "_oasis" then
+ begin
+ do_update ();
+ true
+ end
+ else
+ false
+ | None ->
+ false
+ with e ->
+ error
+ (f_ "Error when updating setup.ml. If you want to avoid this error, \
+ you can bypass the update of %s by running '%s %s %s %s'")
+ setup_ml ocaml setup_ml no_update_setup_ml_cli
+ (String.concat " " args);
+ raise e
+ end
+ else
+ false
+
let setup t =
let catch_exn =
ref true
@@ -3898,7 +4344,7 @@ module BaseSetup = struct
(f_ "No action defined, run '%s %s -help'")
Sys.executable_name
Sys.argv.(0))
-
+
in
let extra_args_ref =
ref []
@@ -3910,75 +4356,80 @@ module BaseSetup = struct
Arg.Tuple
[
Arg.Rest (fun str -> extra_args_ref := str :: !extra_args_ref);
-
+
Arg.Unit
(fun () ->
allow_empty_env_ref := allow_empty_env;
act_ref := act);
]
in
-
+
Arg.parse
(Arg.align
- [
+ ([
"-configure",
arg_handle ~allow_empty_env:true configure,
s_ "[options*] Configure the whole build process.";
-
+
"-build",
arg_handle build,
s_ "[options*] Build executables and libraries.";
-
+
"-doc",
arg_handle doc,
s_ "[options*] Build documents.";
-
+
"-test",
arg_handle test,
s_ "[options*] Run tests.";
-
+
"-all",
arg_handle ~allow_empty_env:true all,
s_ "[options*] Run configure, build, doc and test targets.";
-
+
"-install",
arg_handle install,
s_ "[options*] Install libraries, data, executables \
and documents.";
-
+
"-uninstall",
arg_handle uninstall,
s_ "[options*] Uninstall libraries, data, executables \
and documents.";
-
+
"-reinstall",
arg_handle reinstall,
s_ "[options*] Uninstall and install libraries, data, \
executables and documents.";
-
+
"-clean",
arg_handle ~allow_empty_env:true clean,
s_ "[options*] Clean files generated by a build.";
-
+
"-distclean",
arg_handle ~allow_empty_env:true distclean,
s_ "[options*] Clean files generated by a build and configure.";
-
+
"-version",
arg_handle ~allow_empty_env:true version,
s_ " Display version of OASIS used to generate this setup.ml.";
-
+
"-no-catch-exn",
Arg.Clear catch_exn,
s_ " Don't catch exception, useful for debugging.";
]
- @ (BaseContext.args ()))
+ @
+ (if t.setup_update then
+ [no_update_setup_ml_cli]
+ else
+ [])
+ @ (BaseContext.args ())))
(failwithf (f_ "Don't know what to do with '%s'"))
(s_ "Setup and run build process current package\n");
-
+
(* Build initial environment *)
load ~allow_empty:!allow_empty_env_ref ();
-
+
(** Initialize flags *)
List.iter
(function
@@ -4009,90 +4460,37 @@ module BaseSetup = struct
| _ ->
())
t.package.sections;
-
+
BaseStandardVar.init t.package;
-
+
BaseDynVar.init t.package;
-
- !act_ref t (Array.of_list (List.rev !extra_args_ref))
-
+
+ if t.setup_update && update_setup_ml t then
+ ()
+ else
+ !act_ref t (Array.of_list (List.rev !extra_args_ref))
+
with e when !catch_exn ->
error "%s" (Printexc.to_string e);
exit 1
-
-end
-module BaseDev = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/base/BaseDev.ml"
-
-
-
- open OASISGettext
- open BaseMessage
-
- type t =
- {
- oasis_cmd: string;
- }
-
- let update_and_run t =
- (* Command line to run setup-dev *)
- let oasis_args =
- "setup-dev" :: "-run" ::
- Sys.executable_name ::
- (Array.to_list Sys.argv)
- in
-
- let exit_on_child_error =
- function
- | 0 -> ()
- | 2 ->
- (* Bad CLI arguments *)
- error
- (f_ "The command '%s %s' exit with code 2. It often means that we \
- don't use the right command-line arguments, rerun \
- 'oasis setup-dev'.")
- t.oasis_cmd
- (String.concat " " oasis_args)
-
- | 127 ->
- (* Cannot find OASIS *)
- error
- (f_ "Cannot find executable '%s', check where 'oasis' is located \
- and rerun 'oasis setup-dev'")
- t.oasis_cmd
-
- | i ->
- exit i
- in
-
- let () =
- (* Run OASIS to generate a temporary setup.ml
- *)
- BaseExec.run
- ~f_exit_code:exit_on_child_error
- t.oasis_cmd
- oasis_args
- in
-
- ()
-
end
+# 4480 "setup.ml"
module InternalConfigurePlugin = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/plugins/internal/InternalConfigurePlugin.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/plugins/internal/InternalConfigurePlugin.ml"
+
(** Configure using internal scheme
@author Sylvain Le Gall
*)
-
+
open BaseEnv
open OASISTypes
open OASISUtils
open OASISGettext
open BaseMessage
-
+
(** Configure build using provided series of check to be done
* and then output corresponding file.
*)
@@ -4103,15 +4501,15 @@ module InternalConfigurePlugin = struct
in
()
in
-
+
let errors =
ref SetString.empty
in
-
+
let buff =
Buffer.create 13
in
-
+
let add_errors fmt =
Printf.kbprintf
(fun b ->
@@ -4120,11 +4518,11 @@ module InternalConfigurePlugin = struct
buff
fmt
in
-
+
let warn_exception e =
warning "%s" (Printexc.to_string e)
in
-
+
(* Check tools *)
let check_tools lst =
List.iter
@@ -4154,7 +4552,7 @@ module InternalConfigurePlugin = struct
pkg.sections)
lst
in
-
+
let build_checks sct bs =
if var_choose bs.bs_build then
begin
@@ -4168,10 +4566,10 @@ module InternalConfigurePlugin = struct
(f_ "Section %s requires native compilation")
(OASISSection.string_of_section sct)
end;
-
+
(* Check tools *)
check_tools bs.bs_build_tools;
-
+
(* Check depends *)
List.iter
(function
@@ -4211,10 +4609,10 @@ module InternalConfigurePlugin = struct
bs.bs_build_depends
end
in
-
+
(* Parse command line *)
BaseArgExt.parse argv (BaseEnv.args ());
-
+
(* OCaml version *)
begin
match pkg.ocaml_version with
@@ -4236,7 +4634,7 @@ module InternalConfigurePlugin = struct
| None ->
()
end;
-
+
(* Findlib version *)
begin
match pkg.findlib_version with
@@ -4258,7 +4656,18 @@ module InternalConfigurePlugin = struct
| None ->
()
end;
-
+
+ (* FlexDLL *)
+ if BaseStandardVar.os_type () = "Win32" ||
+ BaseStandardVar.os_type () = "Cygwin" then
+ begin
+ try
+ var_ignore_eval BaseStandardVar.flexlink
+ with e ->
+ warn_exception e;
+ add_errors (f_ "Cannot find 'flexlink'")
+ end;
+
(* Check build depends *)
List.iter
(function
@@ -4274,7 +4683,27 @@ module InternalConfigurePlugin = struct
| _ ->
())
pkg.sections;
-
+
+ (* Check if we need native dynlink (presence of libraries that compile to
+ * native)
+ *)
+ begin
+ let has_cmxa =
+ List.exists
+ (function
+ | Library (_, bs, _) ->
+ var_choose bs.bs_build &&
+ (bs.bs_compiled_object = Native ||
+ (bs.bs_compiled_object = Best &&
+ bool_of_string (BaseStandardVar.is_native ())))
+ | _ ->
+ false)
+ pkg.sections
+ in
+ if has_cmxa then
+ var_ignore_eval BaseStandardVar.native_dynlink
+ end;
+
(* Check errors *)
if SetString.empty != !errors then
begin
@@ -4288,16 +4717,16 @@ module InternalConfigurePlugin = struct
(SetString.cardinal !errors))
(SetString.cardinal !errors)
end
-
+
end
module InternalInstallPlugin = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/plugins/internal/InternalInstallPlugin.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/plugins/internal/InternalInstallPlugin.ml"
+
(** Install using internal scheme
@author Sylvain Le Gall
*)
-
+
open BaseEnv
open BaseStandardVar
open BaseMessage
@@ -4305,27 +4734,92 @@ module InternalInstallPlugin = struct
open OASISLibrary
open OASISGettext
open OASISUtils
-
+
let exec_hook =
ref (fun (cs, bs, exec) -> cs, bs, exec)
-
+
let lib_hook =
ref (fun (cs, bs, lib) -> cs, bs, lib, [])
-
+
let doc_hook =
ref (fun (cs, doc) -> cs, doc)
-
+
let install_file_ev =
"install-file"
-
+
let install_dir_ev =
"install-dir"
-
+
let install_findlib_ev =
"install-findlib"
-
+
+ let win32_max_command_line_length = 8000
+
+ let split_install_command ocamlfind findlib_name meta files =
+ if Sys.os_type = "Win32" then
+ (* Arguments for the first command: *)
+ let first_args = ["install"; findlib_name; meta] in
+ (* Arguments for remaining commands: *)
+ let other_args = ["install"; findlib_name; "-add"] in
+ (* Extract as much files as possible from [files], [len] is
+ the current command line length: *)
+ let rec get_files len acc files =
+ match files with
+ | [] ->
+ (List.rev acc, [])
+ | file :: rest ->
+ let len = len + 1 + String.length file in
+ if len > win32_max_command_line_length then
+ (List.rev acc, files)
+ else
+ get_files len (file :: acc) rest
+ in
+ (* Split the command into several commands. *)
+ let rec split args files =
+ match files with
+ | [] ->
+ []
+ | _ ->
+ (* Length of "ocamlfind install <lib> [META|-add]" *)
+ let len =
+ List.fold_left
+ (fun len arg ->
+ len + 1 (* for the space *) + String.length arg)
+ (String.length ocamlfind)
+ args
+ in
+ match get_files len [] files with
+ | ([], _) ->
+ failwith (s_ "Command line too long.")
+ | (firsts, others) ->
+ let cmd = args @ firsts in
+ (* Use -add for remaining commands: *)
+ let () =
+ let findlib_ge_132 =
+ OASISVersion.comparator_apply
+ (OASISVersion.version_of_string
+ (BaseStandardVar.findlib_version ()))
+ (OASISVersion.VGreaterEqual
+ (OASISVersion.version_of_string "1.3.2"))
+ in
+ if not findlib_ge_132 then
+ failwithf
+ (f_ "Installing the library %s require to use the flag \
+ '-add' of ocamlfind because the command line is too \
+ long. This flag is only available for findlib 1.3.2. \
+ Please upgrade findlib from %s to 1.3.2")
+ findlib_name (BaseStandardVar.findlib_version ())
+ in
+ let cmds = split other_args others in
+ cmd :: cmds
+ in
+ (* The first command does not use -add: *)
+ split first_args files
+ else
+ ["install" :: findlib_name :: meta :: files]
+
let install pkg argv =
-
+
let in_destdir =
try
let destdir =
@@ -4338,7 +4832,7 @@ module InternalInstallPlugin = struct
with PropList.Not_set _ ->
fun fn -> fn
in
-
+
let install_file ?tgt_fn src_file envdir =
let tgt_dir =
in_destdir (envdir ())
@@ -4353,27 +4847,29 @@ module InternalInstallPlugin = struct
Filename.basename src_file)
in
(* Create target directory if needed *)
- BaseFileUtil.mkdir_parent
+ OASISFileUtil.mkdir_parent
+ ~ctxt:!BaseContext.default
(fun dn ->
info (f_ "Creating directory '%s'") dn;
BaseLog.register install_dir_ev dn)
tgt_dir;
-
+
(* Really install files *)
info (f_ "Copying file '%s' to '%s'") src_file tgt_file;
- BaseFileUtil.cp src_file tgt_file;
+ OASISFileUtil.cp ~ctxt:!BaseContext.default src_file tgt_file;
BaseLog.register install_file_ev tgt_file
in
-
+
(* Install data into defined directory *)
let install_data srcdir lst tgtdir =
let tgtdir =
- BaseFilePath.of_unix (var_expand tgtdir)
+ OASISHostPath.of_unix (var_expand tgtdir)
in
List.iter
(fun (src, tgt_opt) ->
let real_srcs =
- BaseFileUtil.glob
+ OASISFileUtil.glob
+ ~ctxt:!BaseContext.default
(Filename.concat srcdir src)
in
if real_srcs = [] then
@@ -4387,16 +4883,16 @@ module InternalInstallPlugin = struct
(fun () ->
match tgt_opt with
| Some s ->
- BaseFilePath.of_unix (var_expand s)
+ OASISHostPath.of_unix (var_expand s)
| None ->
tgtdir))
real_srcs)
lst
in
-
+
(** Install all libraries *)
let install_libs pkg =
-
+
let files_of_library (f_data, acc) data_lib =
let cs, bs, lib, lib_extra =
!lib_hook data_lib
@@ -4411,13 +4907,13 @@ module InternalInstallPlugin = struct
let acc =
(* Add uncompiled header from the source tree *)
let path =
- BaseFilePath.of_unix bs.bs_path
+ OASISHostPath.of_unix bs.bs_path
in
List.fold_left
(fun acc modul ->
try
List.find
- Sys.file_exists
+ OASISFileUtil.file_exists_case
(List.map
(Filename.concat path)
[modul^".mli";
@@ -4438,7 +4934,7 @@ module InternalInstallPlugin = struct
acc
lib.lib_modules
in
-
+
let acc =
(* Get generated files *)
BaseBuilt.fold
@@ -4447,7 +4943,7 @@ module InternalInstallPlugin = struct
(fun acc fn -> fn :: acc)
acc
in
-
+
let f_data () =
(* Install data associated with the library *)
install_data
@@ -4458,7 +4954,7 @@ module InternalInstallPlugin = struct
pkg.name);
f_data ()
in
-
+
(f_data, acc)
end
else
@@ -4466,7 +4962,7 @@ module InternalInstallPlugin = struct
(f_data, acc)
end
in
-
+
(* Install one group of library *)
let install_group_lib grp =
(* Iterate through all group nodes *)
@@ -4483,22 +4979,22 @@ module InternalInstallPlugin = struct
data_and_files
children
in
-
+
(* Findlib name of the root library *)
let findlib_name =
findlib_of_group grp
in
-
+
(* Determine root library *)
let root_lib =
root_of_group grp
in
-
+
(* All files to install for this library *)
let f_data, files =
install_group_lib_aux (ignore, []) grp
in
-
+
(* Really install, if there is something to install *)
if files = [] then
begin
@@ -4516,7 +5012,7 @@ module InternalInstallPlugin = struct
let res =
Filename.concat bs.bs_path "META"
in
- if not (Sys.file_exists res) then
+ if not (OASISFileUtil.file_exists_case res) then
failwithf
(f_ "Cannot find file '%s' for findlib library %s")
res
@@ -4554,23 +5050,33 @@ module InternalInstallPlugin = struct
info
(f_ "Installing findlib library '%s'")
findlib_name;
- BaseExec.run
- (ocamlfind ())
- ("install" :: findlib_name :: meta :: files);
+ let ocamlfind = ocamlfind () in
+ let commands =
+ split_install_command
+ ocamlfind
+ findlib_name
+ meta
+ files
+ in
+ List.iter
+ (OASISExec.run ~ctxt:!BaseContext.default ocamlfind)
+ commands;
BaseLog.register install_findlib_ev findlib_name
end;
-
+
(* Install data files *)
f_data ();
-
+
in
-
+
+ let group_libs, _, _ =
+ findlib_mapping pkg
+ in
+
(* We install libraries in groups *)
- List.iter
- install_group_lib
- (group_libs pkg)
+ List.iter install_group_lib group_libs
in
-
+
let install_execs pkg =
let install_exec data_exec =
let (cs, bs, exec) =
@@ -4589,7 +5095,7 @@ module InternalInstallPlugin = struct
cs.cs_name
(fun () fn ->
install_file
- ~tgt_fn:cs.cs_name
+ ~tgt_fn:(cs.cs_name ^ ext_program ())
fn
bindir)
();
@@ -4617,7 +5123,7 @@ module InternalInstallPlugin = struct
())
pkg.sections
in
-
+
let install_docs pkg =
let install_doc data =
let (cs, doc) =
@@ -4627,7 +5133,7 @@ module InternalInstallPlugin = struct
BaseBuilt.is_built BaseBuilt.BDoc cs.cs_name then
begin
let tgt_dir =
- BaseFilePath.of_unix (var_expand doc.doc_install_dir)
+ OASISHostPath.of_unix (var_expand doc.doc_install_dir)
in
BaseBuilt.fold
BaseBuilt.BDoc
@@ -4651,18 +5157,18 @@ module InternalInstallPlugin = struct
())
pkg.sections
in
-
+
install_libs pkg;
install_execs pkg;
install_docs pkg
-
+
(* Uninstall already installed data *)
let uninstall _ argv =
List.iter
(fun (ev, data) ->
if ev = install_file_ev then
begin
- if Sys.file_exists data then
+ if OASISFileUtil.file_exists_case data then
begin
info
(f_ "Removing file '%s'")
@@ -4685,7 +5191,7 @@ module InternalInstallPlugin = struct
info
(f_ "Removing directory '%s'")
data;
- BaseFileUtil.rmdir data
+ OASISFileUtil.rmdir ~ctxt:!BaseContext.default data
end
else
begin
@@ -4708,7 +5214,8 @@ module InternalInstallPlugin = struct
else if ev = install_findlib_ev then
begin
info (f_ "Removing findlib library '%s'") data;
- BaseExec.run (ocamlfind ()) ["remove"; data]
+ OASISExec.run ~ctxt:!BaseContext.default
+ (ocamlfind ()) ["remove"; data]
end
else
failwithf (f_ "Unknown log event '%s'") ev;
@@ -4719,29 +5226,30 @@ module InternalInstallPlugin = struct
[install_file_ev;
install_dir_ev;
install_findlib_ev;]))
-
+
end
+# 5233 "setup.ml"
module OCamlbuildCommon = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/plugins/ocamlbuild/OCamlbuildCommon.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/plugins/ocamlbuild/OCamlbuildCommon.ml"
+
(** Functions common to OCamlbuild build and doc plugin
*)
-
+
open OASISGettext
open BaseEnv
open BaseStandardVar
-
+
let ocamlbuild_clean_ev =
"ocamlbuild-clean"
-
+
let ocamlbuildflags =
var_define
~short_desc:(fun () -> "OCamlbuild additional flags")
"ocamlbuildflags"
(fun () -> "")
-
+
(** Fix special arguments depending on environment *)
let fix_args args extra_argv =
List.flatten
@@ -4756,7 +5264,7 @@ module OCamlbuildCommon = struct
]
else
[];
-
+
if not (bool_of_string (is_native ())) || (os_type ()) = "Win32" then
[
"-byte-plugin"
@@ -4764,22 +5272,22 @@ module OCamlbuildCommon = struct
else
[];
args;
-
+
if bool_of_string (debug ()) then
["-tag"; "debug"]
else
[];
-
+
if bool_of_string (profile ()) then
["-tag"; "profile"]
else
[];
-
- OASISUtils.split ' ' (ocamlbuildflags ());
-
+
+ OASISString.nsplit (ocamlbuildflags ()) ' ';
+
Array.to_list extra_argv;
]
-
+
(** Run 'ocamlbuild -clean' if not already done *)
let run_clean extra_argv =
let extra_cli =
@@ -4788,7 +5296,8 @@ module OCamlbuildCommon = struct
(* Run if never called with these args *)
if not (BaseLog.exists ocamlbuild_clean_ev extra_cli) then
begin
- BaseExec.run (ocamlbuild ()) (fix_args ["-clean"] extra_argv);
+ OASISExec.run ~ctxt:!BaseContext.default
+ (ocamlbuild ()) (fix_args ["-clean"] extra_argv);
BaseLog.register ocamlbuild_clean_ev extra_cli;
at_exit
(fun () ->
@@ -4797,17 +5306,18 @@ module OCamlbuildCommon = struct
with _ ->
())
end
-
+
(** Run ocamlbuild, unregister all clean events *)
let run_ocamlbuild args extra_argv =
(* TODO: enforce that target in args must be UNIX encoded i.e. toto/index.html
*)
- BaseExec.run (ocamlbuild ()) (fix_args args extra_argv);
+ OASISExec.run ~ctxt:!BaseContext.default
+ (ocamlbuild ()) (fix_args args extra_argv);
(* Remove any clean event, we must run it again *)
List.iter
(fun (e, d) -> BaseLog.unregister e d)
(BaseLog.filter [ocamlbuild_clean_ev])
-
+
(** Determine real build directory *)
let build_dir extra_argv =
let rec search_args dir =
@@ -4820,16 +5330,16 @@ module OCamlbuildCommon = struct
dir
in
search_args "_build" (fix_args [] extra_argv)
-
+
end
module OCamlbuildPlugin = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/plugins/ocamlbuild/OCamlbuildPlugin.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/plugins/ocamlbuild/OCamlbuildPlugin.ml"
+
(** Build using ocamlbuild
@author Sylvain Le Gall
*)
-
+
open OASISTypes
open OASISGettext
open OASISUtils
@@ -4837,24 +5347,24 @@ module OCamlbuildPlugin = struct
open OCamlbuildCommon
open BaseStandardVar
open BaseMessage
-
+
let cond_targets_hook =
ref (fun lst -> lst)
-
+
let build pkg argv =
-
+
(* Return the filename in build directory *)
let in_build_dir fn =
Filename.concat
(build_dir argv)
fn
in
-
+
(* Return the unix filename in host build directory *)
let in_build_dir_of_unix fn =
- in_build_dir (BaseFilePath.of_unix fn)
+ in_build_dir (OASISHostPath.of_unix fn)
in
-
+
let cond_targets =
List.fold_left
(fun acc ->
@@ -4866,7 +5376,7 @@ module OCamlbuildPlugin = struct
in_build_dir_of_unix
(cs, bs, lib)
in
-
+
let ends_with nd fn =
let nd_len =
String.length nd
@@ -4878,7 +5388,7 @@ module OCamlbuildPlugin = struct
(String.length fn - nd_len)
nd_len) = nd
in
-
+
let tgts =
List.flatten
(List.filter
@@ -4886,13 +5396,14 @@ module OCamlbuildPlugin = struct
(List.map
(List.filter
(fun fn ->
- ends_with ".cma" fn ||
- ends_with ".cmxa" fn ||
- ends_with (ext_lib ()) fn ||
- ends_with (ext_dll ()) fn))
+ ends_with ".cma" fn
+ || ends_with ".cmxs" fn
+ || ends_with ".cmxa" fn
+ || ends_with (ext_lib ()) fn
+ || ends_with (ext_dll ()) fn))
unix_files))
in
-
+
match tgts with
| _ :: _ ->
(evs, tgts) :: acc
@@ -4901,7 +5412,7 @@ module OCamlbuildPlugin = struct
(f_ "No possible ocamlbuild targets for library %s")
cs.cs_name
end
-
+
| Executable (cs, bs, exec) when var_choose bs.bs_build ->
begin
let evs, unix_exec_is, unix_dll_opt =
@@ -4909,12 +5420,12 @@ module OCamlbuildPlugin = struct
in_build_dir_of_unix
(cs, bs, exec)
in
-
+
let target ext =
let unix_tgt =
- (BaseFilePath.Unix.concat
+ (OASISUnixPath.concat
bs.bs_path
- (BaseFilePath.Unix.chop_extension
+ (OASISUnixPath.chop_extension
exec.exec_main_is))^ext
in
let evs =
@@ -4929,7 +5440,7 @@ module OCamlbuildPlugin = struct
in
evs, [unix_tgt]
in
-
+
(* Add executable *)
let acc =
match bs.bs_compiled_object with
@@ -4943,7 +5454,7 @@ module OCamlbuildPlugin = struct
in
acc
end
-
+
| Library _ | Executable _ | Test _
| SrcRepo _ | Flag _ | Doc _ ->
acc)
@@ -4951,24 +5462,24 @@ module OCamlbuildPlugin = struct
(* Keep the pkg.sections ordered *)
(List.rev pkg.sections);
in
-
+
(* Check and register built files *)
let check_and_register (bt, bnm, lst) =
List.iter
(fun fns ->
- if not (List.exists Sys.file_exists fns) then
+ if not (List.exists OASISFileUtil.file_exists_case fns) then
failwithf
(f_ "No one of expected built files %s exists")
(String.concat (s_ ", ") (List.map (Printf.sprintf "'%s'") fns)))
lst;
(BaseBuilt.register bt bnm lst)
in
-
+
let cond_targets =
(* Run the hook *)
!cond_targets_hook cond_targets
in
-
+
(* Run a list of target... *)
run_ocamlbuild
(List.flatten
@@ -4978,8 +5489,8 @@ module OCamlbuildPlugin = struct
List.iter
check_and_register
(List.flatten (List.map fst cond_targets))
-
-
+
+
let clean pkg extra_args =
run_clean extra_args;
List.iter
@@ -4992,27 +5503,27 @@ module OCamlbuildPlugin = struct
| _ ->
())
pkg.sections
-
+
end
module OCamlbuildDocPlugin = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/plugins/ocamlbuild/OCamlbuildDocPlugin.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/plugins/ocamlbuild/OCamlbuildDocPlugin.ml"
+
(* Create documentation using ocamlbuild .odocl files
@author Sylvain Le Gall
*)
-
+
open OASISTypes
open OASISGettext
open OASISMessage
open OCamlbuildCommon
open BaseStandardVar
-
-
-
+
+
+
let doc_build path pkg (cs, doc) argv =
let index_html =
- BaseFilePath.Unix.make
+ OASISUnixPath.make
[
path;
cs.cs_name^".docdir";
@@ -5020,10 +5531,10 @@ module OCamlbuildDocPlugin = struct
]
in
let tgt_dir =
- BaseFilePath.make
+ OASISHostPath.make
[
build_dir argv;
- BaseFilePath.of_unix path;
+ OASISHostPath.of_unix path;
cs.cs_name^".docdir";
]
in
@@ -5033,58 +5544,60 @@ module OCamlbuildDocPlugin = struct
BaseBuilt.register
BaseBuilt.BDoc
cs.cs_name
- [BaseFileUtil.glob
+ [OASISFileUtil.glob ~ctxt:!BaseContext.default
(Filename.concat tgt_dir glb)])
["*.html"; "*.css"]
-
+
let doc_clean t pkg (cs, doc) argv =
run_clean argv;
BaseBuilt.unregister BaseBuilt.BDoc cs.cs_name
-
+
end
+# 5558 "setup.ml"
module NonePlugin = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/plugins/none/NonePlugin.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/plugins/none/NonePlugin.ml"
+
(** Plugin to handle "none" generation
@author Sylvain Le Gall
*)
-
+
open OASISGettext
open OASISUtils
-
+
let not_implemented str _ _ =
failwithf (f_ "No implementation for %s") str
-
+
let section_not_implemented str pkg _ _ extra_args =
not_implemented str pkg extra_args
-
+
end
+# 5578 "setup.ml"
module CustomPlugin = struct
-# 21 "/Users/dbuenzli/tmp/ocaml/oasis-0.3.0~rc2/src/plugins/custom/CustomPlugin.ml"
-
+# 21 "/Users/dbuenzli/.odb/install-oasis/oasis-0.3.0/src/plugins/custom/CustomPlugin.ml"
+
(** Generate custom configure/build/doc/test/install system
@author
*)
-
+
open BaseEnv
open OASISGettext
open OASISTypes
-
-
-
+
+
+
type t =
{
cmd_main: command_line conditional;
cmd_clean: (command_line option) conditional;
cmd_distclean: (command_line option) conditional;
}
-
+
let run = BaseCustom.run
-
+
let main t _ extra_args =
let cmd, args =
var_choose
@@ -5092,21 +5605,21 @@ module CustomPlugin = struct
t.cmd_main
in
run cmd args extra_args
-
+
let clean t pkg extra_args =
match var_choose t.cmd_clean with
| Some (cmd, args) ->
run cmd args extra_args
| _ ->
()
-
+
let distclean t pkg extra_args =
match var_choose t.cmd_distclean with
| Some (cmd, args) ->
run cmd args extra_args
| _ ->
()
-
+
module Build =
struct
let main t pkg extra_args =
@@ -5119,7 +5632,7 @@ module CustomPlugin = struct
begin
let evs, _ =
BaseBuilt.of_library
- BaseFilePath.of_unix
+ OASISHostPath.of_unix
(cs, bs, lib)
in
evs
@@ -5128,7 +5641,7 @@ module CustomPlugin = struct
begin
let evs, _, _ =
BaseBuilt.of_executable
- BaseFilePath.of_unix
+ OASISHostPath.of_unix
(cs, bs, exec)
in
evs
@@ -5140,7 +5653,7 @@ module CustomPlugin = struct
(fun (bt, bnm, lst) -> BaseBuilt.register bt bnm lst)
evs)
pkg.sections
-
+
let clean t pkg extra_args =
clean t pkg extra_args;
(* TODO: this seems to be pretty generic (at least wrt to ocamlbuild
@@ -5156,11 +5669,11 @@ module CustomPlugin = struct
| _ ->
())
pkg.sections
-
+
let distclean t pkg extra_args =
distclean t pkg extra_args
end
-
+
module Test =
struct
let main t pkg (cs, test) extra_args =
@@ -5173,31 +5686,32 @@ module CustomPlugin = struct
cs.cs_name
s;
1.0
-
+
let clean t pkg (cs, test) extra_args =
clean t pkg extra_args
-
+
let distclean t pkg (cs, test) extra_args =
distclean t pkg extra_args
end
-
+
module Doc =
struct
let main t pkg (cs, _) extra_args =
main t pkg extra_args;
BaseBuilt.register BaseBuilt.BDoc cs.cs_name []
-
+
let clean t pkg (cs, _) extra_args =
clean t pkg extra_args;
BaseBuilt.unregister BaseBuilt.BDoc cs.cs_name
-
+
let distclean t pkg (cs, _) extra_args =
distclean t pkg extra_args
end
-
+
end
+# 5714 "setup.ml"
open OASISTypes;;
let setup_t =
@@ -5218,9 +5732,9 @@ let setup_t =
doc =
[
("api", OCamlbuildDocPlugin.doc_build "doc");
- ("samples", NonePlugin.not_implemented "doc of section samples");
("distribution",
- NonePlugin.not_implemented "doc of section distribution")
+ NonePlugin.not_implemented "doc of section distribution");
+ ("samples", NonePlugin.not_implemented "doc of section samples")
];
install = InternalInstallPlugin.install;
uninstall = InternalInstallPlugin.uninstall;
@@ -5256,14 +5770,15 @@ let setup_t =
ocaml_version = Some (OASISVersion.VGreaterEqual "3.11.0");
findlib_version = None;
name = "react";
- version = "0.9.3";
+ version = "0.9.4";
license =
OASISLicense.DEP5License
- {
- OASISLicense.license = "BSD3";
- exceptions = [];
- version = OASISLicense.NoVersion;
- };
+ (OASISLicense.DEP5Unit
+ {
+ OASISLicense.license = "BSD3";
+ excption = None;
+ version = OASISLicense.NoVersion;
+ });
license_file = None;
copyrights = ["(c) 2009-2012 Daniel C. Bünzli"];
maintainers = [];
@@ -5367,51 +5882,6 @@ let setup_t =
bs_nativeopt = [(OASISExpr.EBool true, [])];
},
{exec_custom = false; exec_main_is = "clock.ml"; });
- SrcRepo
- ({
- cs_name = "head";
- cs_data = PropList.Data.create ();
- cs_plugin_data = [];
- },
- {
- src_repo_type = Git;
- src_repo_location =
- "git://erratique.ch/repos/react.git";
- src_repo_browser =
- Some "http://erratique.ch/repos/react";
- src_repo_module = None;
- src_repo_branch = None;
- src_repo_tag = None;
- src_repo_subdir = None;
- });
- Doc
- ({
- cs_name = "api";
- cs_data = PropList.Data.create ();
- cs_plugin_data = [];
- },
- {
- doc_type = (`Doc, "ocamlbuild", Some "0.3");
- doc_custom =
- {
- pre_command = [(OASISExpr.EBool true, None)];
- post_command = [(OASISExpr.EBool true, None)];
- };
- doc_build =
- [
- (OASISExpr.EBool true, false);
- (OASISExpr.EFlag "docs", true)
- ];
- doc_install = [(OASISExpr.EBool true, true)];
- doc_install_dir = "$docdir";
- doc_title = "React's documentation and API reference";
- doc_authors = [];
- doc_abstract = None;
- doc_format = OtherDoc;
- doc_data_files = [];
- doc_build_tools =
- [ExternalTool "ocamlbuild"; ExternalTool "ocamldoc"];
- });
Executable
({
cs_name = "breakout";
@@ -5439,6 +5909,29 @@ let setup_t =
bs_nativeopt = [(OASISExpr.EBool true, [])];
},
{exec_custom = false; exec_main_is = "breakout.ml"; });
+ Executable
+ ({
+ cs_name = "test";
+ cs_data = PropList.Data.create ();
+ cs_plugin_data = [];
+ },
+ {
+ bs_build = [(OASISExpr.EBool true, true)];
+ bs_install = [(OASISExpr.EBool true, false)];
+ bs_path = "test";
+ bs_compiled_object = Best;
+ bs_build_depends = [InternalLibrary "react"];
+ bs_build_tools = [ExternalTool "ocamlbuild"];
+ bs_c_sources = [];
+ bs_data_files = [];
+ bs_ccopt = [(OASISExpr.EBool true, [])];
+ bs_cclib = [(OASISExpr.EBool true, [])];
+ bs_dlllib = [(OASISExpr.EBool true, [])];
+ bs_dllpath = [(OASISExpr.EBool true, [])];
+ bs_byteopt = [(OASISExpr.EBool true, [])];
+ bs_nativeopt = [(OASISExpr.EBool true, [])];
+ },
+ {exec_custom = false; exec_main_is = "test.ml"; });
Test
({
cs_name = "test";
@@ -5456,19 +5949,19 @@ let setup_t =
test_working_directory = None;
test_run =
[
- (OASISExpr.EBool true, false);
+ (OASISExpr.ENot (OASISExpr.EFlag "tests"), false);
(OASISExpr.EFlag "tests", true)
];
test_tools = [ExternalTool "ocamlbuild"];
});
Doc
({
- cs_name = "samples";
+ cs_name = "api";
cs_data = PropList.Data.create ();
cs_plugin_data = [];
},
{
- doc_type = (`Doc, "none", Some "0.3");
+ doc_type = (`Doc, "ocamlbuild", Some "0.3");
doc_custom =
{
pre_command = [(OASISExpr.EBool true, None)];
@@ -5476,44 +5969,49 @@ let setup_t =
};
doc_build =
[
- (OASISExpr.EBool true, false);
+ (OASISExpr.ENot (OASISExpr.EFlag "docs"), false);
(OASISExpr.EFlag "docs", true)
];
doc_install = [(OASISExpr.EBool true, true)];
doc_install_dir = "$docdir";
- doc_title = "\"React's sample code\"";
+ doc_title = "React's documentation and API reference";
doc_authors = [];
doc_abstract = None;
doc_format = OtherDoc;
- doc_data_files = [("test/*.ml", None)];
- doc_build_tools = [ExternalTool "ocamlbuild"];
+ doc_data_files = [];
+ doc_build_tools =
+ [ExternalTool "ocamlbuild"; ExternalTool "ocamldoc"];
});
- Executable
+ Doc
({
- cs_name = "test";
+ cs_name = "distribution";
cs_data = PropList.Data.create ();
cs_plugin_data = [];
},
{
- bs_build = [(OASISExpr.EBool true, true)];
- bs_install = [(OASISExpr.EBool true, false)];
- bs_path = "test";
- bs_compiled_object = Best;
- bs_build_depends = [InternalLibrary "react"];
- bs_build_tools = [ExternalTool "ocamlbuild"];
- bs_c_sources = [];
- bs_data_files = [];
- bs_ccopt = [(OASISExpr.EBool true, [])];
- bs_cclib = [(OASISExpr.EBool true, [])];
- bs_dlllib = [(OASISExpr.EBool true, [])];
- bs_dllpath = [(OASISExpr.EBool true, [])];
- bs_byteopt = [(OASISExpr.EBool true, [])];
- bs_nativeopt = [(OASISExpr.EBool true, [])];
- },
- {exec_custom = false; exec_main_is = "test.ml"; });
+ doc_type = (`Doc, "none", Some "0.3");
+ doc_custom =
+ {
+ pre_command = [(OASISExpr.EBool true, None)];
+ post_command = [(OASISExpr.EBool true, None)];
+ };
+ doc_build =
+ [
+ (OASISExpr.ENot (OASISExpr.EFlag "docs"), false);
+ (OASISExpr.EFlag "docs", true)
+ ];
+ doc_install = [(OASISExpr.EBool true, true)];
+ doc_install_dir = "$docdir";
+ doc_title = "\"React's README and CHANGES files\"";
+ doc_authors = [];
+ doc_abstract = None;
+ doc_format = OtherDoc;
+ doc_data_files = [("README CHANGES", None)];
+ doc_build_tools = [ExternalTool "ocamlbuild"];
+ });
Doc
({
- cs_name = "distribution";
+ cs_name = "samples";
cs_data = PropList.Data.create ();
cs_plugin_data = [];
},
@@ -5526,28 +6024,50 @@ let setup_t =
};
doc_build =
[
- (OASISExpr.EBool true, false);
+ (OASISExpr.ENot (OASISExpr.EFlag "docs"), false);
(OASISExpr.EFlag "docs", true)
];
doc_install = [(OASISExpr.EBool true, true)];
doc_install_dir = "$docdir";
- doc_title = "\"React's README and CHANGES files\"";
+ doc_title = "\"React's sample code\"";
doc_authors = [];
doc_abstract = None;
doc_format = OtherDoc;
- doc_data_files = [("README CHANGES", None)];
+ doc_data_files = [("test/*.ml", None)];
doc_build_tools = [ExternalTool "ocamlbuild"];
+ });
+ SrcRepo
+ ({
+ cs_name = "head";
+ cs_data = PropList.Data.create ();
+ cs_plugin_data = [];
+ },
+ {
+ src_repo_type = Git;
+ src_repo_location =
+ "git://erratique.ch/repos/react.git";
+ src_repo_browser =
+ Some "http://erratique.ch/repos/react";
+ src_repo_module = None;
+ src_repo_branch = None;
+ src_repo_tag = None;
+ src_repo_subdir = None;
})
];
plugins = [(`Extra, "META", Some "0.3")];
schema_data = PropList.Data.create ();
plugin_data = [];
};
- version = "0.3.0~rc2";
+ oasis_fn = Some "_oasis";
+ oasis_version = "0.3.0";
+ oasis_digest = Some "RÖH\127±\015tÝPX68Ý\002\025Á";
+ oasis_exec = None;
+ oasis_setup_args = [];
+ setup_update = false;
};;
let setup () = BaseSetup.setup setup_t;;
-# 5552 "setup.ml"
+# 6072 "setup.ml"
(* OASIS_STOP *)
let () = setup ();;
diff --git a/src/META b/src/META
index 9d15ad2..4beca66 100644
--- a/src/META
+++ b/src/META
@@ -1,9 +1,11 @@
# OASIS_START
-# DO NOT EDIT (digest: 67e0b4b952e6b53c1b8d47309f63f507)
-version = "0.9.3"
+# DO NOT EDIT (digest: d8fbd39ff38100842999af9571ea8121)
+version = "0.9.4"
description = "Declarative events and signals for OCaml"
archive(byte) = "react.cma"
+archive(byte, plugin) = "react.cma"
archive(native) = "react.cmxa"
+archive(native, plugin) = "react.cmxs"
exists_if = "react.cma"
# OASIS_STOP
diff --git a/src/react.ml b/src/react.ml
index ea4dfe3..402ed55 100644
--- a/src/react.ml
+++ b/src/react.ml
@@ -1,7 +1,7 @@
(*---------------------------------------------------------------------------
Copyright (c) 2009-2012 Daniel C. Bünzli. All rights reserved.
Distributed under a BSD3 license, see license at the end of the file.
- react release 0.9.3
+ react release 0.9.4
---------------------------------------------------------------------------*)
let err_max_rank = "maximal rank exceeded"
diff --git a/src/react.mli b/src/react.mli
index 0a2b5d8..8a0388c 100644
--- a/src/react.mli
+++ b/src/react.mli
@@ -1,7 +1,7 @@
(*---------------------------------------------------------------------------
Copyright (c) 2009-2012 Daniel C. Bünzli. All rights reserved.
Distributed under a BSD3 license, see license at the end of the file.
- react release 0.9.3
+ react release 0.9.4
---------------------------------------------------------------------------*)
(** 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 0.9.3 - Daniel Bünzli <daniel.buenzli at erratique.ch> } *)
+ {e Release 0.9.4 - Daniel Bünzli <daniel.buenzli at erratique.ch> } *)
(** {1 Interface} *)