lib/solver/search/strategy/value/indomain_split.ex

defmodule CPSolver.Search.ValueSelector.Split do
  use CPSolver.Search.ValueSelector

  @moduledoc """
  Bisect the domain.
  """
  import CPSolver.Utils

  @impl true
  def select_value(variable) do
    variable
    |> domain_values()
    |> then(fn values ->
      Enum.at(values, div(MapSet.size(values), 2))
    end)
  end

  @impl true
  def partition(value) do
    [
      fn variable ->
        Interface.removeAbove(variable, value - 1)
      end,
      fn variable ->
        Interface.removeBelow(variable, value)
      end
    ]
  end
end