X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=time-http.git;a=blobdiff_plain;f=Data%2FTime%2FHTTP%2FCommon.hs;h=bb4ac16527c0ac6768eb22c097fbd46a97f355a1;hp=6a45805ed80be61aa996c7351554b7f82689b9d5;hb=512f9a8;hpb=d39ace5728c981d8c9d83fe8eefcd811dbb1e8aa diff --git a/Data/Time/HTTP/Common.hs b/Data/Time/HTTP/Common.hs index 6a45805..bb4ac16 100644 --- a/Data/Time/HTTP/Common.hs +++ b/Data/Time/HTTP/Common.hs @@ -27,13 +27,14 @@ module Data.Time.HTTP.Common , assertWeekDayIsGood , assertGregorianDateIsGood , assertTimeOfDayIsGood + + , optionMaybe ) where import Blaze.ByteString.Builder.ByteString as B import Blaze.Text.Int as BT import Control.Applicative import Control.Monad -import Control.Monad.Unicode import Data.Ascii (AsciiBuilder) import qualified Data.Ascii as A import Data.Attoparsec.Char8 as P @@ -57,17 +58,17 @@ shortWeekDayName n = error ("shortWeekDayName: invalid week day: " ⧺ show n) shortWeekDayNameP ∷ Num n ⇒ Parser n {-# INLINEABLE shortWeekDayNameP #-} shortWeekDayNameP - = choice [ string "Mon" ≫ return 1 + = choice [ string "Mon" *> return 1 , char 'T' - ≫ choice [ string "ue" ≫ return 2 - , string "hu" ≫ return 4 - ] - , string "Wed" ≫ return 3 - , string "Fri" ≫ return 5 + *> choice [ string "ue" *> return 2 + , string "hu" *> return 4 + ] + , string "Wed" *> return 3 + , string "Fri" *> return 5 , char 'S' - ≫ choice [ string "at" ≫ return 6 - , string "un" ≫ return 7 - ] + *> choice [ string "at" *> return 6 + , string "un" *> return 7 + ] ] longWeekDayName ∷ Num n ⇒ n → String @@ -84,17 +85,17 @@ longWeekDayName n = error ("longWeekDayName: invalid week day: " ⧺ show n) longWeekDayNameP ∷ Num n ⇒ Parser n {-# INLINEABLE longWeekDayNameP #-} longWeekDayNameP - = choice [ string "Monday" ≫ return 1 + = choice [ string "Monday" *> return 1 , char 'T' - ≫ choice [ string "uesday" ≫ return 2 - , string "hursday" ≫ return 4 - ] - , string "Wednesday" ≫ return 3 - , string "Friday" ≫ return 5 + *> choice [ string "uesday" *> return 2 + , string "hursday" *> return 4 + ] + , string "Wednesday" *> return 3 + , string "Friday" *> return 5 , char 'S' - ≫ choice [ string "aturday" ≫ return 6 - , string "unday" ≫ return 7 - ] + *> choice [ string "aturday" *> return 6 + , string "unday" *> return 7 + ] ] shortMonthName ∷ Num n ⇒ n → String @@ -117,25 +118,25 @@ shortMonthNameP ∷ Num n ⇒ Parser n {-# INLINEABLE shortMonthNameP #-} shortMonthNameP = choice [ char 'J' - ≫ choice [ string "an" ≫ return 1 - , char 'u' - ≫ choice [ char 'n' ≫ return 6 - , char 'l' ≫ return 7 - ] - ] - , string "Feb" ≫ return 2 + *> choice [ string "an" *> return 1 + , char 'u' + *> choice [ char 'n' *> return 6 + , char 'l' *> return 7 + ] + ] + , string "Feb" *> return 2 , string "Ma" - ≫ choice [ char 'r' ≫ return 3 - , char 'y' ≫ return 5 - ] + *> choice [ char 'r' *> return 3 + , char 'y' *> return 5 + ] , char 'A' - ≫ choice [ string "pr" ≫ return 4 - , string "ug" ≫ return 8 - ] - , string "Sep" ≫ return 9 - , string "Oct" ≫ return 10 - , string "Nov" ≫ return 11 - , string "Dec" ≫ return 12 + *> choice [ string "pr" *> return 4 + , string "ug" *> return 8 + ] + , string "Sep" *> return 9 + , string "Oct" *> return 10 + , string "Nov" *> return 11 + , string "Dec" *> return 12 ] longMonthName ∷ Num n ⇒ n → String @@ -158,25 +159,25 @@ longMonthNameP ∷ Num n ⇒ Parser n {-# INLINEABLE longMonthNameP #-} longMonthNameP = choice [ char 'J' - ≫ choice [ string "anuary" ≫ return 1 - , char 'u' - ≫ choice [ string "ne" ≫ return 6 - , string "ly" ≫ return 7 - ] - ] - , string "February" ≫ return 2 + *> choice [ string "anuary" *> return 1 + , char 'u' + *> choice [ string "ne" *> return 6 + , string "ly" *> return 7 + ] + ] + , string "February" *> return 2 , string "Ma" - ≫ choice [ string "rch" ≫ return 3 - , char 'y' ≫ return 5 - ] + *> choice [ string "rch" *> return 3 + , char 'y' *> return 5 + ] , char 'A' - ≫ choice [ string "pril" ≫ return 4 - , string "ugust" ≫ return 8 - ] - , string "September" ≫ return 9 - , string "October" ≫ return 10 - , string "November" ≫ return 11 - , string "December" ≫ return 12 + *> choice [ string "pril" *> return 4 + , string "ugust" *> return 8 + ] + , string "September" *> return 9 + , string "October" *> return 10 + , string "November" *> return 11 + , string "December" *> return 12 ] show4 ∷ Integral i ⇒ i → AsciiBuilder @@ -242,9 +243,9 @@ show4digitsTZ tz read4digitsTZ ∷ Parser TimeZone read4digitsTZ - = do sign ← (char '+' ≫ return 1) + = do sign ← (char '+' *> return 1) <|> - (char '-' ≫ return (-1)) + (char '-' *> return (-1)) hour ← read2 minute ← read2 let tz = TimeZone { @@ -303,3 +304,8 @@ assertTimeOfDayIsGood hour minute second ] Just tod → return tod + +optionMaybe ∷ Alternative f ⇒ f a → f (Maybe a) +{-# INLINE optionMaybe #-} +optionMaybe p + = option Nothing (Just <$> p)