lib/rule_engine/state/agent_state_manager.ex

#-------------------------------------------------------------------------------
# Author: Keith Brings
# Copyright (C) 2018 Noizu Labs, Inc. All rights reserved.
#-------------------------------------------------------------------------------

defmodule Noizu.RuleEngine.State.AgentStateManager do
  @type t :: %__MODULE__{
                agent: nil, # process
             }

  defstruct [
    agent: nil,
  ]

  def new(inner) do
    {:ok, p} = Agent.start_link fn -> inner end
    %__MODULE__{agent: p}
  end
end

defimpl Noizu.RuleEngine.StateProtocol, for: Noizu.RuleEngine.State.AgentStateManager do
  #-------------------------
  #
  #-------------------------
  def settings(entry, context), do: Agent.get(entry.agent, &(Noizu.RuleEngine.StateProtocol.settings(&1, context)))

  #-------------------------
  #
  #-------------------------
  def setting(entry, setting, context), do: Agent.get(entry.agent, &(Noizu.RuleEngine.StateProtocol.setting(&1, setting, context)))

  #-------------------------
  #
  #-------------------------
  def put!(entry, field, value, context) do
    Agent.update(entry.agent, &(Noizu.RuleEngine.StateProtocol.put!(&1, field, value, context)))
    entry
  end

  #-------------------------
  #
  #-------------------------
  def put!(entry, entity, field, value, context) do
    Agent.update(entry.agent, &(Noizu.RuleEngine.StateProtocol.put!(&1, entity, field, value, context)))
    entry
  end

  #-------------------------
  #
  #-------------------------
  def get!(entry, field, context) do
    {Agent.get(entry.agent, &(Noizu.RuleEngine.StateProtocol.get!(&1, field, context) |> elem(0) )), entry}
  end

  #-------------------------
  #
  #-------------------------
  def get!(entry, entity, field, context) do
    {Agent.get(entry.agent, &(Noizu.RuleEngine.StateProtocol.get!(&1, entity, field, context) |> elem(0) )), entry}
  end
end