Packages

Dimensional analysis and unit conversions for Elixir.

Current section

Files

Jump to
ex_dimensions lib ex_dimensions.ex
Raw

lib/ex_dimensions.ex

defmodule ExDimensions do
@moduledoc """
`ex_dimensions` is a library for providing safe unit math and conversions.
Units are tracked inside a struct that is labeled with phantom types for
the units of the number, and transparent math is provided by macros. To get
started, first any simple numeric must be "lifted" into a unit aware number.
The easiest way is using the helper functions for the type of quantity you want
to work with:
iex> q = ExDimensions.Spatial.inches(6)
iex> IO.puts(q)
"6 in"
iex> IO.inspect(q)
%ExDimensions.Quantity{value: 6, units: [ExDimensions.Spatial.Inches], denom: []}
Quantities can be constructed manually but as they must obey certain rules, this
is not recommended.
Quantity arithmetic can be done transparently by using the `ExDimensions.Math` macros:
iex> defmodule Foo do
iex> use ExDimensions.Math
iex> def do_some_math() do
iex> q1 = ExDimensions.Spatial.inches(6)
iex> q2 = ExDimensions.Spatial.inches(3)
iex> q1 + q2
iex> end
iex> end
iex> IO.puts(Foo.do_some_math())
"9 in"
Incorrect units supplied to math functions will result in `ArithmeticErrors`.
There is also a unit conversion framework available. See `ExDimensions.Conversions`
for an example of how to use it.
Finally, a custom Ecto type is provided for those who want to transparently persist
numbers with units. See `ExDimensions.Ecto.UnitField` for an explanation.
"""
end