scalaz / scalaz-reactive

A high-performance, purely-functional library for reactive programming based on efficient incremental computation
Apache License 2.0
24 stars 10 forks source link

scalaz-reactive

Gitter

Goal

A high-performance, purely-functional library for reactive programming based on efficient incremental computation.

Introduction

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.

Core concepts

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.

Example

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.

Background