This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "snap-core".

The branch, blaze-builder has been created
        at  371e3a3c19638fb6a466395090ae39686de6261d (commit)

- Log -----------------------------------------------------------------
commit 371e3a3c19638fb6a466395090ae39686de6261d
Author: Gregory Collins <[email protected]>
Date:   Sun Dec 26 14:35:42 2010 +0100

    Tests with builder now passing.

diff --git a/test/snap-core-testsuite.cabal b/test/snap-core-testsuite.cabal
index 996b4df..c2cb16f 100644
--- a/test/snap-core-testsuite.cabal
+++ b/test/snap-core-testsuite.cabal
@@ -26,6 +26,7 @@ Executable testsuite
     blaze-builder >= 0.2.1 && <0.3,
     bytestring,
     bytestring-nums,
+    cereal == 0.3.*,
     containers,
     deepseq >= 1.1 && <1.2,
     directory,
diff --git a/test/suite/Snap/Internal/Http/Types/Tests.hs 
b/test/suite/Snap/Internal/Http/Types/Tests.hs
index 893c4dc..8ea0e24 100644
--- a/test/suite/Snap/Internal/Http/Types/Tests.hs
+++ b/test/suite/Snap/Internal/Http/Types/Tests.hs
@@ -3,14 +3,14 @@
 module Snap.Internal.Http.Types.Tests
   ( tests ) where
 
+import           Blaze.ByteString.Builder
 import           Control.Monad
 import           Control.Parallel.Strategies
-import qualified Data.ByteString.Char8 as S
 import           Data.ByteString.Char8 (ByteString)
 import           Data.ByteString.Lazy.Char8 ()
 import           Data.IORef
-import           Data.List (sort)
 import qualified Data.Map as Map
+import           Data.Monoid
 import           Data.Time.Calendar
 import           Data.Time.Clock
 import           Prelude hiding (take)
@@ -91,8 +91,8 @@ testTypes = testCase "show" $ do
     assertEqual "content-length" (Just 4) $ rspContentLength resp
     -- run response body
     let benum = rspBodyToEnum $ rspBody resp
-    bd <- runIteratee consume >>= run_ . benum
-    assertEqual "response body" "PING" $ S.concat bd
+    bd <- liftM (toByteString . mconcat) (runIteratee consume >>= run_ . benum)
+    assertEqual "response body" "PING" $ bd
 
     let !_ = show GET
     let !_ = GET == POST
@@ -107,7 +107,7 @@ testTypes = testCase "show" $ do
     resp = addResponseCookie cook $
            setContentLength 4 $
            modifyResponseBody id $
-           setResponseBody (enumBS "PING") $
+           setResponseBody (enumBuilder (fromByteString "PING")) $
            setContentType "text/plain" $
            setResponseStatus 555 "bogus" $
            emptyResponse
diff --git a/test/suite/Snap/Types/Tests.hs b/test/suite/Snap/Types/Tests.hs
index a1c9713..6493053 100644
--- a/test/suite/Snap/Types/Tests.hs
+++ b/test/suite/Snap/Types/Tests.hs
@@ -5,6 +5,7 @@
 module Snap.Types.Tests
   ( tests ) where
 
+import           Blaze.ByteString.Builder
 import           Control.Applicative
 import           Control.Concurrent.MVar
 import           Control.Exception (SomeException)
@@ -16,6 +17,7 @@ import           Data.ByteString.Char8 (ByteString)
 import qualified Data.ByteString.Char8 as S
 import qualified Data.ByteString.Lazy.Char8 as L
 import           Data.IORef
+import           Data.Monoid
 import           Data.Text ()
 import           Data.Text.Lazy ()
 import qualified Data.Map as Map
@@ -305,7 +307,7 @@ testParam = testCase "types/getParam" $ do
 getBody :: Response -> IO L.ByteString
 getBody r = do
     let benum = rspBodyToEnum $ rspBody r
-    liftM L.fromChunks (runIteratee consume >>= run_ . benum)
+    liftM (toLazyByteString . mconcat) (runIteratee consume >>= run_ . benum)
 
 
 testWrites :: Test
@@ -316,7 +318,7 @@ testWrites = testCase "types/writes" $ do
   where
     h :: Snap ()
     h = do
-        addToOutput $ enumBS "Foo1"
+        addToOutput $ enumBuilder $ fromByteString "Foo1"
         writeBS "Foo2"
         writeLBS "Foo3"
 
@@ -343,7 +345,7 @@ testDir2 = testCase "types/dir2" $ do
   where
     f = dir "foo" $ dir "bar" $ do
             p <- liftM rqContextPath getRequest
-            addToOutput $ enumBS p
+            addToOutput $ enumBuilder $ fromByteString p
 
 
 testIpHeaderFilter :: Test
diff --git a/test/suite/Snap/Util/FileServe/Tests.hs 
b/test/suite/Snap/Util/FileServe/Tests.hs
index b708e82..8135d93 100644
--- a/test/suite/Snap/Util/FileServe/Tests.hs
+++ b/test/suite/Snap/Util/FileServe/Tests.hs
@@ -5,6 +5,7 @@
 module Snap.Util.FileServe.Tests
   ( tests ) where
 
+import           Blaze.ByteString.Builder
 import           Control.Monad
 import           Data.ByteString (ByteString)
 import qualified Data.ByteString.Char8 as S
@@ -12,6 +13,7 @@ import qualified Data.ByteString.Lazy.Char8 as L
 import           Data.IORef
 import qualified Data.Map as Map
 import           Data.Maybe
+import           Data.Monoid
 import           Prelude hiding (take)
 import           Test.Framework
 import           Test.Framework.Providers.HUnit
@@ -40,7 +42,7 @@ expect404 m = do
 getBody :: Response -> IO L.ByteString
 getBody r = do
     let benum = rspBodyToEnum $ rspBody r
-    liftM L.fromChunks (runIteratee consume >>= run_ . benum)
+    liftM (toLazyByteString . mconcat) (runIteratee consume >>= run_ . benum)
 
 
 go :: Snap a -> ByteString -> IO Response
diff --git a/test/suite/Snap/Util/GZip/Tests.hs 
b/test/suite/Snap/Util/GZip/Tests.hs
index b96dd0b..3247d12 100644
--- a/test/suite/Snap/Util/GZip/Tests.hs
+++ b/test/suite/Snap/Util/GZip/Tests.hs
@@ -6,16 +6,17 @@
 module Snap.Util.GZip.Tests
   ( tests ) where
 
+import           Blaze.ByteString.Builder
 import qualified Codec.Compression.GZip as GZip
 import qualified Codec.Compression.Zlib as Zlib
 import           Control.Exception hiding (assert)
 import           Control.Monad (liftM)
-import           Data.ByteString (ByteString)
 import qualified Data.ByteString.Lazy.Char8 as L
 import           Data.Digest.Pure.MD5
 import           Data.IORef
 import qualified Data.Map as Map
-import           Data.Serialize
+import           Data.Monoid
+import           Data.Serialize (encode)
 import           Test.Framework
 import           Test.Framework.Providers.QuickCheck2
 import           Test.QuickCheck
@@ -32,8 +33,8 @@ import           Snap.Util.GZip
 
 
 stream2stream
-  :: Iteratee ByteString IO L.ByteString
-stream2stream = liftM L.fromChunks consume
+  :: Iteratee Builder IO L.ByteString
+stream2stream = liftM (toLazyByteString . mconcat) consume
 
 ------------------------------------------------------------------------------
 tests :: [Test]
@@ -150,20 +151,21 @@ goNoHeaders = goGeneric mkNoHeaders
 
 ------------------------------------------------------------------------------
 noContentType :: L.ByteString -> Snap ()
-noContentType s = modifyResponse $ setResponseBody (enumLBS s)
+noContentType s = modifyResponse $ setResponseBody $
+                  enumBuilder $ fromLazyByteString s
 
 
 ------------------------------------------------------------------------------
 textPlain :: L.ByteString -> Snap ()
 textPlain s = modifyResponse $
-              setResponseBody (enumLBS s) .
+              setResponseBody (enumBuilder $ fromLazyByteString s) .
               setContentType "text/plain"
 
 
 ------------------------------------------------------------------------------
 binary :: L.ByteString -> Snap ()
 binary s = modifyResponse $
-           setResponseBody (enumLBS s) .
+           setResponseBody (enumBuilder $ fromLazyByteString s) .
            setContentType "application/octet-stream"
 
 
commit c9da51d3deeea8afcf94633004c3c27f470e2fc3
Merge: db70866 8365c6b
Author: Gregory Collins <[email protected]>
Date:   Sun Dec 26 14:25:25 2010 +0100

    Merge branch 'master' into blaze-builder

commit db70866664f6192ae04fde618126943fb02d34fd
Author: Gregory Collins <[email protected]>
Date:   Wed Dec 22 13:48:14 2010 +0100

    Checkpoint: remove deps from testsuite

diff --git a/test/snap-core-testsuite.cabal b/test/snap-core-testsuite.cabal
index 7a5ab59..996b4df 100644
--- a/test/snap-core-testsuite.cabal
+++ b/test/snap-core-testsuite.cabal
@@ -23,10 +23,9 @@ Executable testsuite
     QuickCheck >= 2.3.0.2,
     attoparsec >= 0.8.1 && < 0.9,
     base >= 4 && < 5,
+    blaze-builder >= 0.2.1 && <0.3,
     bytestring,
     bytestring-nums,
-    bytestring-show >= 0.3.2 && < 0.4,
-    cereal >= 0.3 && < 0.4,
     containers,
     deepseq >= 1.1 && <1.2,
     directory,
@@ -35,7 +34,7 @@ Executable testsuite
     HUnit >= 1.2 && < 2,
     enumerator == 0.4.*,
     MonadCatchIO-transformers >= 0.2 && < 0.3,
-    monads-fd <0.2,
+    mtl >= 2 && <3,
     old-locale,
     old-time,
     parallel >= 2.2 && <2.3,
commit efbf4dc4fb8c9286629845d4ec1e179ea3bcab75
Merge: 6e7858d 9875cff
Author: Gregory Collins <[email protected]>
Date:   Wed Dec 22 10:11:49 2010 +0100

    Merge branch 'master' into blaze-builder

diff --cc src/Snap/Internal/Iteratee/Debug.hs
index 6892cdb,9565f86..4d568ea
--- a/src/Snap/Internal/Iteratee/Debug.hs
+++ b/src/Snap/Internal/Iteratee/Debug.hs
@@@ -94,17 -75,10 +94,19 @@@ iterateeDebugWrapper = iterateeDebugWra
  
  #else
  
 +iterateeDebugWrapperWith :: (MonadIO m) =>
 +                            (s -> String)
 +                         -> String
 +                         -> Iteratee s m a
 +                         -> Iteratee s m a
 +iterateeDebugWrapperWith _ _ = id
 +{-# INLINE iterateeDebugWrapperWith #-}
 +
 +
- iterateeDebugWrapper :: (MonadIO m, Show s) =>
-                         String -> Iteratee s m a -> Iteratee s m a
+ iterateeDebugWrapper :: (Show a, MonadIO m) =>
+                         String
+                      -> Iteratee a m b
+                      -> Iteratee a m b
  iterateeDebugWrapper _ = id
  {-# INLINE iterateeDebugWrapper #-}
  
commit 6e7858d7bd4314365a03a27c8d8d45de88f17098
Author: Gregory Collins <[email protected]>
Date:   Wed Dec 22 10:09:45 2010 +0100

    Checkpoint: cleanup warnings

diff --git a/src/Snap/Internal/Http/Types.hs b/src/Snap/Internal/Http/Types.hs
index 26162c7..cdce09f 100644
--- a/src/Snap/Internal/Http/Types.hs
+++ b/src/Snap/Internal/Http/Types.hs
@@ -40,24 +40,25 @@ import qualified Data.Map as Map
 import           Data.Maybe
 import           Data.Monoid
 import           Data.Time.Clock
-import           Data.Time.Format
 import           Data.Word
 import           Foreign hiding (new)
 import           Foreign.C.Types
 import           Prelude hiding (take)
-import           System.Locale (defaultTimeLocale)
 
 
 #ifdef PORTABLE
+import           Data.Time.Format
 import           Data.Time.LocalTime
 import           Data.Time.Clock.POSIX
+import           System.Locale (defaultTimeLocale)
 #else
+import           Data.Time.Format ()
 import           Foreign.C.String
 #endif
 
 ------------------------------------------------------------------------------
 import           Data.CIByteString
-import           Snap.Iteratee (Enumerator, ($$), (>>==))
+import           Snap.Iteratee (Enumerator)
 import qualified Snap.Iteratee as I
 
 
diff --git a/src/Snap/Internal/Iteratee/Debug.hs 
b/src/Snap/Internal/Iteratee/Debug.hs
index 625573c..6892cdb 100644
--- a/src/Snap/Internal/Iteratee/Debug.hs
+++ b/src/Snap/Internal/Iteratee/Debug.hs
@@ -55,7 +55,7 @@ iterateeDebugWrapperWith :: (MonadIO m) =>
                          -> String
                          -> Iteratee a m b
                          -> Iteratee a m b
-iterateeDebugWrapperWith shower name iter = do
+iterateeDebugWrapperWith showFunc name iter = do
     debug $ name ++ ": BEGIN"
     step <- lift $ runIteratee iter
     whatWasReturn step
@@ -76,13 +76,13 @@ iterateeDebugWrapperWith shower name iter = do
         k EOF
 
     f k ch@(Chunks xs) = do
-        debug $ name ++ ": got chunk: " ++ showList xs
+        debug $ name ++ ": got chunk: " ++ showL xs
         step <- lift $ runIteratee $ k ch
         whatWasReturn step
         check step
 
-    showStream = show . fmap shower
-    showList = show . map shower
+    showStream = show . fmap showFunc
+    showL = show . map showFunc
 
 
 iterateeDebugWrapper :: (Show a, MonadIO m) =>
diff --git a/src/Snap/Internal/Types.hs b/src/Snap/Internal/Types.hs
index 683e31a..ec5216a 100644
--- a/src/Snap/Internal/Types.hs
+++ b/src/Snap/Internal/Types.hs
@@ -25,9 +25,7 @@ import           Data.IORef
 import           Data.Maybe
 import           Data.Monoid
 import qualified Data.Text as T
-import qualified Data.Text.Encoding as T
 import qualified Data.Text.Lazy as LT
-import qualified Data.Text.Lazy.Encoding as LT
 import           Data.Typeable
 import           Prelude hiding (catch, take)
 
commit 1e1a266af4518f71e883ea3162d59142deecc2bc
Author: Gregory Collins <[email protected]>
Date:   Wed Dec 22 09:11:03 2010 +0100

    Needs cleanup, but compiles now with builder definition

diff --git a/src/Snap/Internal/Http/Types.hs b/src/Snap/Internal/Http/Types.hs
index 53fa105..26162c7 100644
--- a/src/Snap/Internal/Http/Types.hs
+++ b/src/Snap/Internal/Http/Types.hs
@@ -57,7 +57,7 @@ import           Foreign.C.String
 
 ------------------------------------------------------------------------------
 import           Data.CIByteString
-import           Snap.Iteratee (Enumerator)
+import           Snap.Iteratee (Enumerator, ($$), (>>==))
 import qualified Snap.Iteratee as I
 
 
@@ -174,7 +174,7 @@ type Params = Map ByteString [ByteString]
 -- request type
 ------------------------------------------------------------------------------
 
--- | An existential wrapper for the 'Enumerator' type
+-- | An existential wrapper for the 'Enumerator ByteString IO a' type
 data SomeEnumerator = SomeEnumerator (forall a . Enumerator ByteString IO a)
 
 
@@ -351,8 +351,8 @@ instance HasHeaders Headers where
 -- response type
 ------------------------------------------------------------------------------
 
-data ResponseBody = Enum (forall a . Enumerator ByteString IO a)
-                      -- ^ output body is enumerator
+data ResponseBody = Enum (forall a . Enumerator Builder IO a)
+                      -- ^ output body is a 'Builder' enumerator
 
                   | SendFile FilePath (Maybe (Int64,Int64))
                       -- ^ output body is sendfile(), optional second argument
@@ -361,17 +361,19 @@ data ResponseBody = Enum (forall a . Enumerator 
ByteString IO a)
 
 ------------------------------------------------------------------------------
 rspBodyMap :: (forall a .
-               Enumerator ByteString IO a -> Enumerator ByteString IO a)
+               Enumerator Builder IO a -> Enumerator Builder IO a)
            -> ResponseBody
            -> ResponseBody
 rspBodyMap f b      = Enum $ f $ rspBodyToEnum b
 
 
+
 ------------------------------------------------------------------------------
-rspBodyToEnum :: ResponseBody -> Enumerator ByteString IO a
+rspBodyToEnum :: ResponseBody -> Enumerator Builder IO a
 rspBodyToEnum (Enum e) = e
-rspBodyToEnum (SendFile fp Nothing)  = I.enumFile fp
-rspBodyToEnum (SendFile fp (Just s)) = I.enumFilePartial fp s
+rspBodyToEnum (SendFile fp Nothing)  = I.mapEnum fromByteString $ I.enumFile fp
+rspBodyToEnum (SendFile fp (Just s)) = I.mapEnum fromByteString $
+                                       I.enumFilePartial fp s
 
 
 ------------------------------------------------------------------------------
@@ -466,13 +468,14 @@ rqSetParam k v = rqModifyParams $ Map.insert k v
 
 -- | An empty 'Response'.
 emptyResponse :: Response
-emptyResponse = Response Map.empty Map.empty (1,1) Nothing (Enum (I.enumBS 
"")) 
+emptyResponse = Response Map.empty Map.empty (1,1) Nothing
+                         (Enum (I.enumBuilder mempty)) 
                          200 "OK" False
 
 
 ------------------------------------------------------------------------------
 -- | Sets an HTTP response body to the given 'Enumerator' value.
-setResponseBody     :: (forall a . Enumerator ByteString IO a)
+setResponseBody     :: (forall a . Enumerator Builder IO a)
                                    -- ^ new response body enumerator
                     -> Response    -- ^ response to modify
                     -> Response
@@ -505,8 +508,8 @@ setResponseCode s r = setResponseStatus s reason r
 
 ------------------------------------------------------------------------------
 -- | Modifies a response body.
-modifyResponseBody  :: (forall a . Enumerator ByteString IO a
-                                -> Enumerator ByteString IO a)
+modifyResponseBody  :: (forall a . Enumerator Builder IO a
+                                -> Enumerator Builder IO a)
                     -> Response
                     -> Response
 modifyResponseBody f r = r { rspBody = rspBodyMap f (rspBody r) }
diff --git a/src/Snap/Internal/Iteratee/Debug.hs 
b/src/Snap/Internal/Iteratee/Debug.hs
index f3c8f8c..625573c 100644
--- a/src/Snap/Internal/Iteratee/Debug.hs
+++ b/src/Snap/Internal/Iteratee/Debug.hs
@@ -11,21 +11,29 @@
 module Snap.Internal.Iteratee.Debug
   ( debugIteratee
   , iterateeDebugWrapper
+  , iterateeDebugWrapperWith
+  , showBuilder
   ) where
 
 ------------------------------------------------------------------------------
-import             Control.Monad.Trans
-import             Data.ByteString (ByteString)
-import             System.IO
+import           Blaze.ByteString.Builder
+import           Control.Monad.Trans
+import           Data.ByteString (ByteString)
+import           System.IO
 ------------------------------------------------------------------------------
 #ifndef NODEBUG
 import           Snap.Internal.Debug
 #endif
-import           Snap.Iteratee
+import           Snap.Iteratee hiding (map)
 ------------------------------------------------------------------------------
 
 
 ------------------------------------------------------------------------------
+showBuilder :: Builder -> String
+showBuilder = show . toByteString
+
+
+------------------------------------------------------------------------------
 debugIteratee :: Iteratee ByteString IO ()
 debugIteratee = continue f
   where
@@ -42,11 +50,12 @@ debugIteratee = continue f
 
 #ifndef NODEBUG
 
-iterateeDebugWrapper :: (Show a, MonadIO m) =>
-                        String
-                     -> Iteratee a m b
-                     -> Iteratee a m b
-iterateeDebugWrapper name iter = do
+iterateeDebugWrapperWith :: (MonadIO m) =>
+                            (a -> String)
+                         -> String
+                         -> Iteratee a m b
+                         -> Iteratee a m b
+iterateeDebugWrapperWith shower name iter = do
     debug $ name ++ ": BEGIN"
     step <- lift $ runIteratee iter
     whatWasReturn step
@@ -55,7 +64,7 @@ iterateeDebugWrapper name iter = do
   where
     whatWasReturn (Continue _) = debug $ name ++ ": continue"
     whatWasReturn (Yield _ z)  = debug $ name ++ ": yield, with remainder "
-                                              ++ show z
+                                              ++ showStream z
     whatWasReturn (Error e)    = debug $ name ++ ": error, with " ++ show e
 
     check (Continue k) = continue $ f k
@@ -67,15 +76,35 @@ iterateeDebugWrapper name iter = do
         k EOF
 
     f k ch@(Chunks xs) = do
-        debug $ name ++ ": got chunk: " ++ show xs
+        debug $ name ++ ": got chunk: " ++ showList xs
         step <- lift $ runIteratee $ k ch
         whatWasReturn step
         check step
 
+    showStream = show . fmap shower
+    showList = show . map shower
+
+
+iterateeDebugWrapper :: (Show a, MonadIO m) =>
+                        String
+                     -> Iteratee a m b
+                     -> Iteratee a m b
+iterateeDebugWrapper = iterateeDebugWrapperWith show
+
 
 #else
 
-iterateeDebugWrapper :: String -> Iteratee IO a -> Iteratee IO a
+iterateeDebugWrapperWith :: (MonadIO m) =>
+                            (s -> String)
+                         -> String
+                         -> Iteratee s m a
+                         -> Iteratee s m a
+iterateeDebugWrapperWith _ _ = id
+{-# INLINE iterateeDebugWrapperWith #-}
+
+
+iterateeDebugWrapper :: (MonadIO m, Show s) =>
+                        String -> Iteratee s m a -> Iteratee s m a
 iterateeDebugWrapper _ = id
 {-# INLINE iterateeDebugWrapper #-}
 
diff --git a/src/Snap/Internal/Types.hs b/src/Snap/Internal/Types.hs
index 0226fb1..683e31a 100644
--- a/src/Snap/Internal/Types.hs
+++ b/src/Snap/Internal/Types.hs
@@ -10,29 +10,32 @@ module Snap.Internal.Types where
 ------------------------------------------------------------------------------
 import "MonadCatchIO-transformers" Control.Monad.CatchIO
 
-import                       Control.Applicative
-import                       Control.Exception (throwIO, ErrorCall(..))
-import                       Control.Monad
-import                       Control.Monad.State
-import                       Data.ByteString.Char8 (ByteString)
-import qualified             Data.ByteString.Char8 as S
-import qualified             Data.ByteString.Lazy.Char8 as L
-import qualified             Data.CIByteString as CIB
-import                       Data.Int
-import                       Data.IORef
-import                       Data.Maybe
-import qualified             Data.Text as T
-import qualified             Data.Text.Encoding as T
-import qualified             Data.Text.Lazy as LT
-import qualified             Data.Text.Lazy.Encoding as LT
-import                       Data.Typeable
-import                       Prelude hiding (catch, take)
-
-
-------------------------------------------------------------------------------
-import                       Snap.Internal.Http.Types
-import                       Snap.Iteratee
-import                       Snap.Internal.Iteratee.Debug
+import           Blaze.ByteString.Builder
+import           Blaze.ByteString.Builder.Char.Utf8
+import           Control.Applicative
+import           Control.Exception (throwIO, ErrorCall(..))
+import           Control.Monad
+import           Control.Monad.State
+import           Data.ByteString.Char8 (ByteString)
+import qualified Data.ByteString.Char8 as S
+import qualified Data.ByteString.Lazy.Char8 as L
+import qualified Data.CIByteString as CIB
+import           Data.Int
+import           Data.IORef
+import           Data.Maybe
+import           Data.Monoid
+import qualified Data.Text as T
+import qualified Data.Text.Encoding as T
+import qualified Data.Text.Lazy as LT
+import qualified Data.Text.Lazy.Encoding as LT
+import           Data.Typeable
+import           Prelude hiding (catch, take)
+
+
+------------------------------------------------------------------
+import           Snap.Internal.Http.Types
+import           Snap.Iteratee
+import           Snap.Internal.Iteratee.Debug
 
 
 ------------------------------------------------------------------------------
@@ -239,7 +242,7 @@ getRequestBody = liftM L.fromChunks $ runRequestBody consume
 -- if you called 'finishWith'. Make sure you set any content types, headers,
 -- cookies, etc. before you call this function.
 --
-transformRequestBody :: (forall a . Enumerator ByteString IO a)
+transformRequestBody :: (forall a . Enumerator Builder IO a)
                          -- ^ the output 'Iteratee' is passed to this
                          -- 'Enumerator', and then the resulting 'Iteratee' is
                          -- fed the request body stream. Your 'Enumerator' is
@@ -249,14 +252,16 @@ transformRequestBody trans = do
     req <- getRequest
     let ioref = rqBody req
     senum <- liftIO $ readIORef ioref
-    let (SomeEnumerator enum) = senum
+    let (SomeEnumerator enum') = senum
+    let enum = mapEnum fromByteString enum'
     liftIO $ writeIORef ioref (SomeEnumerator enumEOF)
 
     origRsp <- getResponse
     let rsp = setResponseBody
                 (\writeEnd -> do
-                     let i = iterateeDebugWrapper "transformRequestBody"
-                                                  $ trans writeEnd
+                     let i = iterateeDebugWrapperWith showBuilder
+                                                      "transformRequestBody"
+                                                      $ trans writeEnd
                      st <- liftIO $ runIteratee i
 
                      enum st)
@@ -439,7 +444,7 @@ redirect' target status = do
     finishWith
         $ setResponseCode status
         $ setContentLength 0
-        $ modifyResponseBody (const $ enumBS "")
+        $ modifyResponseBody (const $ enumBuilder mempty)
         $ setHeader "Location" target r
 
 {-# INLINE redirect' #-}
@@ -457,12 +462,20 @@ logError s = liftSnap $ Snap $ gets _snapLogError >>= (\l 
-> liftIO $ l s)
 -- | Adds the output from the given enumerator to the 'Response'
 -- stored in the 'Snap' monad state.
 addToOutput :: MonadSnap m
-            => (forall a . Enumerator ByteString IO a)   -- ^ output to add
+            => (forall a . Enumerator Builder IO a)   -- ^ output to add
             -> m ()
 addToOutput enum = modifyResponse $ modifyResponseBody (>==> enum)
 
 
 ------------------------------------------------------------------------------
+-- | Adds the given 'Builder' to the body of the 'Response' stored in the
+-- | 'Snap' monad state.
+writeBuilder :: MonadSnap m => Builder -> m ()
+writeBuilder b = addToOutput $ enumBuilder b
+{-# INLINE writeBuilder #-}
+
+
+------------------------------------------------------------------------------
 -- | Adds the given strict 'ByteString' to the body of the 'Response' stored
 -- in the 'Snap' monad state.
 --
@@ -470,7 +483,7 @@ addToOutput enum = modifyResponse $ modifyResponseBody 
(>==> enum)
 -- exceptions are raised by the expression creating the 'ByteString',
 -- the exception won't actually be raised within the Snap handler.
 writeBS :: MonadSnap m => ByteString -> m ()
-writeBS s = addToOutput $ enumBS s
+writeBS s = writeBuilder $ fromByteString s
 
 
 ------------------------------------------------------------------------------
@@ -481,7 +494,7 @@ writeBS s = addToOutput $ enumBS s
 -- exceptions are raised by the expression creating the 'ByteString',
 -- the exception won't actually be raised within the Snap handler.
 writeLBS :: MonadSnap m => L.ByteString -> m ()
-writeLBS s = addToOutput $ enumLBS s
+writeLBS s = writeBuilder $ fromLazyByteString s
 
 
 ------------------------------------------------------------------------------
@@ -492,7 +505,7 @@ writeLBS s = addToOutput $ enumLBS s
 -- exceptions are raised by the expression creating the 'ByteString',
 -- the exception won't actually be raised within the Snap handler.
 writeText :: MonadSnap m => T.Text -> m ()
-writeText s = writeBS $ T.encodeUtf8 s
+writeText s = writeBuilder $ fromText s
 
 
 ------------------------------------------------------------------------------
@@ -503,7 +516,7 @@ writeText s = writeBS $ T.encodeUtf8 s
 -- exceptions are raised by the expression creating the 'ByteString',
 -- the exception won't actually be raised within the Snap handler.
 writeLazyText :: MonadSnap m => LT.Text -> m ()
-writeLazyText s = writeLBS $ LT.encodeUtf8 s
+writeLazyText s = writeBuilder $ fromLazyText s
 
 
 ------------------------------------------------------------------------------
@@ -679,7 +692,7 @@ runSnap (Snap m) logerr req = do
   where
     fourohfour = setContentLength 3 $
                  setResponseStatus 404 "Not Found" $
-                 modifyResponseBody (>==> enumBS "404") $
+                 modifyResponseBody (>==> enumBuilder (fromByteString "404")) $
                  emptyResponse
 
     dresp = emptyResponse { rspHttpVersion = rqVersion req }
diff --git a/src/Snap/Iteratee.hs b/src/Snap/Iteratee.hs
index a110b33..13de58c 100644
--- a/src/Snap/Iteratee.hs
+++ b/src/Snap/Iteratee.hs
@@ -17,6 +17,7 @@ module Snap.Iteratee
     -- * Enumerators
     enumBS
   , enumLBS
+  , enumBuilder
   , enumFile
   , enumFilePartial
   , InvalidRangeException
@@ -33,6 +34,8 @@ module Snap.Iteratee
   , takeExactly
   , takeNoMoreThan
   , skipToEof
+  , mapEnum
+  , mapIter
 
   , TooManyBytesReadException
   , ShortWriteException
@@ -103,6 +106,7 @@ import             Prelude hiding (catch,drop)
 
 -}
 
+import             Blaze.ByteString.Builder
 import             Control.DeepSeq
 import             Control.Exception (SomeException, assert)
 import             Control.Monad
@@ -113,6 +117,7 @@ import qualified   Data.ByteString.Char8 as S
 import qualified   Data.ByteString.Unsafe as S
 import qualified   Data.ByteString.Lazy.Char8 as L
 import             Data.Enumerator hiding (drop)
+import qualified   Data.Enumerator as I
 import             Data.Enumerator.IO (enumHandle)
 import             Data.List (foldl')
 import             Data.Monoid (mappend)
@@ -154,11 +159,16 @@ streamLength EOF         = 0
 
 
 ------------------------------------------------------------------------------
+-- | Enumerates a Builder.
+enumBuilder :: (Monad m) => Builder -> Enumerator Builder m a
+enumBuilder = enumList 1 . (:[])
+{-# INLINE enumBuilder #-}
+
+
+------------------------------------------------------------------------------
 -- | Enumerates a strict bytestring.
 enumBS :: (Monad m) => ByteString -> Enumerator ByteString m a
-enumBS bs (Continue k) = k (Chunks [bs])
-enumBS bs (Yield x s)  = Iteratee $ return $ Yield x (s `mappend` Chunks [bs])
-enumBS _  (Error e)    = Iteratee $ return $ Error e
+enumBS = enumList 1 . (:[])
 {-# INLINE enumBS #-}
 
 
@@ -628,3 +638,32 @@ enumFilePartial fp rng@(start,end) st@(Continue k) = do
                                     S.drop (fromEnum start) s ]
 
 #endif
+
+
+------------------------------------------------------------------------------
+mapIter :: (Monad m) =>
+           (aOut -> aIn)
+        -> Iteratee aOut m a
+        -> Iteratee aIn m a
+mapIter f iter = iter >>== check
+  where
+    check (Continue k) = k EOF >>== \s -> case s of
+        Continue _ -> error "divergent iteratee"
+        _ -> check s
+    check (Yield x rest) = yield x (fmap f rest)
+    check (Error e) = throwError e
+
+
+------------------------------------------------------------------------------
+mapEnum :: (Monad m) =>
+           (aOut -> aIn)
+        -> Enumerator aOut m a
+        -> Enumerator aIn m a
+mapEnum f enum builderStep = do
+    -- z :: Iteratee ByteString m (Step Builder m a)
+    let z = I.map f builderStep
+    -- p :: Iteratee ByteString m a
+    let p = joinI z
+    -- q :: Iteratee ByteString m a
+    let q = enum $$ p
+    mapIter f q
diff --git a/src/Snap/Types.hs b/src/Snap/Types.hs
index 9e47874..9de20e5 100644
--- a/src/Snap/Types.hs
+++ b/src/Snap/Types.hs
@@ -110,6 +110,7 @@ module Snap.Types
   , setResponseBody
   , modifyResponseBody
   , addToOutput
+  , writeBuilder
   , writeBS
   , writeLazyText
   , writeText
diff --git a/src/Snap/Util/FileServe.hs b/src/Snap/Util/FileServe.hs
index 025e9f9..2b3dcec 100644
--- a/src/Snap/Util/FileServe.hs
+++ b/src/Snap/Util/FileServe.hs
@@ -424,7 +424,7 @@ checkRangeReq req fp sz = do
                               . deleteHeader "Content-Type"
                               . deleteHeader "Content-Encoding"
                               . deleteHeader "Transfer-Encoding"
-                              . setResponseBody (enumBS "")
+                              . setResponseBody (enumBuilder mempty)
 
                return True
 
diff --git a/src/Snap/Util/GZip.hs b/src/Snap/Util/GZip.hs
index ba38c9b..ad109b0 100644
--- a/src/Snap/Util/GZip.hs
+++ b/src/Snap/Util/GZip.hs
@@ -8,27 +8,29 @@ module Snap.Util.GZip
 ( withCompression
 , withCompression' ) where
 
-import   qualified Codec.Compression.GZip as GZip
-import   qualified Codec.Compression.Zlib as Zlib
-import             Control.Concurrent
-import             Control.Applicative hiding (many)
-import             Control.Exception
-import             Control.Monad
-import             Control.Monad.Trans
-import             Data.Attoparsec.Char8 hiding (Done)
-import   qualified Data.ByteString.Lazy.Char8 as L
-import             Data.ByteString.Char8 (ByteString)
-import             Data.Maybe
-import   qualified Data.Set as Set
-import             Data.Set (Set)
-import             Data.Typeable
-import             Prelude hiding (catch, takeWhile)
-
-------------------------------------------------------------------------------
-import             Snap.Internal.Debug
-import             Snap.Internal.Parsing
-import             Snap.Iteratee
-import             Snap.Types
+import           Blaze.ByteString.Builder
+import qualified Codec.Compression.GZip as GZip
+import qualified Codec.Compression.Zlib as Zlib
+import           Control.Concurrent
+import           Control.Applicative hiding (many)
+import           Control.Exception
+import           Control.Monad
+import           Control.Monad.Trans
+import           Data.Attoparsec.Char8 hiding (Done)
+import qualified Data.ByteString.Lazy.Char8 as L
+import           Data.ByteString.Char8 (ByteString)
+import           Data.Maybe
+import qualified Data.Set as Set
+import           Data.Set (Set)
+import           Data.Typeable
+import           Prelude hiding (catch, takeWhile)
+
+----------------------------------------------------------------------------
+import           Snap.Internal.Debug
+import           Snap.Internal.Parsing
+import           Snap.Iteratee
+import qualified Snap.Iteratee as I
+import           Snap.Types
 
 
 ------------------------------------------------------------------------------
@@ -155,28 +157,32 @@ compressCompression ce = modifyResponse f
 
 ------------------------------------------------------------------------------
 -- FIXME: use zlib-bindings
-gcompress :: forall a . Enumerator ByteString IO a
-          -> Enumerator ByteString IO  a
+gcompress :: forall a . Enumerator Builder IO a
+          -> Enumerator Builder IO  a
 gcompress = compressEnumerator GZip.compress
 
 
 ------------------------------------------------------------------------------
-ccompress :: forall a . Enumerator ByteString IO a
-          -> Enumerator ByteString IO a
+ccompress :: forall a . Enumerator Builder IO a
+          -> Enumerator Builder IO a
 ccompress = compressEnumerator Zlib.compress
 
 
 ------------------------------------------------------------------------------
 compressEnumerator :: forall a .
                       (L.ByteString -> L.ByteString)
-                   -> Enumerator ByteString IO a
-                   -> Enumerator ByteString IO a
-compressEnumerator compFunc enum origStep = do
+                   -> Enumerator Builder IO a
+                   -> Enumerator Builder IO a
+compressEnumerator compFunc enum' origStep = do
+    let iter = joinI $ I.map fromByteString origStep
+    step <- lift $ runIteratee iter
     writeEnd <- liftIO $ newChan
     readEnd  <- liftIO $ newChan
     tid      <- liftIO $ forkIO $ threadProc readEnd writeEnd
 
-    enum (f readEnd writeEnd tid origStep)
+    let enum = mapEnum toByteString enum'
+    let outEnum = enum (f readEnd writeEnd tid step)
+    mapIter fromByteString outEnum
 
   where
     --------------------------------------------------------------------------
commit 7f65679d0d5737063b3294b2e5961c7b4244bb16
Author: Gregory Collins <[email protected]>
Date:   Wed Dec 22 07:31:08 2010 +0100

    Checkpoint: remove cereal, bytestring-show dependencies, add blaze-builder

diff --git a/snap-core.cabal b/snap-core.cabal
index 53d4cdf..a010117 100644
--- a/snap-core.cabal
+++ b/snap-core.cabal
@@ -1,5 +1,5 @@
 name:           snap-core
-version:        0.3.0
+version:        0.4.0
 synopsis:       Snap: A Haskell Web Framework (Core)
 
 description:
@@ -141,9 +141,9 @@ Library
   build-depends:
     attoparsec >= 0.8.0.2 && < 0.9,
     base >= 4 && < 5,
+    blaze-builder >= 0.2.1 && <0.3,
     bytestring,
     bytestring-nums,
-    bytestring-show >= 0.3.2 && < 0.4,
     cereal >= 0.3 && < 0.4,
     containers,
     deepseq >= 1.1 && <1.2,
diff --git a/src/Snap/Internal/Http/Types.hs b/src/Snap/Internal/Http/Types.hs
index 5f4a356..53fa105 100644
--- a/src/Snap/Internal/Http/Types.hs
+++ b/src/Snap/Internal/Http/Types.hs
@@ -16,6 +16,7 @@ module Snap.Internal.Http.Types where
 
 
 ------------------------------------------------------------------------------
+import           Blaze.ByteString.Builder
 import           Control.Applicative hiding (empty)
 import           Control.Monad (liftM, when)
 import qualified Data.Attoparsec as Atto
@@ -38,7 +39,6 @@ import           Data.Map (Map)
 import qualified Data.Map as Map
 import           Data.Maybe
 import           Data.Monoid
-import           Data.Serialize.Builder
 import           Data.Time.Clock
 import           Data.Time.Format
 import           Data.Word
@@ -731,13 +731,13 @@ urlDecode = parseToCompletion pUrlEscaped
 -- | URL-escapes a string (see
 -- <http://tools.ietf.org/html/rfc2396.html#section-2.4>)
 urlEncode :: ByteString -> ByteString
-urlEncode = toByteString . S.foldl' f empty
+urlEncode = toByteString . S.foldl' f mempty
   where
     f b c =
         if c == c2w ' '
-          then b `mappend` singleton (c2w '+')
+          then b `mappend` fromWord8 (c2w '+')
           else if isKosher c
-                 then b `mappend` singleton c
+                 then b `mappend` fromWord8 c
                  else b `mappend` hexd c
 
     isKosher w = any ($ c) [ isAlphaNum
@@ -749,7 +749,7 @@ urlEncode = toByteString . S.foldl' f empty
 
 ------------------------------------------------------------------------------
 hexd :: Word8 -> Builder
-hexd c = singleton (c2w '%') `mappend` singleton hi `mappend` singleton low
+hexd c = fromWord8 (c2w '%') `mappend` fromWord8 hi `mappend` fromWord8 low
   where
     d   = c2w . intToDigit
     low = d $ fromEnum $ c .&. 0xf
diff --git a/src/Snap/Util/FileServe.hs b/src/Snap/Util/FileServe.hs
index 0f1db50..025e9f9 100644
--- a/src/Snap/Util/FileServe.hs
+++ b/src/Snap/Util/FileServe.hs
@@ -16,23 +16,25 @@ module Snap.Util.FileServe
 ) where
 
 ------------------------------------------------------------------------------
+import           Blaze.ByteString.Builder
+import           Blaze.ByteString.Builder.Char8
 import           Control.Applicative
 import           Control.Monad
 import           Control.Monad.Trans
 import           Data.Attoparsec.Char8 hiding (Done)
 import qualified Data.ByteString.Char8 as S
-import qualified Data.ByteString.Lazy.Char8 as L
 import           Data.ByteString.Char8 (ByteString)
+import           Data.ByteString.Internal (c2w)
 import           Data.Int
 import           Data.Map (Map)
 import qualified Data.Map as Map
 import           Data.Maybe (fromMaybe, isNothing)
+import           Data.Monoid
 import           Prelude hiding (show, Show)
 import qualified Prelude
 import           System.Directory
 import           System.FilePath
 import           System.PosixCompat.Files
-import           Text.Show.ByteString hiding (runPut)
 ------------------------------------------------------------------------------
 import           Snap.Internal.Debug
 import           Snap.Internal.Parsing
@@ -385,14 +387,13 @@ checkRangeReq req fp sz = do
     send206 start end = do
         dbg "inside send206"
         let len = end-start+1
-        let crng = S.concat $
-                   L.toChunks $
-                   L.concat [ "bytes "
-                            , show start
-                            , "-"
-                            , show end
-                            , "/"
-                            , show sz ]
+        let crng = toByteString $
+                   mconcat [ fromByteString "bytes "
+                           , fromShow start
+                           , fromWord8 (c2w '-')
+                           , fromShow end
+                           , fromWord8 (c2w '/')
+                           , fromShow sz ]
 
         modifyResponse $ setResponseCode 206
                        . setHeader "Content-Range" crng
@@ -413,9 +414,9 @@ checkRangeReq req fp sz = do
         if getHeader "If-Range" req /= Nothing
            then return False
            else do
-               let crng = S.concat $
-                          L.toChunks $
-                          L.concat ["bytes */", show sz]
+               let crng = toByteString $
+                          mconcat [ fromByteString "bytes */"
+                                  , fromShow sz ]
 
                modifyResponse $ setResponseCode 416
                               . setHeader "Content-Range" crng
-----------------------------------------------------------------------


hooks/post-receive
-- 
snap-core
_______________________________________________
Snap mailing list
[email protected]
http://mailman-mail5.webfaction.com/listinfo/snap

Reply via email to