lib/renamer.ex

defmodule Strom.Renamer do
  @moduledoc """
  Renames streams in flow.

      ## Example
      iex> alias Strom.Renamer
      iex> flow = %{s1: [1], s2: [2]}
      iex> renamer = %{s1: :foo1, s2: :foo2} |> Renamer.new() |> Renamer.start()
      iex> Renamer.call(flow, renamer)
      %{foo1: [1], foo2: [2]}
  """
  defstruct names: %{}

  @type t() :: %__MODULE__{}

  @spec new(map()) :: __MODULE__.t()
  def new(names) when is_map(names) and map_size(names) > 0 do
    %__MODULE__{names: names}
  end

  @spec start(__MODULE__.t()) :: __MODULE__.t()
  def start(%__MODULE__{names: names} = renamer) when is_map(names) and map_size(names) > 0 do
    renamer
  end

  @spec call(Strom.flow(), __MODULE__.t()) :: Strom.flow()
  def call(flow, %__MODULE__{names: names}) do
    Enum.reduce(names, flow, fn {name, new_name}, acc ->
      acc
      |> Map.put(new_name, Map.fetch!(acc, name))
      |> Map.delete(name)
    end)
  end

  @spec stop(__MODULE__.t()) :: :ok
  def stop(%__MODULE__{}), do: :ok
end