]> gitweb @ CieloNegro.org - Lucu.git/blobdiff - Network/HTTP/Lucu/Response.hs
New module: Data.Eq.Indirect providing Eq' type class.
[Lucu.git] / Network / HTTP / Lucu / Response.hs
index e9da057c4bdb07415ccc944bd6bcd902f81354d1..f318fcf7ca7a9cb9a0b2ec7d14ec166ab54d9a84 100644 (file)
@@ -1,6 +1,9 @@
 {-# LANGUAGE
-    OverloadedStrings
+    FlexibleInstances
+  , MultiParamTypeClasses
+  , OverloadedStrings
   , RecordWildCards
+  , TemplateHaskell
   , UnicodeSyntax
   , ViewPatterns
   #-}
@@ -8,7 +11,7 @@
 module Network.HTTP.Lucu.Response
     ( -- * Class and Types
       StatusCode(..)
-    , SomeStatusCode(..)
+    , SomeStatusCode
     , Response(..)
     , statusCodes
     , module Network.HTTP.Lucu.StatusCode
@@ -17,11 +20,7 @@ module Network.HTTP.Lucu.Response
     , emptyResponse
     , setStatusCode
     , resCanHaveBody
-    , printStatusCode
-    , printResponse
 
-    , (≈)
-    , (≉)
     , isInformational
     , isSuccessful
     , isRedirection
@@ -30,11 +29,11 @@ module Network.HTTP.Lucu.Response
     , isServerError
     )
     where
-import Data.Ascii (AsciiBuilder)
-import qualified Data.Ascii as A
+import Data.Ascii (Ascii, AsciiBuilder)
 import Data.Convertible.Base
 import Data.Convertible.Instances.Ascii ()
 import Data.Convertible.Utils
+import Data.Eq.Indirect
 import Data.Monoid.Unicode
 import Network.HTTP.Lucu.Headers
 import Network.HTTP.Lucu.HttpVersion
@@ -42,11 +41,6 @@ import Network.HTTP.Lucu.StatusCode
 import Network.HTTP.Lucu.StatusCode.Internal
 import Prelude.Unicode
 
--- |Convert a 'StatusCode' to an 'AsciiBuilder'.
-printStatusCode ∷ StatusCode sc ⇒ sc → AsciiBuilder
-{-# INLINEABLE printStatusCode #-}
-printStatusCode = A.toAsciiBuilder ∘ textualStatus
-
 -- |This is the definition of an HTTP response.
 data Response = Response {
       resVersion ∷ !HttpVersion
@@ -58,6 +52,23 @@ instance HasHeaders Response where
     getHeaders         = resHeaders
     setHeaders res hdr = res { resHeaders = hdr }
 
+instance ConvertSuccess Response Ascii where
+    {-# INLINE convertSuccess #-}
+    convertSuccess = convertSuccessVia ((⊥) ∷ AsciiBuilder)
+
+instance ConvertSuccess Response AsciiBuilder where
+    {-# INLINE convertSuccess #-}
+    convertSuccess (Response {..})
+        = cs resVersion           ⊕
+          cs (" " ∷ Ascii)        ⊕
+          cs resStatus            ⊕
+          cs ("\x0D\x0A" ∷ Ascii) ⊕
+          cs resHeaders
+
+deriveAttempts [ ([t| Response |], [t| Ascii        |])
+               , ([t| Response |], [t| AsciiBuilder |])
+               ]
+
 -- |Returns an HTTP\/1.1 'Response' with no header fields.
 emptyResponse ∷ StatusCode sc ⇒ sc → Response
 emptyResponse sc
@@ -80,21 +91,11 @@ resCanHaveBody ∷ Response → Bool
 {-# INLINEABLE resCanHaveBody #-}
 resCanHaveBody (Response {..})
     | isInformational resStatus = False
-    | resStatus â\89\88 NoContent     = False
-    | resStatus â\89\88 ResetContent  = False
-    | resStatus â\89\88 NotModified   = False
+    | resStatus â\89¡: NoContent    = False
+    | resStatus â\89¡: ResetContent = False
+    | resStatus â\89¡: NotModified  = False
     | otherwise                 = True
 
--- |Convert a 'Response' to 'AsciiBuilder'.
-printResponse ∷ Response → AsciiBuilder
-{-# INLINEABLE printResponse #-}
-printResponse (Response {..})
-    = cs resVersion ⊕
-      A.toAsciiBuilder " "        ⊕
-      printStatusCode  resStatus  ⊕
-      A.toAsciiBuilder "\x0D\x0A" ⊕
-      cs resHeaders
-
 -- |@'isInformational' sc@ returns 'True' iff @sc '<' 200@.
 isInformational ∷ StatusCode sc ⇒ sc → Bool
 {-# INLINE isInformational #-}