{-# LANGUAGE Trustworthy #-}
module Intro.Trustworthy (
  Data.DList.DList
  , GHC.Exts.IsList(
      Item
      , fromList
      -- , toList -- provided by Foldable
      )
  , trace
  , traceIO
  , traceM
  , traceShow
  , traceShowM
  , traceStack
  , traceStackM
) where

import qualified Data.DList
import qualified GHC.Exts
import qualified Data.Text
import qualified Debug.Trace

-- | See 'Debug.trace.trace'
trace :: Data.Text.Text -> a -> a
trace = Debug.Trace.trace . Data.Text.unpack
{-# WARNING trace "'trace' remains in code" #-}

-- | See 'Debug.trace.traceStack'
traceStack :: Data.Text.Text -> a -> a
traceStack = Debug.Trace.traceStack . Data.Text.unpack
{-# WARNING traceStack "'traceStack' remains in code" #-}

-- | 'traceStack' lifted to a 'Monad'
traceStackM :: Monad m => Data.Text.Text -> m ()
traceStackM s = traceStack s $ pure ()
{-# WARNING traceStackM "'traceStackM' remains in code" #-}

-- | See 'Debug.Trace.traceShow'
traceShow :: Show a => a -> b -> b
traceShow = Debug.Trace.traceShow
{-# WARNING traceShow "'traceShow' remains in code" #-}

-- | See 'Debug.Trace.traceShowM'
traceShowM :: (Show a, Monad m) => a -> m ()
traceShowM = Debug.Trace.traceShowM
{-# WARNING traceShowM "'traceShowM' remains in code" #-}

-- | See 'Debug.Trace.traceM'
traceM :: Monad m => Data.Text.Text -> m ()
traceM = Debug.Trace.traceM . Data.Text.unpack
{-# WARNING traceM "'traceM' remains in code" #-}

-- | See 'Debug.Trace.traceIO'
traceIO :: Data.Text.Text -> IO ()
traceIO = Debug.Trace.traceIO . Data.Text.unpack
{-# WARNING traceIO "'traceIO' remains in code" #-}