lib/state_machine/utils.ex

defmodule StateMachine.Utils do

  @spec keyword_splat(keyword(), atom(), any) :: list(any)
  def keyword_splat(keyword, key, default \\ []) do
    case Keyword.get(keyword, key) do
      xs when is_list(xs) -> xs
      x when not is_nil(x) -> [x]
      _ -> default
    end
  end

  @spec normalize_function(module(), (any -> any) | atom()) :: (any -> any)
  def normalize_function(_, f) when is_function(f, 1) do
    f
  end

  def normalize_function(mod, name) when is_atom(name) do
    Function.capture(mod, name, 1)
  end

  def normalize_funciton(_, x) do
    raise ArgumentError, "Expecting `:fun` of arity 1 from current module or captured function `&Mod.fun/1` as a callback, given: #{inspect x}"
  end
end