Files
archived-teslamate/lib/teslamate/convert.ex
2020-04-19 12:30:48 +02:00

52 lines
1.8 KiB
Elixir
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
defmodule TeslaMate.Convert do
@km_factor 0.62137119223733
@km_factor_d Decimal.from_float(@km_factor)
@ft_factor 3.28084
alias Decimal, as: D
def mph_to_kmh(nil), do: nil
def mph_to_kmh(mph = %D{}), do: mph |> D.div(@km_factor) |> D.round()
def mph_to_kmh(mph), do: round(mph / @km_factor)
def miles_to_km(nil, _precision), do: nil
def miles_to_km(mi = %D{}, p), do: mi |> D.div(@km_factor_d) |> D.round(p)
def miles_to_km(mi, 0), do: round(mi / @km_factor)
def miles_to_km(mi, precision), do: Float.round(mi / @km_factor, precision)
def km_to_miles(nil, _precision), do: nil
def km_to_miles(km = %D{}, p), do: km |> D.mult(@km_factor_d) |> D.round(p)
def km_to_miles(km, 0), do: round(km * @km_factor)
def km_to_miles(km, precision), do: Float.round(km * @km_factor, precision)
def m_to_ft(nil), do: nil
def m_to_ft(m = %D{}), do: D.mult(m, @ft_factor)
def m_to_ft(m), do: m * @ft_factor
def ft_to_m(nil), do: nil
def ft_to_m(ft = %D{}), do: D.div(ft, @ft_factor)
def ft_to_m(ft), do: ft / @ft_factor
def celsius_to_fahrenheit(nil, _precision), do: nil
def celsius_to_fahrenheit(c = %D{}, p), do: D.mult(c, 9) |> D.div(5) |> D.add(32) |> D.round(p)
def celsius_to_fahrenheit(c, 0), do: round(c * 9 / 5 + 32)
def celsius_to_fahrenheit(c, precision), do: Float.round(c * 9 / 5 + 32, precision)
@minute 60
@hour @minute * 60
@day @hour * 24
@week @day * 7
@divisor [@week, @day, @hour, @minute, 1]
def sec_to_str(sec) when is_number(sec) do
{_, [s, m, h, d, w]} =
Enum.reduce(@divisor, {sec, []}, fn divisor, {n, acc} ->
{rem(n, divisor), [div(n, divisor) | acc]}
end)
["#{w} wk", "#{d} d", "#{h} h", "#{m} min", "#{s} s"]
|> Enum.reject(&String.starts_with?(&1, "0"))
|> Enum.take(2)
end
end