Current section
Files
Jump to
Current section
Files
lib/wait_for_it/evaluation.ex
defmodule WaitForIt.Evaluation do
@moduledoc """
Helper module for capturing compile-time expressions (i.e. ASTs) and evaluating them at runtime.
"""
defmacro capture_expression(nil), do: nil
defmacro capture_expression(expression), do: quote(do: fn -> unquote(expression) end)
def eval_expression(captured_expression) when is_function(captured_expression) do
captured_expression.()
end
defmacro capture_case_clauses(case_clauses) do
quote do
fn expr ->
case expr do
unquote(case_clauses)
end
end
end
end
def eval_case_expression(value, case_clauses) when is_function(case_clauses) do
case_clauses.(value)
end
defmacro capture_cond_clauses(cond_clauses) do
quote do
fn ->
cond do
unquote(cond_clauses)
end
end
end
end
def eval_cond_expression(cond_clauses) when is_function(cond_clauses) do
cond_clauses.()
end
defmacro capture_with_clauses(with_clauses, do_block) do
quote do
fn ->
with unquote(with_clauses) do
unquote(do_block)
end
end
end
end
defmacro capture_else_block(nil), do: nil
defmacro capture_else_block([{:->, _, _} | _] = clauses) do
quote do
fn value ->
case value do
unquote(clauses)
end
end
end
end
defmacro capture_else_block(else_block) do
quote do
fn _ ->
unquote(else_block)
end
end
end
def eval_else_block(value, nil), do: value
def eval_else_block(value, else_block) when is_function(else_block) do
else_block.(value)
end
end