Module Note.S
Signals.
A signal is a value that varies continuously over time. Consult the semantics.signalssemantics and notations
}
of signals.
Signals
type 'a t = 'a Note.signalThe type for signals of type 'a.
type 'a set = ?step:Note.Step.t -> 'a -> unitThe type for functions setting signal values of type 'a. See create.
val obs : 'a Note.S.t -> 'a Note.Logr.obsobs s is an observation for s.
val log : ?now:bool -> 'a Note.signal -> ('a -> unit) -> Note.Logr.tlog ?now s f is Logr.(create ~now (const f $ obs s)).
val create : ?eq:('a -> 'a -> bool) -> 'a -> 'a Note.signal * 'a Note.S.setcreate v is a primitive signal set to the value v and a set function. The function set is such that:
set vsets the signal's value tovat the time it is called.set ~step vsets the signal value tovat the time it is called and schedules an update at timestep.
Warning. set must not be used in the definition of signals or events.
val eq : 'a Note.signal -> 'a -> 'a -> booleq s is s's equality function.
val with_eq : ('a -> 'a -> bool) -> 'a Note.signal -> 'a Note.signalwith_eq eq s is s with equality function eq.
val value : 'a Note.signal -> 'avalue s is the current value of s, [s]t
val rough_value : 'a Note.signal -> 'arough_value s is the current value of s, but in contrast to value it might not be exactly [s]t.
val const : ?eq:('a -> 'a -> bool) -> 'a -> 'a Note.signalconst v is always v, [const v]t = v.
val hold : ?eq:('a -> 'a -> bool) -> 'a -> 'a Note.event -> 'a Note.signalhold i e has the value of e's last occurrence or the value of i provides the signal value at creation time if there's no event at that time.
- [
hold i e]t= iif [e]≤t= None - [
hold i e]t= vif [e]≤t= Some v
val bind : 'a Note.signal -> ('a -> 'b Note.signal) -> 'b Note.signalbind s f is the signal that results from applying f to s, [bind s f]t = [f[s]t]t.
val join : 'a Note.signal Note.signal -> 'a Note.signaljoin ss is bind ss (fun s -> s).
val swap : 'a Note.signal -> 'a Note.signal Note.event -> 'a Note.signalswap s se is join (hold ~eq:( == ) s se) that is the values of s followed by values of the last signal that occurred on se.
val changes : 'a Note.signal -> 'a Note.eventchanges s occurs with the value of s whenever it changes.
- [
changes s]t= Some vif [s]t= vand [s]t-dt= v'andeq v v' = false. - [
changes s]t= Noneotherwise.
Warning. By definition no event occurs if s changes at creation time (0 - dt is undefined).
val map :
?eq:('b -> 'b -> bool) ->
('a -> 'b) ->
'a Note.signal ->
'b Note.signalmap f s is s transformed by f, [map f s]t = f [s]t.
val app :
?eq:('b -> 'b -> bool) ->
('a -> 'b) Note.signal ->
'a Note.signal ->
'b Note.signalapp sf s holds the value of sf applied to the value of s, [app sf s]t = [sf]t [s]t.
val sample :
'b Note.signal ->
on:'a Note.event ->
('b -> 'a -> 'c) ->
'c Note.eventsample s ~on f samples s at e's occurrences.
- [
sample s ~on f]t= Some (f sv ev)if [on]t= Some evand [s]t= sv. - [
sample s ~on f]t= Noneotherwise.
val sample_filter :
'b Note.signal ->
on:'a Note.event ->
('b -> 'a -> 'c option) ->
'c Note.eventsample_filter s on f is E.Option.on_some (sample s ~on f).
val snapshot : 'b Note.signal -> on:'a Note.event -> 'b Note.eventsnapshot ~on s is sample (fun v _ -> v) ~on s.
TODO. Candidate for deletion.
val accum :
?eq:('a -> 'a -> bool) ->
'a ->
('a -> 'a) Note.event ->
'a Note.signalaccum i e is hold i (E.accum i e).
val until :
?limit:bool ->
?init:'b ->
next:'a Note.event ->
'b Note.signal ->
'b Note.signaluntil ~limit ~init ~next s is s until next occurs, after which the value s had just before (limit is false, default) or whenever next occurs (limit is true) is kept forever.
- [
until ~limit ~init ~next s]t=[s]t if [next]≤t= None - [
until ~limit ~init ~next s]t= initif [next]0= Some _ - [
until ~limit:false ~init ~next s]t=[s]t'- dt if [next]t'= Some _and [next]<t'= None. - [
until ~limit:true ~init ~next s]t=[s]t' if [next]t'= Some _and [next]<t'= None.
init defaults to value s.
val follow :
?init:'a ->
'a Note.signal ->
on:bool Note.signal ->
'a Note.signalfollow ~init s ~on is s whenever on is true and the last value of s when on was true if on is false. If on is false at creation time init is used (defaults to S.value s).
- [
follow ~init s ~on]0=[s]0 if [on]0= true - [
follow ~init s ~on]0=[init]0 if [on]0= false - [
follow ~init s ~on]t=[s]t if [on]t= true - [
follow ~init s ~on]t=[follow ~init s ~on]t' if [on]t= falsewhere t' is the greatest t' < t with [on]t'= trueor0if there is no such time.
val defer : ?init:'a -> 'a Note.signal -> 'a Note.signaldefer s is s delayed by an infinitesimal amount of time. At creation time init is used (defaults to S.value s).
- [
defer s]t=initfor t = 0. - [
defer s]t=[s]t-dt otherwise.
val delay : 'a -> 'a Note.signal Stdlib.Lazy.t -> 'a Note.signaldelay i (lazy s) is the value s had an infinitesimal amount of time before:
- [
delay i (lazy s)]t=ifor t = 0. - [
delay i (lazy s)]t=[s']t-dt otherwise.
val fix :
?eq:('a -> 'a -> bool) ->
'a ->
('a Note.signal -> 'a Note.signal * 'b) ->
'bIn 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=ifor t = 0. - [
s]t=[s']t-dt otherwise.
Lifting
Lifting combinators. For a given n the semantics is : [ln f a1 ... an]t = f [a1]t ... [an]t
val l1 :
?eq:('b -> 'b -> bool) ->
('a -> 'b) ->
'a Note.signal ->
'b Note.signalval l2 :
?eq:('c -> 'c -> bool) ->
('a -> 'b -> 'c) ->
'a Note.signal ->
'b Note.signal ->
'c Note.signalval l3 :
?eq:('d -> 'd -> bool) ->
('a -> 'b -> 'c -> 'd) ->
'a Note.signal ->
'b Note.signal ->
'c Note.signal ->
'd Note.signalStdlib types support
module Bool : sig ... endBoolean signals
module Option : sig ... endOption signals
module Pair : sig ... endPair signals.