defmodule PhilColumns.Sequence do def start_link do Agent.start_link(fn -> Map.new() end, name: __MODULE__) end def reset do Agent.update(__MODULE__, fn _ -> Map.new() end) end def next(sequence_name) when is_binary(sequence_name) do next(sequence_name, fn n -> sequence_name <> to_string(n) end) end def next(sequence_name) do raise( ArgumentError, "sequence name must be a string; got #{inspect(sequence_name)} instead" ) end def next(sequence_name, formatter) do Agent.get_and_update(__MODULE__, fn sequences -> current_value = Map.get(sequences, sequence_name, 0) new_sequences = Map.put(sequences, sequence_name, current_value + 1) {formatter.(current_value), new_sequences} end) end end