Packages

Observables in the spirit of Reactive Extensions for Elixir, extended with advanced primitives for combination and classic reactive programming.

Current section

Files

Jump to
observables_extended lib observables combineLatest.ex
Raw

lib/observables/combineLatest.ex

defmodule Observables.Operator.CombineLatest do
@moduledoc false
use Observables.GenObservable
def init([left_initial, right_initial]) do
Logger.debug("CombineLatest: #{inspect(self())}")
{:ok, {:left, left_initial, :right, right_initial}}
end
def handle_event(value, state) do
Logger.debug("Combinelatest: received value #{inspect value}")
case {value, state} do
# No values yet.
{{:left, vl}, {:left, nil, :right, nil}} ->
{:novalue, {:left, vl, :right, nil}}
{{:right, vr}, {:left, nil, :right, nil}} ->
{:novalue, {:left, nil, :right, vr}}
# Already have the other value.
{{:left, vl}, {:left, nil, :right, vr}} ->
{:value, {vl, vr}, {:left, vl, :right, vr}}
{{:right, vr}, {:left, vl, :right, nil}} ->
{:value, {vl, vr}, {:left, vl, :right, vr}}
# Have one value, and got a newever version of that value.
{{:left, vl}, {:left, _lv, :right, nil}} ->
{:novalue, {:left, vl, :right, nil}}
{{:right, vr}, {:left, nil, :right, _vr}} ->
{:novalue, {:left, nil, :right, vr}}
# We have a history for both, and now we got a new one.
{{:left, vl}, {:left, _vl, :right, vr}} ->
{:value, {vl, vr}, {:left, vl, :right, vr}}
{{:right, vr}, {:left, vl, :right, _vr}} ->
{:value, {vl, vr}, {:left, vl, :right, vr}}
end
end
def handle_done(_pid, _state) do
Logger.debug("#{inspect(self())}: CombineLatest has one dead dependency, going on.")
{:ok, :continue}
end
end