defmodule FizzBuzz do
use Elchemy
@moduledoc """
Fizbbuzz example module
"""
import Elchemy.XList, only: [{:'map', 0}, {:'range', 0}]
@doc """
Fizzes the buzzes, and buzzfizzes the fizz out of buzz
iex> import FizzBuzz
iex> fizzbuzz(1, 7)
"1 2 Fizz 4 Buzz Fizz 7"
"""
@spec fizzbuzz(integer, integer) :: String.t
curry fizzbuzz/2
def fizzbuzz(from, to) do
fizz_buzz = rec fizz_buzz, fn n -> case {rem(n, 3), rem(n, 5)} do
{0, 0} ->
"FizzBuzz"
{0, _} ->
"Fizz"
{_, 0} ->
"Buzz"
_ ->
to_string().(n)
end end
(Elchemy.XList.range().(from).(to)
|> (map().((fizz_buzz >>> to_string()))).()
|> (join_words()).())
end
@spec join_words(list(String.t)) :: String.t
curry join_words/1
defp join_words(a) do
Elchemy.XString.join().(" ").(a)
end
end