aboutsummaryrefslogtreecommitdiff
path: root/challenge-160/alexander-pankoff/haskell/ch-1.hs
blob: 4c895e810bfdc3a428599da8ef4e643667805fd4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
module Main where

import Data.Char (toLower, toUpper)
import Data.Foldable (forM_)
import Data.List (intercalate)

main :: IO ()
main = do
  forM_ [One .. Nine] $ putStrLn . fourIsMagic

data Digit
  = One
  | Two
  | Three
  | Four
  | Five
  | Six
  | Seven
  | Eight
  | Nine
  deriving (Show, Eq, Ord, Enum)

toCardinal :: Digit -> String
toCardinal = lcFirst . show

fourIsMagic :: Digit -> String
fourIsMagic x = ucFirst $ intercalate ", " $ reverse $ go [] x
  where
    go acc Four = (toCardinal Four ++ " is magic.") : acc
    go acc x =
      let cardinal = toCardinal x
          next = toEnum (length cardinal - 1)
       in go ((cardinal ++ " is " ++ toCardinal next) : acc) next

lcFirst :: String -> String
lcFirst [] = []
lcFirst (x : xs) = toLower x : xs

ucFirst :: String -> String
ucFirst [] = []
ucFirst (x : xs) = toUpper x : xs