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 buffer.ex
Raw

lib/observables/buffer.ex

defmodule Observables.Operator.Buffer do
@moduledoc false
use Observables.GenObservable
def init([size]) do
Logger.debug("Buffer: #{inspect(self())}")
# We don't keep state in merge.
{:ok, %{:size => size, :buffer => []}}
end
def handle_event(v, %{:size => size, :buffer => bs}) do
count = Enum.count(bs)
case {bs, size, count} do
{b, s, c} when s <= c ->
{:value, b, %{:size => s, :buffer => [v]}}
{b, s, c} when s > c ->
{:novalue, %{:size => s, :buffer => b ++ [v]}}
# {[], max_size, c} ->
# {:novalue, %{:max_size => max_size, :buffer => [v]}}
end
end
def handle_done(pid, %{:size => _size, :buffer => bs}) do
# We are buffering, and if our dependency stops we need to flush our buffer or we are losing values.
Logger.debug("#{inspect(self())}: dependency stopping: #{inspect(pid)}")
{:ok, :done, {:value, bs}}
end
end