{-# LANGUAGE NamedFieldPuns #-}

-- | A collection of utility functions aiding debugging of the code.
module Cardano.Api.Trace.Debug
  ( traceIO'
  , trace'
  , pShow
  )
where

import Control.Monad.IO.Class
import Data.Text.Lazy qualified as TL
import GHC.Stack
import Text.Pretty.Simple (pShow)

import Debug.Trace (traceIO, traceWith)

-- | Trace a value in a 'MonadIO' monad. Colours and renders with indentation the showed vaule.
traceIO'
  :: (HasCallStack, MonadIO m, Show a)
  => String
  -- ^ label for the trace
  -> a
  -- ^ value to trace
  -> m ()
traceIO' :: forall (m :: * -> *) a.
(HasCallStack, MonadIO m, Show a) =>
String -> a -> m ()
traceIO' String
l a
a =
  (HasCallStack => m ()) -> m ()
forall a. HasCallStack => (HasCallStack => a) -> a
withFrozenCallStack ((HasCallStack => m ()) -> m ()) -> (HasCallStack => m ()) -> m ()
forall a b. (a -> b) -> a -> b
$
    IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> (String -> IO ()) -> String -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> IO ()
traceIO (String -> m ()) -> String -> m ()
forall a b. (a -> b) -> a -> b
$
      String
"\r\n💎💎💎\r\n  "
        String -> String -> String
forall a. Semigroup a => a -> a -> a
<> [(String, SrcLoc)] -> String
forall {a}. [(a, SrcLoc)] -> String
callsite (CallStack -> [(String, SrcLoc)]
getCallStack CallStack
HasCallStack => CallStack
callStack)
        String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"\r\n📜 "
        String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
l
        String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
":\r\n"
        String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Text -> String
TL.unpack (a -> Text
forall a. Show a => a -> Text
pShow a
a)
        String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
"\r\n"
 where
  callsite :: [(a, SrcLoc)] -> String
callsite ((a
_, SrcLoc{String
srcLocFile :: String
srcLocFile :: SrcLoc -> String
srcLocFile, Int
srcLocStartLine :: Int
srcLocStartLine :: SrcLoc -> Int
srcLocStartLine, Int
srcLocStartCol :: Int
srcLocStartCol :: SrcLoc -> Int
srcLocStartCol}) : [(a, SrcLoc)]
_) =
    [String] -> String
forall a. Monoid a => [a] -> a
mconcat [String
srcLocFile, String
":", Int -> String
forall a. Show a => a -> String
show Int
srcLocStartLine, String
":", Int -> String
forall a. Show a => a -> String
show Int
srcLocStartCol]
  callsite [(a, SrcLoc)]
_ = String
""
{-# DEPRECATED traceIO' "traceIO' left in the code" #-}

-- | Trace pure value. Colours and renders with indentation the showed vaule.
trace'
  :: Show a
  => String
  -- ^ label for the trace
  -> a
  -- ^ value to trace
  -> a
trace' :: forall a. Show a => String -> a -> a
trace' String
l =
  (a -> String) -> a -> a
forall a. (a -> String) -> a -> a
traceWith
    (\a
x -> String
"📜 " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
l String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
":\r\n" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> Text -> String
TL.unpack (a -> Text
forall a. Show a => a -> Text
pShow a
x))
{-# DEPRECATED trace' "trace' left in the code" #-}