Primitive and basics
type 'a t = 'a signal
The type for signals of type 'a
.
val const : 'a -> 'a signal
const v
is always v
, [const v
]t = v
.
create i
is a primitive signal s
set to i
and a set
function. The function set
is such that:
set v
sets the signal's value tov
at the time it is called and triggers an update step.set ~step v
sets the signal's value tov
at the time it is called and updates it dependencies whenstep
is executedset ~step v
raisesInvalid_argument
if it was previously called with a step and this step has not executed yet or if the givenstep
was already executed.
Warning. set
must not be executed inside an update step.
val value : 'a signal -> 'a
value s
is s
's current value.
Warning. If executed in an update step may return a non up-to-date value or raise Failure
if the signal is not yet initialized.
val retain : 'a signal -> (unit -> unit) -> [ `R of unit -> unit ]
retain s c
keeps a reference to the closure c
in s
and returns the previously retained value. c
will never be invoked.
Raises. Invalid_argument
on constant signals.
val stop : ?strong:bool -> 'a signal -> unit
stop s
, stops updating s
. It conceptually becomes const
with the signal's last value and cannot be restarted. Allows to disable effectful signals.
The strong
argument should only be used on platforms where weak arrays have a strong semantics (i.e. JavaScript). See details.
Note. If executed in an update step the signal may still update in the step.
trace iff tr s
is s
except tr
is invoked with s
's current value and on s
changes when iff
is true
(defaults to S.const true
). For all t where [s
]t = v
and (t = 0 or ([s
]t-dt= v'
and eq v v' = false
)) and [iff
]t = true
, tr
is invoked with v
.
From events
hold i e
has the value of e
's last occurrence or i
if there wasn't any.
- [
hold i e
]t= i
if [e
]<=t= None
- [
hold i e
]t= v
if [e
]<=t= Some v
Transforming and filtering
app sf s
holds the value of sf
applied to the value of s
, [app sf s
]t =
[sf
]t [s
]t.
map f s
is s
transformed by f
, [map f s
]t = f
[s
]t.
filter f i s
is s
's values that satisfy p
. If a value does not satisfy p
it holds the last value that was satisfied or i
if there is none.
- [
filter p s
]t=
[s
]t ifp
[s
]t= true
. - [
filter p s
]t=
[s
]t' ifp
[s
]t= false
and t' is the greatest t' < t withp
[s
]t'= true
. - [
filter p e
]t= i
otherwise.
fmap fm i s
is s
filtered and mapped by fm
.
- [
fmap fm i s
]t=
v iffm
[s
]t= Some v
. - [
fmap fm i s
]t=
[fmap fm i s
]t' iffm
[s
]t= None
and t' is the greatest t' < t withfm
[s
]t'<> None
. - [
fmap fm i s
]t= i
otherwise.
diff f s
is an event with occurrences whenever s
changes from v'
to v
and eq v v'
is false
(eq
is the signal's equality function). The value of the occurrence is f v v'
.
- [
diff f s
]t= Some d
if [s
]t= v
and [s
]t-dt= v'
andeq v v' = false
andf v v' = d
. - [
diff f s
]t= None
otherwise.
sample f e s
samples s
at e
's occurrences.
- [
sample f e s
]t= Some (f ev sv)
if [e
]t= Some ev
and [s
]t= sv
. - [
sample e s
]t= None
otherwise.
on c i s
is the signal s
whenever c
is true
. When c
is false
it holds the last value s
had when c
was the last time true
or i
if it never was.
- [
on c i s
]t=
[s
]t if [c
]t= true
- [
on c i s
]t=
[s
]t' if [c
]t= false
where t' is the greatest t' < t with [c
]t'= true
. - [
on c i s
]t=
i
otherwise.
dismiss c i s
is the signal s
except changes when c
occurs are ignored. If c
occurs initially i
is used.
- [
dismiss c i s
]t=
[s
]t' where t' is the greatest t' <= t with [c
]t'= None
and [s
]t'-dt<>
[s
]t' - [
dismiss_ c i s
]0=
v
wherev = i
if [c
]0= Some _
andv =
[s
]0 otherwise.
Accumulating
accum e i
is S.hold i (
E:accum
e i)
.
fold f i e
is S.hold i (
E.fold
f i e)
.
Combining
merge f a sl
merges the value of every signal in sl
using f
and the accumulator a
.
[merge f a sl
]t = List.fold_left f a (List.map
[]t sl)
.
switch ss
is the inner signal of ss
.
- [
switch ss
]t=
[[ss
]t]t.
bind s sf
is switch (map ~eq:( == ) sf s)
.
fix i sf
allow to refer to the value a signal had an infinitesimal amount of time before.
In fix sf
, sf
is called with a signal s
that represents the signal returned by sf
delayed by an infinitesimal amount time. If s', r = sf s
then r
is returned by fix
and s
is such that :
- [
s
]t=
i
for t = 0. - [
s
]t=
[s'
]t-dt otherwise.
eq
is the equality used by s
.
Raises. Invalid_argument
if s'
is directly a delayed signal (i.e. a signal given to a fixing function).
Note. Regarding values depending on the result r
of s', r = sf s
the following two cases need to be distinguished :
After
sf s
is applied,s'
does not depend on a value that is in a step ands
has no dependents in a step (e.g in the simple case wherefix
is applied outside a step).In that case if the initial value of
s'
differs fromi
,s
and its dependents need to be updated and a special update step will be triggered for this. Values depending on the resultr
will be created only after this special update step has finished (e.g. they won't see thei
ofs
ifr = s
).- Otherwise, values depending on
r
will be created in the same step ass
ands'
(e.g. they will see thei
ofs
ifr = s
).
Lifting
val l3 : ?eq:('d -> 'd -> bool) -> ('a -> 'b -> 'c -> 'd) -> 'a signal -> 'b signal -> 'c signal -> 'd signal
val l4 : ?eq:('e -> 'e -> bool) -> ('a -> 'b -> 'c -> 'd -> 'e) -> 'a signal -> 'b signal -> 'c signal -> 'd signal -> 'e signal
val l5 : ?eq:('f -> 'f -> bool) -> ('a -> 'b -> 'c -> 'd -> 'e -> 'f) -> 'a signal -> 'b signal -> 'c signal -> 'd signal -> 'e signal -> 'f signal
val l6 : ?eq:('g -> 'g -> bool) -> ('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g) -> 'a signal -> 'b signal -> 'c signal -> 'd signal -> 'e signal -> 'f signal -> 'g signal
module Bool : sig ... end
module Int : sig ... end
module Float : sig ... end
module Pair : sig ... end
module Option : sig ... end
module Compare : sig ... end
Combinator specialization
Functor specializing the combinators for the given signal value type
module Special : sig ... end
Specialization for booleans, integers and floats.