The tiny discrete-time Elerea
In order to not feel overwhelmed, we'll begin with one of the simplest formulations of FRP, Elerea. Elerea is a very minimalist implementation, which restricts itself to discrete-time semantics and sampling. There are no events and everything is computed on demand only. Furthermore, the API consists of high-level constructs so that it's exceedingly difficult to shoot yourself in the foot with this library.
Time-varying values of type a are represented as Signal a
in Elerea:
data Signal a -- instances incl. Monad, Eq
Signals can be thought of as functions Nat → a
, though obviously they are represented differently.
Signals are made inside signal generators, SignalGen a
:
data SignalGen a -- instances incl. Monad, MonadFix, MonadIO
Signal generators have a MonadFix
instance, which will later allow us to build mutually recursive signals.
The minimal API provides just a few signal building blocks. Excluding some trivial extensions, the core combinators...