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

defmodule CPSolver.Search.ValueSelector do
  @callback select_value(Variable.t()) :: integer()
  @callback partition(integer()) :: [function()]
  @callback initialize(map()) :: :ok

  defmacro __using__(_) do
    quote do
      alias CPSolver.Search.ValueSelector
      alias CPSolver.Variable.Interface
      alias CPSolver.DefaultDomain, as: Domain

      @behaviour ValueSelector
      def initialize(data) do
        :ok
      end

      def partition(value) do
        [
          fn domain -> Domain.fix(domain, value) end,
          fn domain -> Domain.remove(domain, value) end,
        ]
      end

      defoverridable initialize: 1, partition: 1
    end
  end
end