module Snap.Internal.Iteratee.Debug
( debugIteratee
, iterateeDebugWrapper
, iterateeDebugWrapperWith
, showBuilder
) where
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 hiding (map)
showBuilder :: Builder -> String
showBuilder = show . toByteString
debugIteratee :: Iteratee ByteString IO ()
debugIteratee = continue f
where
f EOF = do
liftIO $ putStrLn $ "got EOF"
liftIO $ hFlush stdout
yield () EOF
f (Chunks xs) = do
liftIO $ putStrLn $ "got chunk: " ++ show (xs)
liftIO $ hFlush stdout
continue f
#ifndef NODEBUG
iterateeDebugWrapperWith :: (MonadIO m) =>
(a -> String)
-> String
-> Iteratee a m b
-> Iteratee a m b
iterateeDebugWrapperWith showFunc name iter = do
debug $ name ++ ": BEGIN"
step <- lift $ runIteratee iter
whatWasReturn step
check step
where
whatWasReturn (Continue _) = debug $ name ++ ": continue"
whatWasReturn (Yield _ z) = debug $ name ++ ": yield, with remainder "
++ showStream z
whatWasReturn (Error e) = debug $ name ++ ": error, with " ++ show e
check (Continue k) = continue $ f k
check st = returnI st
f k EOF = do
debug $ name ++ ": got EOF"
k EOF
f k ch@(Chunks xs) = do
debug $ name ++ ": got chunk: " ++ showL xs
step <- lift $ runIteratee $ k ch
whatWasReturn step
check step
showStream = show . fmap showFunc
showL = show . map showFunc
iterateeDebugWrapper :: (Show a, MonadIO m) =>
String
-> Iteratee a m b
-> Iteratee a m b
iterateeDebugWrapper = iterateeDebugWrapperWith show
#else
iterateeDebugWrapperWith :: (MonadIO m) =>
(s -> String)
-> String
-> Iteratee s m a
-> Iteratee s m a
iterateeDebugWrapperWith _ _ = id
iterateeDebugWrapper :: (Show a, MonadIO m) =>
String
-> Iteratee a m b
-> Iteratee a m b
iterateeDebugWrapper _ = id
#endif