lib/solver/constraints/element.ex

defmodule CPSolver.Constraint.Element do
  @moduledoc """
  Element constrains variables y and z such that:
  array[x] = y

  array is 1d list of integer constants
  """
  use CPSolver.Constraint
  alias CPSolver.Constraint.Element2D, as: Element2D
  alias CPSolver.IntVariable

  @spec new(
          [integer()],
          Variable.variable_or_view() | integer(),
          Variable.variable_or_view() | integer()
        ) :: Constraint.t()
  def new(array, x, y) do
    Element2D.new([[array], IntVariable.new(0), x, y])
  end

  @impl true
  def propagators(args) do
    Element2D.propagators(args)
  end

  @impl true
  def arguments([array, x, y]) when is_list(array) do
    [array, IntVariable.to_variable(x), IntVariable.to_variable(y)]
  end
end