lib/solver/constraints/element2d.ex

defmodule CPSolver.Constraint.Element2D do
  @moduledoc """
  Element2d constrains variables z, x and y such that:
  array2d[x][y] = z

  array2d is a regular (all rows are of the same length) list of lists of integers.
  """
  use CPSolver.Constraint
  alias CPSolver.Propagator.Element2D, as: Element2DPropagator
  alias CPSolver.IntVariable, as: Variable

  @spec new(
          [[integer()]],
          Variable.variable_or_view(),
          Variable.variable_or_view(),
          Variable.variable_or_view()
        ) :: Constraint.t()
  def new(arr2d, x, y, z) do
    new([arr2d, x, y, z])
  end

  @impl true
  def propagators(args) do
    [Element2DPropagator.new(args)]
  end

  @impl true
  def arguments([array2d, x, y, z]) when is_list(array2d) and is_list(hd(array2d)) do
    [array2d, Variable.to_variable(x), Variable.to_variable(y), Variable.to_variable(z)]
  end
end