defmodule Retex.Fact.NotExistingAttribute do @moduledoc "Attribute values that a Wme should NOT have in order for this condition to be true" defstruct owner: nil, attribute: nil @type owner :: String.t() | atom() @type attribute :: String.t() | atom() @type fields :: [owner: owner(), attribute: attribute()] @type t :: %Retex.Fact.NotExistingAttribute{ owner: owner(), attribute: attribute() } @spec new(fields()) :: t() def new(fields) do struct(__MODULE__, fields) end defimpl Retex.Protocol.AlphaNetwork do alias Retex.{Fact, Node} def append(%Fact.NotExistingAttribute{} = condition, {graph, nodes}) do %{attribute: attribute, owner: class} = condition type_node = Node.Type.new(class) negative_select_node = Node.SelectNot.new(class, attribute) new_graph = graph |> Graph.add_vertex(type_node) |> Graph.add_edge(Retex.root_vertex(), type_node) |> Graph.add_vertex(negative_select_node) |> Graph.add_edge(type_node, negative_select_node) {new_graph, [negative_select_node | nodes]} end end end