lib/utils.ex

defmodule Adventurous.Util do

  defmodule Timer do
    defstruct start: System.monotonic_time()
  end

  def timed(func, msg \\ nil) do
    timer = %Timer{}

    result = func.()

    diff = time_diff(timer)
    if msg do
      IO.puts("#{msg}: took #{diff/1_000_000}ms")
    end

    {result, diff}
  end

  @spec time_diff(atom | %{:start => number, optional(any) => any}) :: number
  def time_diff(timer, msg \\ nil) do
    diff = System.monotonic_time() - timer.start
    if msg do
      IO.puts("#{msg}: took #{diff/1_000_000}ms")
    end

    diff
  end
end