]> gitweb @ CieloNegro.org - Lucu.git/blobdiff - Network/HTTP/Lucu/HttpVersion.hs
Destroy Data.Attoparsec.Parsable; use Data.Default instead
[Lucu.git] / Network / HTTP / Lucu / HttpVersion.hs
index 4466f1ecda8959aa102e76e6137cd57c8b53e420..0a850c7aa1cc30f5005b122c2cd7567b8c4b87b9 100644 (file)
@@ -1,21 +1,27 @@
 {-# LANGUAGE
-    OverloadedStrings
+    FlexibleInstances
+  , MultiParamTypeClasses
+  , OverloadedStrings
+  , TemplateHaskell
+  , TypeSynonymInstances
   , UnicodeSyntax
   #-}
 -- |An internal module for HTTP version numbers.
 module Network.HTTP.Lucu.HttpVersion
     ( HttpVersion(..)
-    , printHttpVersion
-    , httpVersion
     )
     where
 import Control.Applicative
 import Control.Applicative.Unicode
-import Data.Ascii (AsciiBuilder)
-import qualified Data.Ascii as A
+import Data.Ascii (Ascii, AsciiBuilder)
 import Data.Attoparsec.Char8
+import Data.Convertible.Base
+import Data.Convertible.Instances.Ascii ()
+import Data.Convertible.Utils
+import Data.Default
 import Data.Monoid.Unicode
 import Prelude hiding (min)
+import Prelude.Unicode
 
 -- |An HTTP version consists of major and minor versions.
 data HttpVersion
@@ -30,22 +36,30 @@ instance Ord HttpVersion where
         | minA < minB = LT
         | otherwise   = EQ
 
--- |Convert an 'HttpVersion' to 'AsciiBuilder'.
-printHttpVersion ∷ HttpVersion → AsciiBuilder
-printHttpVersion v
-    = case v of
-        -- Optimisation for special cases.
-        HttpVersion 1 0 → A.toAsciiBuilder "HTTP/1.0"
-        HttpVersion 1 1 → A.toAsciiBuilder "HTTP/1.1"
-        -- General (but almost never stumbling) cases.
-        HttpVersion maj min
-            → A.toAsciiBuilder "HTTP/" ⊕
-              A.toAsciiBuilder (A.unsafeFromString $ show maj) ⊕
-              A.toAsciiBuilder "." ⊕
-              A.toAsciiBuilder (A.unsafeFromString $ show min)
+instance ConvertSuccess HttpVersion Ascii where
+    {-# INLINE convertSuccess #-}
+    convertSuccess = convertSuccessVia ((⊥) ∷ AsciiBuilder)
 
--- |'Parser' for an 'HttpVersion'.
-httpVersion ∷ Parser HttpVersion
-httpVersion = string "HTTP/"
-              *>
-              (HttpVersion <$> decimal ⊛ (char '.' *> decimal))
+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 |])
+               ]
+
+instance Default (Parser HttpVersion) where
+    {-# INLINEABLE def #-}
+    def = string "HTTP/"
+          *>
+          (HttpVersion <$> decimal ⊛ (char '.' *> decimal))