Strom.Composite (strom v0.9.3)

View Source

Runs a set of components and is a component itself, meaning that a composite has the same interface - it accepts flow as input and returns a modified flow.

## Example
iex> alias Strom.{Composite, Transformer, Splitter, Source, Sink}
iex> transformer = Transformer.new(:s, &(&1 + 1))
iex> splitter = Splitter.new(:s, %{odd: &(rem(&1, 2) == 1), even: &(rem(&1, 2) == 0)})
iex> composite = [transformer, splitter] |> Composite.new() |> Composite.start()
iex> source = :s |> Source.new([1, 2, 3]) |> Source.start()
iex> %{odd: odd, even: even} = %{} |> Source.call(source) |> Composite.call(composite)
iex> {Enum.to_list(odd), Enum.to_list(even)}
{[3], [2, 4]}

## Composites can be created from other composites
iex> alias Strom.{Composite, Transformer, Splitter, Source, Sink}
iex> transformer = Transformer.new(:s, &(&1 + 1))
iex> splitter = Splitter.new(:s, %{odd: &(rem(&1, 2) == 1), even: &(rem(&1, 2) == 0)})
iex> c1 = Composite.new([transformer])
iex> c2 = Composite.new([splitter])
iex> source = Source.new(:s, [1, 2, 3])
iex> composite = [source, c1, c2] |> Composite.new() |> Composite.start()
iex> %{odd: odd, even: even} = %{} |> Composite.call(composite)
iex> {Enum.to_list(odd), Enum.to_list(even)}
{[3], [2, 4]}

Summary

Types

t()

@type t() :: %Strom.Composite{components: term(), name: term(), pid: term()}

Functions

call(flow, name)

@spec call(Strom.flow(), t() | atom()) :: Strom.flow()

call_flow(components, init_flow)

child_spec(init_arg)

Returns a specification to start this module under a supervisor.

See Supervisor.

component_supervisor_name(name)

components(composite)

delete(composite, index)

@spec delete(
  t(),
  {integer(), integer()}
) :: t()
@spec delete(t(), integer()) :: t()

insert(composite, index, new_component)

@spec insert(t(), integer(), Strom.component()) :: {t(), Strom.flow()}
@spec insert(t(), integer(), [Strom.component()]) :: {t(), Strom.flow()}

new(components, name \\ nil)

replace(composite, index, new_component)

@spec replace(t(), integer(), Strom.component()) :: {t(), Strom.flow()}
@spec replace(t(), {integer(), integer()}, Strom.component()) :: {t(), Strom.flow()}
@spec replace(t(), {integer(), integer()}, [Strom.component()]) :: {t(), Strom.flow()}
@spec replace(t(), integer(), [Strom.component()]) :: {t(), Strom.flow()}

start(composite)

@spec start(t()) :: t()

start_link(composite)

stop(composite)

@spec stop(t()) :: :ok

supervisor_name(name)

task_supervisor_name(name)