1
 
2
module FizzBuzz exposing (fizzbuzz)
3
{-| Fizbbuzz example module -}
4
 
5
import List exposing (map, range)
6
 
7
{-| Fizzes the buzzes, and buzzfizzes the fizz out of buzz
8
    fizzbuzz 1 7 == "1 2 Fizz 4 Buzz Fizz 7"
9
-}
10
fizzbuzz : Int -> Int -> String
11
fizzbuzz from to =
12
  let
13
    fizzBuzz n =
14
        case (n % 3, n % 5) of
15
            (0, 0) -> "FizzBuzz"
16
            (0, _) -> "Fizz"
17
            (_, 0) -> "Buzz"
18
            _      -> toString n
19
  in List.range from to |> map (fizzBuzz >> toString) |> joinWords
20
 
21
 
22
joinWords : List String -> String
23
joinWords a = String.join " " a
 
# Compiled using Elchemy v0.8.8
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