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