-- | 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