{-# LANGUAGE OverloadedStrings #-} module Mail ( mailSubject , mailBody ) where import Data.Text (Text) import qualified Data.Text as T import Date import Birthdate mailSubject :: [Birthdate] -> Text mailSubject birthdates = let count = length birthdates in T.concat [ "Hey, " , if count > 1 then "there are" else "there is" , " " , T.pack . show $ count , " birthday" , if count > 1 then "s" else "" , " today!" ] mailBody :: Date -> [Birthdate] -> Text mailBody currentDate birthdates = let count = length birthdates birthdatesWithLines = map (mapFst lineKind) . zip [1..] $ birthdates lineKind 1 = if count == 1 then SingleLine else FirstLine lineKind line = if line == count then LastLine else MiddleLine in T.concat $ map (mailLine currentDate) birthdatesWithLines mapFst :: (a -> c) -> (a, b) -> (c, b) mapFst f (x, y) = (f x, y) data Line = SingleLine | FirstLine | MiddleLine | LastLine deriving (Eq, Show) mailLine :: Date -> (Line, Birthdate) -> Text mailLine currDate (SingleLine, birthdate) = T.concat [ fullname birthdate , " is now " , T.pack . show $ age currDate birthdate , " years old." ] mailLine currDate (FirstLine, birthdate) = T.concat [ fullname birthdate , " is now " , T.pack . show $ age currDate birthdate , " years old" ] mailLine currDate (MiddleLine, birthdate) = T.concat [ ", " , fullname birthdate , " is " , T.pack . show $ age currDate birthdate , " years old" ] mailLine currDate (LastLine, birthdate) = T.concat [ " and " , fullname birthdate , " is " , T.pack . show $ age currDate birthdate , " years old." ]