A high-performance, purely-functional library for reactive programming based on efficient incremental computation.
This library aims at faithfully implementing Functional Reactive Programming as defined in [2]. The term Reactive programming is often used to describe composing streams of discrete events. Functional reactive programming (FRP) is about composing dynamic values changing in continuous time and reacting to discrete events.
Behaviour[A](value: Reactive[TimeFun[A]])
- value chaninging over time.
Event[+A](value: Future[Reactive[A]])
- stream of (Time, a) pairs.
Reactive[+A](head: A, tail: Event[A])
- reactive value.
Sink[A, B](f: A => IO[Void, Unit])
- consumer of reactive values.
This project is just starting, so the working example is quite simple:
case class Tick(name: String)
def ticks(interval: Duration, name: String): Event[Tick] =
Event(IO.point { (Time.now, Reactive(Tick(name), ticks(interval, name).delay(interval))) })
def myAppLogic: IO[Void, Unit] =
Sink[Tick, Unit](t => IO.now(println(s"tick ${t.name}")))
.sink(
ticks(0.2 second, "a")
.merge(ticks(0.4 second, "b"))
)
This program produces a scalaz.zio.IO
that can be run by e.g. scalaz.zio.App
- see TwoTickers.scala
in examples
.