lib/solver/propagation/not_equal.ex

defmodule CPSolver.Propagator.NotEqual do
  use CPSolver.Propagator

  import CPSolver.Propagator.Variable

  @impl true
  def variables(args) do
    Enum.take(args, 2)
  end

  @impl true
  def events() do
    []
  end

  @impl true
  def filter([x, y]) do
    filter([x, y, 0])
  end

  def filter([x, y, offset]) do
    filter(x, y, offset)
  end

  def filter(x, y, offset \\ 0) do
    cond do
      fixed?(x) ->
        remove(y, plus(min(x), -offset))

      fixed?(y) ->
        remove(x, plus(min(y), offset))

      true ->
        :stable
    end
  end
end