Current section
Files
Jump to
Current section
Files
lib/wongi/engine/beta/or.ex
defmodule Wongi.Engine.Beta.Or do
@moduledoc false
@type t() :: %__MODULE__{}
defstruct [:ref, :parent_refs]
def new(parent_refs) do
%__MODULE__{
ref: make_ref(),
parent_refs: MapSet.new(parent_refs)
}
end
defimpl Wongi.Engine.Beta do
alias Wongi.Engine.Beta.Common
alias Wongi.Engine.Rete
alias Wongi.Engine.Token
def ref(%@for{ref: ref}), do: ref
def parent_refs(%@for{parent_refs: parent_refs}), do: parent_refs
def seed(node, beta, rete) do
tokens = Rete.tokens(rete, node)
Enum.reduce(tokens, rete, fn token, rete ->
Common.beta_activate([beta], &Token.new(&1, [token], nil), rete)
end)
end
def equivalent?(%@for{parent_refs: parent_refs}, %@for{parent_refs: parent_refs}, _rete),
do: true
def equivalent?(_, _, _), do: false
@spec alpha_activate(
Wongi.Engine.Beta.Or.t(),
Wongi.Engine.WME.t(),
Wongi.Engine.Rete.t()
) :: no_return()
defdelegate alpha_activate(node, alpha, rete), to: Wongi.Engine.Beta.NonAlphaListening
@spec alpha_deactivate(
Wongi.Engine.Beta.Or.t(),
Wongi.Engine.WME.t(),
Wongi.Engine.Rete.t()
) :: no_return()
defdelegate alpha_deactivate(node, alpha, rete), to: Wongi.Engine.Beta.NonAlphaListening
def beta_activate(node, token, rete) do
rete = Rete.add_token(rete, token)
betas = Rete.beta_subscriptions(rete, node)
Common.beta_activate(betas, &Token.new(&1, [token], nil), rete)
end
def beta_deactivate(node, token, rete) do
rete =
rete
|> Rete.remove_token(token)
rete
|> Rete.beta_subscriptions(node)
|> Common.beta_deactivate(token, rete)
end
end
end