]> gitweb @ CieloNegro.org - Lucu.git/blobdiff - Network/HTTP/Lucu/ETag.hs
MIMEParams is now an instance of collections-api's type classes.
[Lucu.git] / Network / HTTP / Lucu / ETag.hs
index 76df18378bf3e48417dddd8c73dc6222b65d5136..08c10602174cca93d03da0bc6e6540afb03574da 100644 (file)
@@ -1,8 +1,11 @@
 {-# LANGUAGE
-    OverloadedStrings
+    DeriveDataTypeable
+  , OverloadedStrings
+  , RecordWildCards
+  , TemplateHaskell
   , UnicodeSyntax
   #-}
--- |Entity tags
+-- |An internal module for entity tags.
 module Network.HTTP.Lucu.ETag
     ( ETag(..)
     , parseETag
@@ -19,21 +22,33 @@ import Control.Monad
 import Data.Ascii (Ascii, AsciiBuilder)
 import qualified Data.Ascii as A
 import Data.Attoparsec.Char8
+import Data.Data
 import Data.Monoid.Unicode
+import Language.Haskell.TH.Syntax
+import Network.HTTP.Lucu.OrphanInstances ()
+import Network.HTTP.Lucu.Parser
 import Network.HTTP.Lucu.Parser.Http hiding (token)
 import Network.HTTP.Lucu.Utils
 import Prelude.Unicode
 
 -- |An entity tag consists of a weakness flag and an opaque string.
 data ETag = ETag {
-      -- |The weakness flag. Weak tags looks like W\/\"blahblah\" and
-      -- strong tags are like \"blahblah\". See:
+      -- |The weakness flag. Weak tags looks like @W\/\"blahblah\"@
+      -- and strong tags are like @\"blahblah\"@. See:
       -- <http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.3.3>
       etagIsWeak ∷ !Bool
       -- |An opaque string. Only characters from 0x20 (sp) to 0x7e (~)
       -- are allowed.
     , etagToken  ∷ !Ascii
-    } deriving (Eq, Show)
+    } deriving (Eq, Show, Data, Typeable)
+
+instance Lift ETag where
+    lift (ETag {..})
+        = [| ETag {
+               etagIsWeak = $(lift etagIsWeak)
+             , etagToken  = $(lift etagToken )
+             }
+           |]
 
 -- |Convert an 'ETag' to an 'AsciiBuilder'.
 printETag ∷ ETag → AsciiBuilder
@@ -52,15 +67,9 @@ printETag et
 parseETag ∷ Ascii → ETag
 {-# INLINEABLE parseETag #-}
 parseETag str
-    = case parseOnly p $ A.toByteString str of
+    = case parseOnly (finishOff eTag) $ A.toByteString str of
         Right et → et
         Left err → error ("unparsable ETag: " ⧺ A.toString str ⧺ ": " ⧺ err)
-    where
-      p ∷ Parser ETag
-      {-# INLINE p #-}
-      p = do et ← eTag
-             endOfInput
-             return et
 
 -- |This is equivalent to @'ETag' 'False'@. If you want to generate an
 -- ETag from a file, try using