lib/solver/search/strategy/brancher/brancher.ex

defmodule CPSolver.Search.Brancher do
  @callback branch(Variable.t(), any()) :: [any()]
  @callback initialize(map()) :: :ok

  defmacro __using__(_) do
    quote do
      alias CPSolver.Search
      alias CPSolver.Search.Brancher

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

      def branch(variables, data) do
        Search.variable_value_choice(variables, :first_fail, :indomain_min, data)
      end

      defoverridable initialize: 1, branch: 2
    end
  end
end

defmodule CPSolver.Search.DefaultBrancher do
  use CPSolver.Search.Brancher
end