{-# LANGUAGE UnicodeSyntax, DeriveDataTypeable #-} module Data.Dates.Types (DateTime (..), Time (..), months, capitalize ) where import Prelude.Unicode import Data.Monoid import Data.Char import Data.Generics -- | Date / Time data DateTime = DateTime { year ∷ Int, month ∷ Int, day ∷ Int, hour ∷ Int, minute ∷ Int, second ∷ Int } deriving (Eq,Ord,Data,Typeable) -- | 12 months names. months ∷ [String] months = ["january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december"] -- | capitalize first letter of the string capitalize ∷ String → String capitalize [] = [] capitalize (x:xs) = (toUpper x):xs -- | Show name of given month showMonth ∷ Int → String showMonth i = capitalize $ months !! (i-1) instance Show DateTime where show (DateTime y m d h mins s) = show d ⧺ " " ⧺ showMonth m ⧺ " " ⧺ show y ⧺ ", " ⧺ show h ⧺ ":" ⧺ show mins ⧺ ":" ⧺ show s -- | Only time, without date data Time = Time { tHour ∷ Int, tMinute ∷ Int, tSecond ∷ Int } deriving (Eq,Ord,Show,Data,Typeable) instance Monoid DateTime where mempty = DateTime 0 0 0 0 0 0 mappend dt1 dt2 = DateTime (year dt1 `plus` year dt2) (month dt1 `plus` month dt2) (day dt1 `plus` day dt2) (hour dt1 `plus` hour dt2) (minute dt1 `plus` minute dt2) (second dt1 `plus` second dt2) where plus :: Int → Int → Int plus 0 x = x plus x _ = x