module Data.Repa.Flow.Generic.Debug
        (-- * More
          more,         more'

        -- * More (tabular)
        , moret,        moret'

        -- * More (raw)
        , morer,        morer'

        -- * Nicer
        , Nicer         (..)
        , Presentable   (..))
where
import Data.Repa.Nice.Present
import Data.Repa.Nice.Tabulate
import Data.Repa.Nice
import Data.Repa.Flow.Generic           hiding (next)
import Control.Monad
import Data.List                        as L
import Data.Text                        as T
import Prelude                          as P
#include "repa-flow.h"


-------------------------------------------------------------------------------
-- | Given a source index and a length, pull enough chunks from the source
--   to build a list of the requested length, and discard the remaining 
--   elements in the final chunk.
--  
--   * This function is intended for interactive debugging.
--     If you want to retain the rest of the final chunk then use `head_i`.
--
more    :: (States i IO, Nicer a)
        => i                    -- ^ Index  of source in bundle.
        -> Sources i IO a     -- ^ Bundle of sources.
        -> IO [Nice a]
more i ss = more' i 20 ss
{-# INLINE more #-}


-- | Like `more` but also specify now many elements you want.
more'   :: (States i IO, Nicer a)
        => i -> Int -> Sources i IO a -> IO [Nice a]
more' ix len s
        = liftM (L.map nice . fst) $ head_i len s ix
{-# INLINE_FLOW more' #-}


-------------------------------------------------------------------------------
-- | Like `more`, but print results in a tabular form to the console.
moret   :: (States i IO, Nicer [a], Presentable (Nice [a]))
        => i                    -- ^ Index of source in bundle.
        -> Sources i IO a     -- ^ Bundle of sources.
        -> IO ()

moret i ss = moret' i 20 ss
{-# INLINE moret #-}


-- | Like `more'`, but print results in tabular form to the console.
moret'  :: (States i IO, Nicer [a], Presentable (Nice [a]))
        => i -> Int -> Sources i IO a -> IO ()

moret' i len s
 = do   (vals, _) <- head_i len s i
        putStrLn $ T.unpack $ tabulate $ nice vals
{-# INLINE_FLOW moret' #-}


-------------------------------------------------------------------------------
-- | Like `more`, but show elements in their raw format.
morer   :: States i IO
        => i                    -- ^ Index  of source in bundle.
        -> Sources i IO a       -- ^ Bundle of sources.
        -> IO [a]

morer i ss = morer' i 20 ss
{-# INLINE morer #-}


-- | Like `more'`, but show elements in their raw format.
morer'  :: States i IO
        => i -> Int -> Sources i IO a -> IO [a]
morer' i len s
        = liftM fst $ head_i len s i
{-# INLINE_FLOW morer' #-}