README.md

# DecimalEnv

![Build status](https://github.com/gmtprime/decimal_env/actions/workflows/checks.yml/badge.svg) [![Hex pm](http://img.shields.io/hexpm/v/decimal_env.svg?style=flat)](https://hex.pm/packages/decimal_env) [![hex.pm downloads](https://img.shields.io/hexpm/dt/decimal_env.svg?style=flat)](https://hex.pm/packages/decimal_env)

> **Environment** (_noun_): The totality of the natural world, often excluding
> humans.

This library provides a macro to encapsulate `Decimal` operations while using
Elixir operators e.g:

```elixir
iex(1)> import DecimalEnv
iex(2)> decimal do
...(2)>   21.0 + "21.0"
...(2)> end
#Decimal<42.0>
```

> For more information on `Decimal` library, you can go to
> [its documentation](https://hexdocs.pm/decimal/readme.html).

There are two options we can provide to control the operations happening inside
the `decimal` block:

- `:context` - `Decimal.Context` struct. it can also be a `keyword` list. Check
  [its documentation](https://hexdocs.pm/decimal/Decimal.Context.html#content)
  for more information.
- `:as` - In which type we should have the result. The possible values are
  the following:
  + `:decimal` (default)
  + `:float`
  + `:integer`
  + `:string`
  + `:xsd`
  + `:raw`
  + `:scientific`

The following would be a more complex example for the macro:

```elixir
iex(1)> import DecimalEnv
iex(2)> decimal context: [precision: 2, rounding: :ceiling], as: :integer do
...(2)>   21.1 + 20
...(2)> end
42
```

The macro overloads all Elixir numeric operators and that's why the block can
contain any valid Elixir code e.g. the following snippet calculates the mean
of the numbers `1`, `2`, `3` and `4` which is `2.5`:

```elixir
iex(1)> import DecimalEnv
iex(2)> decimal as: :float do
...(2)>   values = [1,2,3,4]
...(2)>   amount = length(values)
...(2)>
...(2)>   Enum.reduce(values, 0, &(&1 + &2)) / amount
...(2)> end
2.5
```

## Installation

Add it to your `mix.exs`

```elixir
def deps do
  [{:decimal_env, "~> 1.0"}]
end
```

## Author

Alexander de Sousa.

## License

`DecimalEnv` is released under the MIT License. See the LICENSE file for
further details.