lib/solver/constraints/maximum.ex

defmodule CPSolver.Constraint.Maximum do
  @moduledoc """
  'Maximum' constraint:
  y = max[x_array]

  x_array is a list of variables
  """

  use CPSolver.Constraint
  alias CPSolver.Propagator.Maximum, as: MaximumPropagator
  alias CPSolver.IntVariable, as: Variable

  @spec new(Variable.variable_or_view(), [Variable.variable_or_view()]) :: Constraint.t()

  def new(c, x_array) when is_integer(c) do
    new(Variable.new(c), x_array)
  end

  def new(y, x_array) do
    new([y | x_array])
  end

  @impl true
  def propagators([_max_var | _var_list] = vars) do
    [MaximumPropagator.new(vars)]
  end
end