X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=Lucu.git;a=blobdiff_plain;f=Network%2FHTTP%2FLucu%2FHttpVersion.hs;h=889042728fcdd310811bdfce67659430d1cbab32;hp=4466f1ecda8959aa102e76e6137cd57c8b53e420;hb=97295ba;hpb=67f9e87a4cb7fdfe50bb3efa0b63b1628efec82c diff --git a/Network/HTTP/Lucu/HttpVersion.hs b/Network/HTTP/Lucu/HttpVersion.hs index 4466f1e..8890427 100644 --- a/Network/HTTP/Lucu/HttpVersion.hs +++ b/Network/HTTP/Lucu/HttpVersion.hs @@ -1,21 +1,26 @@ {-# LANGUAGE - OverloadedStrings + FlexibleInstances + , MultiParamTypeClasses + , OverloadedStrings + , TemplateHaskell , 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.Monoid.Unicode import Prelude hiding (min) +import Prelude.Unicode -- |An HTTP version consists of major and minor versions. data HttpVersion @@ -30,19 +35,27 @@ 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) + +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 |]) + ] -- |'Parser' for an 'HttpVersion'. httpVersion ∷ Parser HttpVersion