defmodule CPSolver.Solution do @callback handle(solution :: %{reference() => number() | boolean()}) :: any() def default_handler() do CPSolver.Solution.DefaultHandler end def run_handler(solution, handler) when is_atom(handler) do handler.handle(solution) end def run_handler(solution, handler) when is_function(handler) do handler.(solution) end def solution_handler(handler, variables) do fn solution -> solution |> reconcile(variables) |> run_handler(handler) end end def reconcile(solution, variables) do ## We want to present a solution (which is var_name => value map) in order of initial variable names. solution |> Map.to_list() |> Enum.sort_by(fn {var_name, _val} -> Enum.find_index( variables, fn var -> var.name == var_name end ) end) end end defmodule CPSolver.Solution.DefaultHandler do @behaviour CPSolver.Solution require Logger @impl true def handle(solution) do Logger.debug("Solution found") Enum.each(solution, fn {var_id, value} -> Logger.debug("#{inspect(var_id)} <- #{inspect(value)}") end) end end