Module React.E
Event combinators.
Consult their semantics.
Primitive and basics
type 'a t
= 'a event
The type for events with occurrences of type
'a
.
val never : 'a event
A never occuring event. For all t, [
never
]t= None
.
val create : unit -> 'a event * (?step:step -> 'a -> unit)
create ()
is a primitive evente
and asend
function. The functionsend
is such that:send v
generates an occurrencev
ofe
at the time it is called and triggers an update step.send ~step v
generates an occurencev
ofe
on the stepstep
whenstep
is executed.send ~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.
send
must not be executed inside an update step.
val retain : 'a event -> (unit -> unit) -> [ `R of unit -> unit ]
retain e c
keeps a reference to the closurec
ine
and returns the previously retained value.c
will never be invoked.Raises.
Invalid_argument
onE.never
.
val stop : ?strong:bool -> 'a event -> unit
stop e
stopse
from occuring. It conceptually becomesnever
and cannot be restarted. Allows to disable effectful events.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 event may still occur in the step.
Transforming and filtering
val once : 'a event -> 'a event
once e
ise
with only its next occurence.- [
once e
]t= Some v
if [e
]t= Some v
and [e
]<t= None
. - [
once e
]t= None
otherwise.
- [
val drop_once : 'a event -> 'a event
drop_once e
ise
without its next occurrence.- [
drop_once e
]t= Some v
if [e
]t= Some v
and [e
]<t= Some _
. - [
drop_once e
]t= None
otherwise.
- [
val app : ('a -> 'b) event -> 'a event -> 'b event
app ef e
occurs when bothef
ande
occur simultaneously. The value isef
's occurence applied toe
's one.- [
app ef e
]t= Some v'
if [ef
]t= Some f
and [e
]t= Some v
andf v = v'
. - [
app ef e
]t= None
otherwise.
- [
val map : ('a -> 'b) -> 'a event -> 'b event
map f e
appliesf
toe
's occurrences.- [
map f e
]t= Some (f v)
if [e
]t= Some v
. - [
map f e
]t= None
otherwise.
- [
val filter : ('a -> bool) -> 'a event -> 'a event
filter p e
aree
's occurrences that satisfyp
.- [
filter p e
]t= Some v
if [e
]t= Some v
andp v = true
- [
filter p e
]t= None
otherwise.
- [
val fmap : ('a -> 'b option) -> 'a event -> 'b event
fmap fm e
aree
's occurrences filtered and mapped byfm
.- [
fmap fm e
]t= Some v
iffm
[e
]t= Some v
- [
fmap fm e
]t= None
otherwise.
- [
val diff : ('a -> 'a -> 'b) -> 'a event -> 'b event
diff f e
occurs whenevere
occurs except on the next occurence. Occurences aref v v'
wherev
ise
's current occurrence andv'
the previous one.- [
diff f e
]t= Some r
if [e
]t= Some v
, [e
]<t= Some v'
andf v v' = r
. - [
diff f e
]t= None
otherwise.
- [
val changes : ?eq:('a -> 'a -> bool) -> 'a event -> 'a event
changes eq e
ise
's occurrences with occurences equal to the previous one dropped. Equality is tested witheq
(defaults to structural equality).- [
changes eq e
]t= Some v
if [e
]t= Some v
and either [e
]<t= None
or [e
]<t= Some v'
andeq v v' = false
. - [
changes eq e
]t= None
otherwise.
- [
val on : bool signal -> 'a event -> 'a event
on c e
is the occurrences ofe
whenc
istrue
.- [
on c e
]t= Some v
if [c
]t= true
and [e
]t= Some v
. - [
on c e
]t= None
otherwise.
- [
Accumulating
Combining
val select : 'a event list -> 'a event
select el
is the occurrences of every event inel
. If more than one event occurs simultaneously the leftmost is taken and the others are lost.- [
select el
]t=
[List.find (fun e ->
[e
]t<> None) el
]t. - [
select el
]t= None
otherwise.
- [
val merge : ('a -> 'b -> 'a) -> 'a -> 'b event list -> 'a event
merge f a el
merges the simultaneous occurrences of every event inel
usingf
and the accumulatora
.[
merge f a el
]t= List.fold_left f a (List.filter (fun o -> o <> None) (List.map
[]tel))
.
val switch : 'a event -> 'a event event -> 'a event
switch e ee
ise
's occurrences until there is an occurrencee'
onee
, the occurrences ofe'
are then used until there is a new occurrence onee
, etc..- [
switch e ee
]t=
[e
]t if [ee
]<=t= None
. - [
switch e ee
]t=
[e'
]t if [ee
]<=t= Some e'
.
- [
val fix : ('a event -> 'a event * 'b) -> 'b
fix ef
allows to refer to the value an event had an infinitesimal amount of time before.In
fix ef
,ef
is called with an evente
that represents the event returned byef
delayed by an infinitesimal amount of time. Ife', r = ef e
thenr
is returned byfix
ande
is such that :- [
e
]t=
None
if t = 0 - [
e
]t=
[e'
]t-dt otherwise
Raises.
Invalid_argument
ife'
is directly a delayed event (i.e. an event given to a fixing function).- [
Lifting
Lifting combinators. For a given n
the semantics is:
- [
ln f e1 ... en
]t= Some (f v1 ... vn)
if for all i : [ei
]t= Some vi
. - [
ln f e1 ... en
]t= None
otherwise.
val l1 : ('a -> 'b) -> 'a event -> 'b event
val l2 : ('a -> 'b -> 'c) -> 'a event -> 'b event -> 'c event
val l3 : ('a -> 'b -> 'c -> 'd) -> 'a event -> 'b event -> 'c event -> 'd event
val l4 : ('a -> 'b -> 'c -> 'd -> 'e) -> 'a event -> 'b event -> 'c event -> 'd event -> 'e event
val l5 : ('a -> 'b -> 'c -> 'd -> 'e -> 'f) -> 'a event -> 'b event -> 'c event -> 'd event -> 'e event -> 'f event
val l6 : ('a -> 'b -> 'c -> 'd -> 'e -> 'f -> 'g) -> 'a event -> 'b event -> 'c event -> 'd event -> 'e event -> 'f event -> 'g event
Pervasives support
module Option : sig ... end
Events with option occurences.