exercism-elixir/space-age/lib/space_age.ex
2022-02-02 08:33:47 -04:00

40 lines
1.4 KiB
Elixir

defmodule SpaceAge do
@type planet ::
:mercury
| :venus
| :earth
| :mars
| :jupiter
| :saturn
| :uranus
| :neptune
@seconds_in_earth_year 31_557_600
@seconds_in_mercury_year 0.2408467 * @seconds_in_earth_year
@seconds_in_venus_year 0.61519726 * @seconds_in_earth_year
@seconds_in_mars_year 1.8808158 * @seconds_in_earth_year
@seconds_in_jupiter_year 11.862615 * @seconds_in_earth_year
@seconds_in_saturn_year 29.447498 * @seconds_in_earth_year
@seconds_in_uranus_year 84.016846 * @seconds_in_earth_year
@seconds_in_neptune_year 164.79132 * @seconds_in_earth_year
@doc """
Return the number of years a person that has lived for 'seconds' seconds is
aged on 'planet', or an error if 'planet' is not a planet.
"""
@spec age_on(planet, pos_integer) :: {:ok, float} | {:error, String.t()}
def age_on(planet, seconds) do
case planet do
:mercury -> {:ok, seconds / @seconds_in_mercury_year}
:venus -> {:ok, seconds / @seconds_in_venus_year}
:earth -> {:ok, seconds / @seconds_in_earth_year}
:mars -> {:ok, seconds / @seconds_in_mars_year}
:jupiter -> {:ok, seconds / @seconds_in_jupiter_year}
:saturn -> {:ok, seconds / @seconds_in_saturn_year}
:uranus -> {:ok, seconds / @seconds_in_uranus_year}
:neptune -> {:ok, seconds / @seconds_in_neptune_year}
# sorry pluto
_ -> {:error, "not a planet"}
end
end
end