diff --git a/lib/ash/resource/calculation/function.ex b/lib/ash/resource/calculation/function.ex new file mode 100644 index 00000000..dff51de0 --- /dev/null +++ b/lib/ash/resource/calculation/function.ex @@ -0,0 +1,22 @@ +defmodule Ash.Calculation.Function do + @moduledoc false + use Ash.Calculation + + def calculate(results, [fun: fun], context) do + Enum.reduce_while(results, {:ok, []}, fn result, {:ok, acc} -> + case apply_fun(fun, result, context) do + {:ok, result} -> {:cont, {:ok, [result | acc]}} + {:error, error} -> {:halt, {:error, error}} + result -> {:cont, {:ok, [result | acc]}} + end + end) + end + + defp apply_fun({m, f, a}, result, context) do + apply(m, f, [result, context | a]) + end + + defp apply_fun(fun, result, context) do + fun.(result, context) + end +end