Skip to main content

lib/cuerdo/arazzo_case/accumulator.ex

defmodule Cuerdo.ArazzoCase.Accumulator do
  @moduledoc """
  Holds results and context for a workflow reduction check
  """
  use Agent

  alias Cuerdo.Arazzo.Context
  alias Cuerdo.ArazzoCase.Result

  def start_link(%Context{} = context) do
    Agent.start_link(fn -> {[], context} end)
  end

  def put_context(pid, %Context{} = context) do
    Agent.update(pid, fn {results, _} -> {results, context} end)
  end

  def add_result(pid, %Result{} = result) do
    Agent.update(pid, fn {results, ctx} -> {[result | results], ctx} end)
  end

  def get_context(pid), do: Agent.get(pid, &elem(&1, 1))
  def get_results(pid), do: Agent.get(pid, &elem(&1, 0))
end