README.md

# ex_ecc

This is an Elixir language port of the python library py_ecc from the Ethereum project.

It's a file-to-file port so to make it easier to compare the code and understand the differences as well as to incorporate new changes.

Same goes for the tests.

# Port notes

- Original python files are in py_ecc/ and tests/ the new ported files are in lib/ and test/ correspondingly.

- Type enforcement is generally not ported.

- Elixir does not have class inheritance but py_ecc field maths is heavily based on that. So to keep the port mostly source similiar there is an Elixir specific FieldMath module that handles inheritance. And because `super` is an Elixir keyword with a different meaning instead all uses of python `super` instead use the elixir function `parent`

- Initializers and constructors are created using a single `def new(fp \\ %__MODULE{}, arg1, arg2)`using a default argument to be both used as init and new.

- While loops are ported using the While compat module:
```elixir
import While

# to keep source similarity
{i, j} = while {i, j}, i < 10 do
    {i + 1, j - 1}
end

# and sometimes the nicer function variant
i = reduce_while(1, fn i ->
    if i < 10 do
        {:cont, i + 1}
    else
        {:halt, i}
    end
end)
```
- If/elif/else statements are replaced with `cond do`
```elixir
cond do
    len(low) != 3 -> 3
    len(low) != 2  -> 2
    true -> raise "Invalid low argument"
end
```

- Pythonic expressions like `[0] * x` become: `List.duplicate([0], x)`

- Unused module attributes are covered with getters such as `def b(), do: @b` to avoid warnings.