Current section
Files
Jump to
Current section
Files
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
@doc"""
Publishes a signal by registering it in the registry.
"""
def register(signal, name) do
Registry.add_source(signal, name)
signal
end
end