X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=time-http.git;a=blobdiff_plain;f=Data%2FTime%2FRFC822%2FInternal.hs;h=297120a40c51fdede753bd57e9a5770881b99d4a;hp=ed7549a498c2d408737783951be292ef52cbd5fc;hb=512f9a8;hpb=d39ace5728c981d8c9d83fe8eefcd811dbb1e8aa diff --git a/Data/Time/RFC822/Internal.hs b/Data/Time/RFC822/Internal.hs index ed7549a..297120a 100644 --- a/Data/Time/RFC822/Internal.hs +++ b/Data/Time/RFC822/Internal.hs @@ -1,81 +1,82 @@ -{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE + OverloadedStrings + , UnicodeSyntax + #-} module Data.Time.RFC822.Internal ( rfc822DateAndTime - - -- private , rfc822time ) where -import Control.Monad -import Data.Fixed +import Control.Applicative +import Data.Attoparsec.Char8 import Data.Time -import Data.Time.Calendar.WeekDate import Data.Time.HTTP.Common --- |This is a parsec parser for RFC 822 date and time strings. -rfc822DateAndTime :: Stream s m Char => ParsecT s u m ZonedTime +-- |Parse an RFC 822 date and time string. +rfc822DateAndTime ∷ Parser ZonedTime rfc822DateAndTime = dateTime -dateTime :: Stream s m Char => ParsecT s u m ZonedTime -dateTime = do weekDay <- optionMaybe $ - do w <- shortWeekDayNameP - _ <- string ", " - return w - gregDay <- date +dateTime ∷ Parser ZonedTime +dateTime = do weekDay ← optionMaybe $ + do w ← shortWeekDayNameP + _ ← string ", " + return w + gregDay ← date case weekDay of Nothing - -> return () -- No day in week exists. + -> return () Just givenWD -> assertWeekDayIsGood givenWD gregDay - (tod, timeZone) <- rfc822time + (tod, timeZone) ← rfc822time let lt = LocalTime gregDay tod zt = ZonedTime lt timeZone return zt -date :: Stream s m Char => ParsecT s u m Day -date = do day <- read2 - _ <- char ' ' - month <- shortMonthNameP - _ <- char ' ' - year <- liftM (+ 1900) read2 - _ <- char ' ' +date ∷ Parser Day +date = do day ← read2 + _ ← char ' ' + month ← shortMonthNameP + _ ← char ' ' + year ← (+ 1900) <$> read2 + _ ← char ' ' assertGregorianDateIsGood year month day -rfc822time :: Stream s m Char => ParsecT s u m (TimeOfDay, TimeZone) -rfc822time = do tod <- hour - _ <- char ' ' - tz <- zone +-- |Parse the time and time zone of an RFC 822 date and time string. +rfc822time ∷ Parser (TimeOfDay, TimeZone) +rfc822time = do tod ← hms + _ ← char ' ' + tz ← zone return (tod, tz) -hour :: Stream s m Char => ParsecT s u m TimeOfDay -hour = do hour <- read2 - minute <- char ':' >> read2 - second <- option 0 (char ':' >> read2) - assertTimeOfDayIsGood hour minute second +hms ∷ Parser TimeOfDay +hms = do hour ← read2 + minute ← char ':' *> read2 + second ← option 0 (char ':' *> read2) + assertTimeOfDayIsGood hour minute second -zone :: Stream s m Char => ParsecT s u m TimeZone -zone = choice [ string "UT" >> return (TimeZone 0 False "UT" ) - , string "GMT" >> return (TimeZone 0 False "GMT") +zone ∷ Parser TimeZone +zone = choice [ string "UT" *> return (TimeZone 0 False "UT" ) + , string "GMT" *> return (TimeZone 0 False "GMT") , char 'E' - >> choice [ string "ST" >> return (TimeZone ((-5) * 60) False "EST") - , string "DT" >> return (TimeZone ((-4) * 60) True "EDT") + *> choice [ string "ST" *> return (TimeZone ((-5) * 60) False "EST") + , string "DT" *> return (TimeZone ((-4) * 60) True "EDT") ] , char 'C' - >> choice [ string "ST" >> return (TimeZone ((-6) * 60) False "CST") - , string "DT" >> return (TimeZone ((-5) * 60) True "CDT") + *> choice [ string "ST" *> return (TimeZone ((-6) * 60) False "CST") + , string "DT" *> return (TimeZone ((-5) * 60) True "CDT") ] , char 'M' - >> choice [ string "ST" >> return (TimeZone ((-7) * 60) False "MST") - , string "DT" >> return (TimeZone ((-6) * 60) True "MDT") + *> choice [ string "ST" *> return (TimeZone ((-7) * 60) False "MST") + , string "DT" *> return (TimeZone ((-6) * 60) True "MDT") , return (TimeZone ((-12) * 60) False "M") ] , char 'P' - >> choice [ string "ST" >> return (TimeZone ((-8) * 60) False "PST") - , string "DT" >> return (TimeZone ((-7) * 60) True "PDT") + *> choice [ string "ST" *> return (TimeZone ((-8) * 60) False "PST") + , string "DT" *> return (TimeZone ((-7) * 60) True "PDT") ] - , char 'Z' >> return (TimeZone 0 False "Z") - , char 'A' >> return (TimeZone ((-1) * 60) False "A") - , char 'N' >> return (TimeZone ( 1 * 60) False "N") - , char 'Y' >> return (TimeZone ( 12 * 60) False "Y") + , char 'Z' *> return (TimeZone 0 False "Z") + , char 'A' *> return (TimeZone ((-1) * 60) False "A") + , char 'N' *> return (TimeZone ( 1 * 60) False "N") + , char 'Y' *> return (TimeZone ( 12 * 60) False "Y") , read4digitsTZ ]