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