diff options
| author | Anhgelus Morhtuuzh <william@herges.fr> | 2025-11-10 17:31:41 +0100 |
|---|---|---|
| committer | Anhgelus Morhtuuzh <william@herges.fr> | 2025-11-10 17:31:41 +0100 |
| commit | 4840f480c8f255a6cf3b4eed291a00cea76b0cac (patch) | |
| tree | d9baf898c1e961bb8ee5d181c38cce93b062129b /lib/math | |
| parent | 037094a928653ed27f1f9d5497f637af1c5380e0 (diff) | |
feat(calc): supports function definition and evaluation
Diffstat (limited to 'lib/math')
| -rw-r--r-- | lib/math/function.ex | 28 | ||||
| -rw-r--r-- | lib/math/rational.ex | 5 |
2 files changed, 30 insertions, 3 deletions
diff --git a/lib/math/function.ex b/lib/math/function.ex new file mode 100644 index 0000000..2acf2c4 --- /dev/null +++ b/lib/math/function.ex @@ -0,0 +1,28 @@ +defmodule ElixirMathParser.Math.Function do + alias ElixirMathParser.Math.Function + + defstruct relation: nil, parameters: %{} + + def is_function(val) when is_map(val) and is_map_key(val, :__struct__) and is_struct(val), + do: :erlang.map_get(:__struct__, val) == __MODULE__ + + def new(relation, parameters) do + params = + Enum.with_index(parameters) + |> Enum.reduce(%{}, fn {v, id}, acc -> Map.merge(acc, %{id => v}) end) + + %Function{relation: relation, parameters: params} + end + + def eval(fun, parameters) do + if Enum.count(parameters) != Enum.count(fun.parameters) do + {:error, "wrong count of parameters"} + else + params = + Enum.with_index(parameters) + |> Enum.reduce(%{}, fn {v, id}, acc -> Map.merge(acc, %{v => id}) end) + + fun.relation.(fun.parameters, params) + end + end +end diff --git a/lib/math/rational.ex b/lib/math/rational.ex index c3d94c9..e788883 100644 --- a/lib/math/rational.ex +++ b/lib/math/rational.ex @@ -83,9 +83,8 @@ defmodule ElixirMathParser.Math.Rational do iex> Rational.is_rational("My quick brown fox") false """ - defguard is_rational(val) - when is_map(val) and is_map_key(val, :__struct__) and is_struct(val) and - :erlang.map_get(:__struct__, val) == __MODULE__ + def is_rational(val) when is_map(val) and is_map_key(val, :__struct__) and is_struct(val), + do: :erlang.map_get(:__struct__, val) == __MODULE__ @doc """ Creates a new Rational number. |
