Current section

Files

Jump to
fixpoint lib solver propagators propagator.ex
Raw

lib/solver/propagators/propagator.ex

defmodule CPSolver.Propagator do
@callback filter(args :: list()) :: map() | :stable | :failure
@callback variables(args :: list()) :: list()
@callback events() :: list()
defmacro __using__(_) do
quote do
@behaviour CPSolver.Propagator
def variables(args) do
args
end
## Events that trigger propagation
def events() do
CPSolver.Common.domain_changes()
end
defoverridable variables: 1
defoverridable events: 0
end
end
def normalize(propagators) when is_list(propagators) do
propagators
|> Enum.map(&normalize/1)
|> Enum.uniq()
end
def normalize({_mod, args} = propagator) when is_list(args) do
propagator
end
def normalize(propagator) when is_tuple(propagator) do
[mod | args] = Tuple.to_list(propagator)
{mod, args}
end
end