X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=time-http.git;a=blobdiff_plain;f=Data%2FTime%2FAsctime%2FInternal.hs;h=f7077596c0a1d7e9a36b1ed642ade35344896d43;hp=85707c653c6d3d98b0684f9886977741df7212f0;hb=98132c0;hpb=82afb594c5b4254385435491700befcbea185a5d diff --git a/Data/Time/Asctime/Internal.hs b/Data/Time/Asctime/Internal.hs index 85707c6..f707759 100644 --- a/Data/Time/Asctime/Internal.hs +++ b/Data/Time/Asctime/Internal.hs @@ -1,32 +1,61 @@ -{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE + OverloadedStrings + , UnicodeSyntax + #-} +-- |Internal functions for "Data.Time.Asctime". module Data.Time.Asctime.Internal ( asctime + , toAsciiBuilder ) where -import Control.Monad -import Data.Fixed +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 --- |This is a parsec parser for ANSI C's asctime() format. -asctime :: Stream s m Char => ParsecT s u m LocalTime -asctime = do weekDay <- shortWeekDayNameP - _ <- string ", " - month <- shortMonthNameP - _ <- char ' ' - day <- read2 - _ <- char ' ' - hour <- read2 - _ <- char ':' - minute <- read2 - _ <- char ':' - second <- read2 - _ <- char ' ' - year <- read4 +-- |Parse an ANSI C's @asctime()@ string. +asctime ∷ Parser LocalTime +asctime = do weekDay ← shortWeekDayNameP + _ ← string ", " + 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 + 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 +