3 , MultiParamTypeClasses
9 -- |An internal module for HTTP version numbers.
10 module Network.HTTP.Lucu.HttpVersion
14 import Control.Applicative
15 import Control.Applicative.Unicode
16 import Data.Ascii (Ascii, AsciiBuilder)
17 import Data.Attoparsec.Char8
18 import Data.Convertible.Base
19 import Data.Convertible.Instances.Ascii ()
20 import Data.Convertible.Utils
22 import Data.Monoid.Unicode
23 import Prelude hiding (min)
24 import Prelude.Unicode
26 -- |An HTTP version consists of major and minor versions.
28 = HttpVersion !Int !Int
31 instance Ord HttpVersion where
32 (HttpVersion majA minA) `compare` (HttpVersion majB minB)
39 instance ConvertSuccess HttpVersion Ascii where
40 {-# INLINE convertSuccess #-}
41 convertSuccess = convertSuccessVia ((⊥) ∷ AsciiBuilder)
43 instance ConvertSuccess HttpVersion AsciiBuilder where
44 {-# INLINE convertSuccess #-}
47 -- Optimisation for special cases.
48 HttpVersion 1 0 → cs ("HTTP/1.0" ∷ Ascii)
49 HttpVersion 1 1 → cs ("HTTP/1.1" ∷ Ascii)
50 -- General (but almost never occuring) cases.
52 → cs ("HTTP/" ∷ Ascii) ⊕
53 convertUnsafe (show maj) ⊕
55 convertUnsafe (show min)
57 deriveAttempts [ ([t| HttpVersion |], [t| Ascii |])
58 , ([t| HttpVersion |], [t| AsciiBuilder |])
61 instance Default (Parser HttpVersion) where
62 {-# INLINEABLE def #-}
65 (HttpVersion <$> decimal ⊛ (char '.' *> decimal))