packages feed

time-http-0.2: Data/Time/Asctime/Internal.hs

{-# LANGUAGE
    OverloadedStrings
  , UnicodeSyntax
  #-}
-- |Internal functions for "Data.Time.Asctime".
module Data.Time.Asctime.Internal
    ( asctime
    , toAsciiBuilder
    )
    where
import Data.Ascii (AsciiBuilder)
import qualified Data.Ascii as A
import Data.Attoparsec.Char8
import Data.Monoid.Unicode
import Data.Time
import Data.Time.Calendar.WeekDate
import Data.Time.HTTP.Common

-- |Parse an ANSI C's @asctime()@ string.
asctime ∷ Parser LocalTime
asctime = do weekDay ← shortWeekDayNameP
             _       ← char ' '
             month   ← shortMonthNameP
             _       ← char ' '
             day     ← read2'
             _       ← char ' '
             hour    ← read2
             _       ← char ':'
             minute  ← read2
             _       ← char ':'
             second  ← read2
             _       ← char ' '
             year    ← read4

             gregDay ← assertGregorianDateIsGood year month day
             _       ← assertWeekDayIsGood weekDay gregDay
             tod     ← assertTimeOfDayIsGood hour minute second

             return (LocalTime gregDay tod)

-- |Convert a 'LocalTime' to ANSI C's @asctime()@ string.
toAsciiBuilder ∷ LocalTime → AsciiBuilder
toAsciiBuilder localTime
    = let (year, month, day) = toGregorian (localDay localTime)
          (_, _, week)       = toWeekDate  (localDay localTime)
          timeOfDay          = localTimeOfDay localTime
      in
        shortWeekDayName week
        ⊕ A.toAsciiBuilder " "
        ⊕ shortMonthName month
        ⊕ A.toAsciiBuilder " "
        ⊕ show2' day
        ⊕ A.toAsciiBuilder " "
        ⊕ show2 (todHour timeOfDay)
        ⊕ A.toAsciiBuilder ":"
        ⊕ show2 (todMin timeOfDay)
        ⊕ A.toAsciiBuilder ":"
        ⊕ show2 (floor (todSec timeOfDay) ∷ Int)
        ⊕ A.toAsciiBuilder " "
        ⊕ show4 year