X-Git-Url: http://git.cielonegro.org/gitweb.cgi?a=blobdiff_plain;f=Data%2FTime%2FHTTP%2FCommon.hs;h=f7c74c91e1326b5944ea06d5082c0415ac2f0044;hb=c1ed8da;hp=cf5412c28b093eca5844e8286cec529f78f4a6e8;hpb=d82d61b7f6627c026d0a61209a6cceda5e572214;p=time-http.git diff --git a/Data/Time/HTTP/Common.hs b/Data/Time/HTTP/Common.hs index cf5412c..f7c74c9 100644 --- a/Data/Time/HTTP/Common.hs +++ b/Data/Time/HTTP/Common.hs @@ -15,11 +15,13 @@ module Data.Time.HTTP.Common , longMonthName , longMonthNameP - , show2 , show4 + , show2 + , show2' - , read2 , read4 + , read2 + , read2' , show4digitsTZ , read4digitsTZ @@ -38,6 +40,7 @@ import Control.Monad import Data.Ascii (AsciiBuilder) import qualified Data.Ascii as A import Data.Attoparsec.Char8 as P +import Data.Char import Data.Monoid.Unicode import Data.Fixed import Data.Time @@ -211,6 +214,14 @@ show2 = A.unsafeFromBuilder ∘ go | i ≥ 0 ∧ i < 100 = BT.integral i | otherwise = error ("show2: the integer i must satisfy 0 <= i < 100: " ⧺ show i) +show2' ∷ Integral i ⇒ i → AsciiBuilder +{-# INLINE show2' #-} +show2' = A.unsafeFromBuilder ∘ go + where + go i | i ≥ 0 ∧ i < 10 = B.fromByteString " " ⊕ BT.digit i + | i ≥ 0 ∧ i < 100 = BT.integral i + | otherwise = error ("show2': the integer i must satisfy 0 <= i < 100: " ⧺ show i) + read4 ∷ Num n ⇒ Parser n {-# INLINEABLE read4 #-} read4 = do n1 ← digit' @@ -225,21 +236,18 @@ read2 = do n1 ← digit' n2 ← digit' return (n1 * 10 + n2) -digit' ∷ Num n ⇒ Parser n -digit' = fromC <$> P.digit +read2' ∷ Num n ⇒ Parser n +{-# INLINEABLE read2' #-} +read2' = do n1 ← (char ' ' *> pure 0) <|> digit' + n2 ← digit' + return (n1 * 10 + n2) -fromC ∷ Num n ⇒ Char → n -fromC '0' = 0 -fromC '1' = 1 -fromC '2' = 2 -fromC '3' = 3 -fromC '4' = 4 -fromC '5' = 5 -fromC '6' = 6 -fromC '7' = 7 -fromC '8' = 8 -fromC '9' = 9 -fromC _ = undefined +digit' ∷ Num n ⇒ Parser n +{-# INLINE digit' #-} +digit' = fromIntegral <$> fromC <$> P.digit + where + {-# INLINE fromC #-} + fromC c = ord c - ord '0' show4digitsTZ ∷ TimeZone → AsciiBuilder show4digitsTZ tz