Packages

A reactive programming library for Elixir. The purpose of this library is to experiment in an academic context.

Current section

Files

Jump to
reactivity lib reactive.ex
Raw

lib/reactive.ex

defmodule Reactivity do
alias Reactivity.Signal.Source
alias Reactivity.Signal.Derived
alias Reactivity.Registry
@doc """
Lift takes a regular function (a -> b) and lifts into a signal processing
method. (signal a -> signal b).
"""
def lift(f) do
lifted = fn(signal) ->
# Create the intermediate node.
{:ok, ds} = Derived.new(f, nil)
case signal do
{:signal, :source, s} ->
Source.add_child(s, ds)
{:signal, :derived, s} ->
Derived.add_child(s, ds)
end
{:ok, ds}
end
lifted
end
@doc """
Applies a lifted function on a signal, effectively subscribing to it.
"""
def apply(signal, f) do
{:ok, new_signal} = f.(signal)
new_signal
end
@doc """
Convenience function to lift and immediatly apply a function to a signal.
"""
def liftapp(signal, f) do
lifted = lift(f)
Reactivity.apply(signal, lifted)
end
@doc """
Using a keyword to get a signal from the global environment.
"""
def source(name) do
{:ok, signal} = Registry.get_source(name)
signal
end
end