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