snap-core-0.2.13: src/Snap/Internal/Iteratee/Debug.hs
-- | An internal Snap module for debugging iteratees.
--
-- /N.B./ this is an internal interface, please don't write user code that
-- depends on it.
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
module Snap.Internal.Iteratee.Debug
( debugIteratee
, iterateeDebugWrapper
) where
------------------------------------------------------------------------------
import Data.Iteratee.WrappedByteString
import Data.Word (Word8)
import System.IO
------------------------------------------------------------------------------
#ifndef NODEBUG
import Snap.Internal.Debug
#endif
import Snap.Iteratee
------------------------------------------------------------------------------
------------------------------------------------------------------------------
instance Show (WrappedByteString Word8) where
show (WrapBS s) = show s
------------------------------------------------------------------------------
debugIteratee :: Iteratee IO ()
debugIteratee = IterateeG f
where
f c@(EOF _) = do
putStrLn $ "got EOF: " ++ show c
hFlush stdout
return (Done () c)
f c@(Chunk _) = do
putStrLn $ "got chunk: " ++ show c
hFlush stdout
return $ Cont debugIteratee Nothing
#ifndef NODEBUG
iterateeDebugWrapper :: String -> Iteratee IO a -> Iteratee IO a
iterateeDebugWrapper name iter = IterateeG f
where
f c@(EOF Nothing) = do
debug $ name ++ ": got EOF: " ++ show c
runIter iter c
f c@(EOF (Just _)) = do
debug $ name ++ ": got EOF **error**: " ++ show c
runIter iter c
f c@(Chunk _) = do
debug $ name ++ ": got chunk: " ++ show c
wrapResult $ runIter iter c
wrapResult m = do
iv <- m
let i = liftI iv
return $ Cont (iterateeDebugWrapper name i) Nothing
#else
iterateeDebugWrapper :: String -> Iteratee IO a -> Iteratee IO a
iterateeDebugWrapper _ = id
{-# INLINE iterateeDebugWrapper #-}
#endif