defmodule Postfix do
@moduledoc "Evaluator of terms using postfix notation"
alias Postfix.Simple
alias Postfix.Stack
@doc """
Evaluate a list of values and functions
iex> Postfix.eval([2, 3, &*/2, 4, &+/2])
{:ok, 10}
iex> Postfix.eval([1, 2, &-/2])
{:ok, -1}
Operands are given to the function in the natural left-to-right order.
All operands are consumed by the function - the arity is not checked.
"""
@spec eval([term]) :: {:ok, term} | {:error, any}
def eval(terms) do
Simple.eval(terms)
end
@doc """
Evaluate a list of values and functions using a stack.
See `Postfix.Stack.eval/1`
"""
@spec eval_stack([term]) :: {:ok, term} | {:error, any}
def eval_stack(terms) do
Stack.eval(terms)
end
end