41 lines
930 B
Elixir
41 lines
930 B
Elixir
defmodule BeerSong do
|
|
@doc """
|
|
Get a single verse of the beer song
|
|
"""
|
|
@spec verse(integer) :: String.t()
|
|
def verse(number) do
|
|
"""
|
|
#{String.capitalize(bottle_num(number))} of beer on the wall, #{bottle_num(number)} of beer.
|
|
#{action(number)}, #{bottle_num(number - 1)} of beer on the wall.
|
|
"""
|
|
end
|
|
|
|
defp bottle_num(num) do
|
|
case num do
|
|
1 -> "1 bottle"
|
|
0 -> "no more bottles"
|
|
n when n < 0 -> "99 bottles"
|
|
_ -> "#{num} bottles"
|
|
end
|
|
end
|
|
|
|
defp action(num) do
|
|
if num == 0 do
|
|
"Go to the store and buy some more"
|
|
else
|
|
article = if num == 1, do: "it", else: "one"
|
|
"Take #{article} down and pass it around"
|
|
end
|
|
end
|
|
|
|
@doc """
|
|
Get the entire beer song for a given range of numbers of bottles.
|
|
"""
|
|
@spec lyrics(Range.t()) :: String.t()
|
|
def lyrics(range \\ 99..0) do
|
|
range
|
|
|> Enum.map(&verse/1)
|
|
|> Enum.join("\n")
|
|
end
|
|
end
|