]> gitweb @ CieloNegro.org - Lucu.git/blobdiff - Network/HTTP/Lucu/HttpVersion.hs
Code clean-up using convertible-text
[Lucu.git] / Network / HTTP / Lucu / HttpVersion.hs
index e0694f151d97db6a1ff3ddd44fa4c4a0293faf1d..889042728fcdd310811bdfce67659430d1cbab32 100644 (file)
@@ -1,24 +1,31 @@
--- #prune
-
--- |Manipulation of HTTP version string.
+{-# LANGUAGE
+    FlexibleInstances
+  , MultiParamTypeClasses
+  , OverloadedStrings
+  , TemplateHaskell
+  , UnicodeSyntax
+  #-}
+-- |An internal module for HTTP version numbers.
 module Network.HTTP.Lucu.HttpVersion
     ( HttpVersion(..)
-    , httpVersionP
-    , hPutHttpVersion
+    , httpVersion
     )
     where
+import Control.Applicative
+import Control.Applicative.Unicode
+import Data.Ascii (Ascii, AsciiBuilder)
+import Data.Attoparsec.Char8
+import Data.Convertible.Base
+import Data.Convertible.Instances.Ascii ()
+import Data.Convertible.Utils
+import Data.Monoid.Unicode
+import Prelude hiding (min)
+import Prelude.Unicode
 
-import qualified Data.ByteString.Char8 as C8
-import           Network.HTTP.Lucu.Parser
-import           Prelude hiding (min)
-import           System.IO
-
--- |@'HttpVersion' major minor@ represents \"HTTP\/major.minor\".
-data HttpVersion = HttpVersion !Int !Int
-                   deriving (Eq)
-
-instance Show HttpVersion where
-    show (HttpVersion maj min) = "HTTP/" ++ show maj ++ "." ++ show min
+-- |An HTTP version consists of major and minor versions.
+data HttpVersion
+    = HttpVersion !Int !Int
+      deriving (Eq, Show)
 
 instance Ord HttpVersion where
     (HttpVersion majA minA) `compare` (HttpVersion majB minB)
@@ -28,23 +35,30 @@ instance Ord HttpVersion where
         | minA < minB = LT
         | otherwise   = EQ
 
+instance ConvertSuccess HttpVersion Ascii where
+    {-# INLINE convertSuccess #-}
+    convertSuccess = convertSuccessVia ((⊥) ∷ AsciiBuilder)
 
-httpVersionP :: Parser HttpVersion
-httpVersionP = do string "HTTP/"
-                  major <- many1 digit
-                  char '.'
-                  minor <- many1 digit
-                  return $ HttpVersion (read' major) (read' minor)
-    where
-      read' "1" = 1 -- この二つが
-      read' "0" = 0 -- 壓倒的に頻出する
-      read' s   = read s
+instance ConvertSuccess HttpVersion AsciiBuilder where
+    {-# INLINE convertSuccess #-}
+    convertSuccess v
+        = case v of
+            -- Optimisation for special cases.
+            HttpVersion 1 0 → cs ("HTTP/1.0" ∷ Ascii)
+            HttpVersion 1 1 → cs ("HTTP/1.1" ∷ Ascii)
+            -- General (but almost never occuring) cases.
+            HttpVersion maj min
+                → cs ("HTTP/" ∷ Ascii)     ⊕
+                  convertUnsafe (show maj) ⊕
+                  cs ("."     ∷ Ascii)     ⊕
+                  convertUnsafe (show min)
 
+deriveAttempts [ ([t| HttpVersion |], [t| Ascii        |])
+               , ([t| HttpVersion |], [t| AsciiBuilder |])
+               ]
 
-hPutHttpVersion :: Handle -> HttpVersion -> IO ()
-hPutHttpVersion h (HttpVersion maj min)
-    = h `seq`
-      do C8.hPut  h (C8.pack "HTTP/")
-         hPutStr  h (show maj)
-         hPutChar h '.'
-         hPutStr  h (show min)
\ No newline at end of file
+-- |'Parser' for an 'HttpVersion'.
+httpVersion ∷ Parser HttpVersion
+httpVersion = string "HTTP/"
+              *>
+              (HttpVersion <$> decimal ⊛ (char '.' *> decimal))