defmodule SI do
@moduledoc """
Documentation for SI.
"""
alias SI.Quantity
alias SI.Unit
alias Quantity.Mass
alias Quantity.AmountOfSubstance
alias Quantity.Time
alias Quantity.ThermodynamicTemperature
alias Quantity.LuminousIntensity
alias Quantity.Length
alias Quantity.ElectricCurrent
alias Unit.{Gram, Mole, Ampere, Meter, Candela, Kelvin, Second}
require Unit
Module.register_attribute(__MODULE__, :units, accumulate: true)
@basic_quantities [
{Mass.symbol(), Mass},
{AmountOfSubstance.symbol(), AmountOfSubstance},
{Time.symbol(), Time},
{ThermodynamicTemperature.symbol(), ThermodynamicTemperature},
{LuminousIntensity.symbol(), LuminousIntensity},
{Length.symbol(), Length},
{ElectricCurrent.symbol(), ElectricCurrent}
]
# === UNITS ===
@units {Mass.symbol(), Unit.generate_module_variations(Gram)}
Unit.compile_derivative_units(Gram)
Unit.compile_variation_conversions(Gram)
@units {AmountOfSubstance.symbol(), Unit.generate_module_variations(Mole)}
Unit.compile_derivative_units(Mole)
Unit.compile_variation_conversions(Mole)
@units {ElectricCurrent.symbol(), Unit.generate_module_variations(Ampere)}
Unit.compile_derivative_units(Ampere)
Unit.compile_variation_conversions(Ampere)
@units {Length.symbol(), Unit.generate_module_variations(Meter)}
Unit.compile_derivative_units(Meter)
Unit.compile_variation_conversions(Meter)
@units {LuminousIntensity.symbol(), Unit.generate_module_variations(Candela)}
Unit.compile_derivative_units(Candela)
Unit.compile_variation_conversions(Candela)
@units {ThermodynamicTemperature.symbol(), Unit.generate_module_variations(Kelvin)}
Unit.compile_derivative_units(Kelvin)
Unit.compile_variation_conversions(Kelvin)
@units {Time.symbol(), Unit.generate_module_variations(Second)}
Unit.compile_derivative_units(Second)
Unit.compile_variation_conversions(Second)
# === FUNCTIONS ===
def quantities(), do: @basic_quantities
def units(), do: @units
end