]> 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 4531c837782ef9b6eda9edd4849e3771f2b0b0a1..889042728fcdd310811bdfce67659430d1cbab32 100644 (file)
@@ -1,23 +1,28 @@
 {-# LANGUAGE
-    BangPatterns
+    FlexibleInstances
+  , MultiParamTypeClasses
   , OverloadedStrings
+  , TemplateHaskell
   , UnicodeSyntax
   #-}
-{-# OPTIONS_HADDOCK prune #-}
-
--- |Manipulation of HTTP version string.
+-- |An internal module for HTTP version numbers.
 module Network.HTTP.Lucu.HttpVersion
     ( HttpVersion(..)
-    , httpVersionP
-    , hPutHttpVersion
+    , httpVersion
     )
     where
-import Control.Monad.Unicode
+import Control.Applicative
+import Control.Applicative.Unicode
+import Data.Ascii (Ascii, AsciiBuilder)
 import Data.Attoparsec.Char8
-import Network.HTTP.Lucu.HandleLike
+import Data.Convertible.Base
+import Data.Convertible.Instances.Ascii ()
+import Data.Convertible.Utils
+import Data.Monoid.Unicode
 import Prelude hiding (min)
+import Prelude.Unicode
 
--- |@'HttpVersion' major minor@ represents \"HTTP\/major.minor\".
+-- |An HTTP version consists of major and minor versions.
 data HttpVersion
     = HttpVersion !Int !Int
       deriving (Eq, Show)
@@ -30,26 +35,30 @@ instance Ord HttpVersion where
         | minA < minB = LT
         | otherwise   = EQ
 
-httpVersionP ∷ Parser HttpVersion
-httpVersionP = string "HTTP/"
-               ≫
-               choice [ string "1.1" ≫ return (HttpVersion 1 1)
-                      , string "1.0" ≫ return (HttpVersion 1 0)
-                      , do major ← decimal
-                           _     ← char '.'
-                           minor ← decimal
-                           return $ HttpVersion major minor
-                      ]
+instance ConvertSuccess HttpVersion Ascii where
+    {-# INLINE convertSuccess #-}
+    convertSuccess = convertSuccessVia ((⊥) ∷ AsciiBuilder)
+
+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 ∷ HandleLike h ⇒ h → HttpVersion → IO ()
-hPutHttpVersion !h !v
-    = case v of
-        -- 頻出するので高速化
-        HttpVersion 1 0 → hPutBS h "HTTP/1.0"
-        HttpVersion 1 1 → hPutBS h "HTTP/1.1"
-        -- 一般の場合
-        HttpVersion !maj !min
-            → do hPutBS   h "HTTP/"
-                 hPutStr  h (show maj)
-                 hPutChar h '.'
-                 hPutStr  h (show min)
+-- |'Parser' for an 'HttpVersion'.
+httpVersion ∷ Parser HttpVersion
+httpVersion = string "HTTP/"
+              *>
+              (HttpVersion <$> decimal ⊛ (char '.' *> decimal))