]> gitweb @ CieloNegro.org - Lucu.git/blobdiff - Network/HTTP/Lucu/Headers.hs
Make use of auto-derivers
[Lucu.git] / Network / HTTP / Lucu / Headers.hs
index 8219624df47b052df0be224e37dbda10957927bc..242d19194d0a30f7f0d68bc375bc1914f0942505 100644 (file)
@@ -2,10 +2,12 @@
     FlexibleInstances
   , GeneralizedNewtypeDeriving
   , MultiParamTypeClasses
+  , TemplateHaskell
   , TypeSynonymInstances
   , OverloadedStrings
   , UnicodeSyntax
   #-}
+{-# OPTIONS_GHC -fno-warn-missing-methods #-}
 -- |An internal module for HTTP headers.
 module Network.HTTP.Lucu.Headers
     ( Headers
@@ -15,26 +17,26 @@ module Network.HTTP.Lucu.Headers
     , printHeaders
     )
     where
-import Control.Applicative
+import Control.Applicative hiding (empty)
 import Control.Applicative.Unicode hiding ((∅))
-import Control.Arrow
 import Control.Monad
 import Data.Ascii (Ascii, AsciiBuilder, CIAscii)
 import qualified Data.Ascii as A
 import Data.Attoparsec.Char8 as P
+import qualified Data.Collections.Newtype.TH as C
 import Data.List (intersperse)
-import qualified Data.Map as M
+import qualified Data.Map as M (Map)
 import Data.Collections
 import Data.Collections.BaseInstances ()
 import Data.Monoid
 import Data.Monoid.Unicode
 import Network.HTTP.Lucu.Parser.Http
-import Prelude hiding (filter, lookup, null)
+import Prelude hiding (lookup, null)
 import Prelude.Unicode
 
 newtype Headers
     = Headers (M.Map CIAscii Ascii)
-      deriving (Eq, Monoid, Show)
+      deriving (Eq, Show)
 
 class HasHeaders a where
     getHeaders ∷ a → Headers
@@ -68,56 +70,28 @@ instance HasHeaders Headers where
     getHeaders   = id
     setHeaders _ = id
 
+C.derive [d| instance Foldable   Headers (CIAscii, Ascii)
+             instance Collection Headers (CIAscii, Ascii)
+             instance Indexed    Headers  CIAscii  Ascii
+             instance Map        Headers  CIAscii  Ascii
+             instance SortingCollection Headers (CIAscii, Ascii)
+           |]
+
 -- |@'insert' (key, val)@ merges @val@ with an existing one if any.
 instance Unfoldable Headers (CIAscii, Ascii) where
     {-# INLINE insert #-}
     insert (key, val) (Headers m)
         = Headers $ insertWith merge key val m
+    {-# INLINE empty #-}
+    empty     = Headers empty
+    {-# INLINE singleton #-}
+    singleton = Headers ∘ singleton
 
-instance Foldable Headers (CIAscii, Ascii) where
-    {-# INLINE foldMap #-}
-    foldMap f (Headers m) = foldMap f m
-
-instance Collection Headers (CIAscii, Ascii) where
-    {-# INLINE filter #-}
-    filter f (Headers m) = Headers $ filter f m
-
-instance Indexed Headers CIAscii Ascii where
-    {-# INLINE index #-}
-    index k (Headers m) = index k m
-    {-# INLINE adjust #-}
-    adjust f k (Headers m) = Headers $ adjust f k m
-    {-# INLINE inDomain #-}
-    inDomain k (Headers m) = inDomain k m
-
-instance Map Headers CIAscii Ascii where
-    {-# INLINE lookup #-}
-    lookup k (Headers m) = lookup k m
-    {-# INLINE insertWith #-}
-    insertWith f k v (Headers m)
-        = Headers $ insertWith f k v m
-    {-# INLINE mapWithKey #-}
-    mapWithKey f (Headers m)
-        = Headers $ mapWithKey f m
-    {-# INLINE unionWith #-}
-    unionWith f (Headers α) (Headers β)
-        = Headers $ unionWith f α β
-    {-# INLINE intersectionWith #-}
-    intersectionWith f (Headers α) (Headers β)
-        = Headers $ intersectionWith f α β
-    {-# INLINE differenceWith #-}
-    differenceWith f (Headers α) (Headers β)
-        = Headers $ differenceWith f α β
-    {-# INLINE isSubmapBy #-}
-    isSubmapBy f (Headers α) (Headers β)
-        = isSubmapBy f α β
-    {-# INLINE isProperSubmapBy #-}
-    isProperSubmapBy f (Headers α) (Headers β)
-        = isProperSubmapBy f α β
-
-instance SortingCollection Headers (CIAscii, Ascii) where
-    {-# INLINE minView #-}
-    minView (Headers m) = second Headers <$> minView m
+instance Monoid Headers where
+    {-# INLINE mempty #-}
+    mempty  = empty
+    {-# INLINE mappend #-}
+    mappend = insertMany
 
 merge ∷ Ascii → Ascii → Ascii
 {-# INLINE merge #-}
@@ -168,11 +142,11 @@ headers = do xs ← P.many header
       joinValues = A.fromAsciiBuilder
                    ∘ mconcat
                    ∘ intersperse (A.toAsciiBuilder "\x20")
-                   ∘ map A.toAsciiBuilder
+                   ∘ (A.toAsciiBuilder <$>)
 
 printHeaders ∷ Headers → AsciiBuilder
 printHeaders (Headers m)
-    = mconcat (map printHeader (fromFoldable m)) ⊕
+    = mconcat (printHeader <$> fromFoldable m) ⊕
       A.toAsciiBuilder "\x0D\x0A"
     where
       printHeader ∷ (CIAscii, Ascii) → AsciiBuilder