{-# LANGUAGE CPP #-}
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
module Hledger.Utils.Debug (
debugLevel
,dbgMsg
,dbg0Msg
,dbg1Msg
,dbg2Msg
,dbg3Msg
,dbg4Msg
,dbg5Msg
,dbg6Msg
,dbg7Msg
,dbg8Msg
,dbg9Msg
,dbgMsgIO
,dbg0MsgIO
,dbg1MsgIO
,dbg2MsgIO
,dbg3MsgIO
,dbg4MsgIO
,dbg5MsgIO
,dbg6MsgIO
,dbg7MsgIO
,dbg8MsgIO
,dbg9MsgIO
,dbg
,dbg_
,dbg0
,dbg1
,dbg2
,dbg3
,dbg4
,dbg5
,dbg6
,dbg7
,dbg8
,dbg9
,dbgIO
,dbg0IO
,dbg1IO
,dbg2IO
,dbg3IO
,dbg4IO
,dbg5IO
,dbg6IO
,dbg7IO
,dbg8IO
,dbg9IO
,dbgWith
,dbg0With
,dbg1With
,dbg2With
,dbg3With
,dbg4With
,dbg5With
,dbg6With
,dbg7With
,dbg8With
,dbg9With
,lbl_
,progName
,ghcDebugSupportedInLib
,GhcDebugMode(..)
,ghcDebugMode
,withGhcDebug'
,ghcDebugPause'
,module Debug.Trace
)
where
import Control.DeepSeq (force)
import Control.Exception (evaluate)
import Control.Monad.IO.Class (MonadIO, liftIO)
import Data.List hiding (uncons)
import Debug.Trace (trace, traceIO, traceShowId)
#ifdef GHCDEBUG
import GHC.Debug.Stub (pause, withGhcDebug)
#endif
import Safe (readDef)
import System.Environment (getProgName)
import System.IO.Unsafe (unsafePerformIO)
import Hledger.Utils.IO (progArgs, pshow, pshow')
{-# NOINLINE modifiedProgName #-}
modifiedProgName :: String
modifiedProgName :: String
modifiedProgName = IO String -> String
forall a. IO a -> a
unsafePerformIO IO String
getProgName
progName :: String
progName :: String
progName =
if String
".log" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isSuffixOf` String
modifiedProgName
then String -> String
forall a. [a] -> [a]
reverse (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ Int -> String -> String
forall a. Int -> [a] -> [a]
drop Int
4 (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ String -> String
forall a. [a] -> [a]
reverse String
modifiedProgName
else String
modifiedProgName
debugLevel :: Int
debugLevel :: Int
debugLevel = case (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/=String
"--debug") [String]
progArgs of
[String
"--debug"] -> Int
1
String
"--debug":String
n:[String]
_ -> Int -> String -> Int
forall a. Read a => a -> String -> a
readDef Int
1 String
n
[String]
_ ->
case Int -> [String] -> [String]
forall a. Int -> [a] -> [a]
take Int
1 ([String] -> [String]) -> [String] -> [String]
forall a b. (a -> b) -> a -> b
$ (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
filter (String
"--debug" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf`) [String]
progArgs of
[Char
'-':Char
'-':Char
'd':Char
'e':Char
'b':Char
'u':Char
'g':Char
'=':String
v] -> Int -> String -> Int
forall a. Read a => a -> String -> a
readDef Int
1 String
v
[String]
_ -> Int
0
traceAt :: Int -> String -> a -> a
traceAt :: forall a. Int -> String -> a -> a
traceAt Int
level
| Int
level Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 Bool -> Bool -> Bool
&& Int
debugLevel Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
level = (a -> a) -> String -> a -> a
forall a b. a -> b -> a
const a -> a
forall a. a -> a
id
| Bool
otherwise = String -> a -> a
forall a. String -> a -> a
trace
traceAtIO :: (MonadIO m) => Int -> String -> m ()
traceAtIO :: forall (m :: * -> *). MonadIO m => Int -> String -> m ()
traceAtIO Int
level String
msg =
if Int
level Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 Bool -> Bool -> Bool
&& Int
debugLevel Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
level
then () -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
else IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ String -> IO ()
traceIO String
msg
traceAtWith :: Int -> (a -> String) -> a -> a
traceAtWith :: forall a. Int -> (a -> String) -> a -> a
traceAtWith Int
level a -> String
f a
a = Int -> String -> a -> a
forall a. Int -> String -> a -> a
traceAt Int
level (a -> String
f a
a) a
a
ptraceAt :: Show a => Int -> String -> a -> a
ptraceAt :: forall a. Show a => Int -> String -> a -> a
ptraceAt Int
level
| Int
level Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 Bool -> Bool -> Bool
&& Int
debugLevel Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
level = (a -> a) -> String -> a -> a
forall a b. a -> b -> a
const a -> a
forall a. a -> a
id
| Bool
otherwise = \String
lbl a
a -> String -> a -> a
forall a. String -> a -> a
trace (Bool -> String -> a -> String
forall a. Show a => Bool -> String -> a -> String
labelledPretty Bool
True String
lbl a
a) a
a
labelledPretty :: Show a => Bool -> String -> a -> String
labelledPretty :: forall a. Show a => Bool -> String -> a -> String
labelledPretty Bool
allowcolour String
lbl a
a = String
lbl String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
":" String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
nlorspace String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
"\n" [String]
ls'
where
ls :: [String]
ls = String -> [String]
lines (String -> [String]) -> String -> [String]
forall a b. (a -> b) -> a -> b
$ (if Bool
allowcolour then a -> String
forall a. Show a => a -> String
pshow else a -> String
forall a. Show a => a -> String
pshow') a
a
nlorspace :: String
nlorspace | [String] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
ls Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
1 = String
"\n"
| Bool
otherwise = Int -> Char -> String
forall a. Int -> a -> [a]
replicate (Int -> Int -> Int
forall a. Ord a => a -> a -> a
max Int
1 (Int -> Int) -> Int -> Int
forall a b. (a -> b) -> a -> b
$ Int
11 Int -> Int -> Int
forall a. Num a => a -> a -> a
- String -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
lbl) Char
' '
ls' :: [String]
ls' | [String] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [String]
ls Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
1 = (String -> String) -> [String] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (Char
' 'Char -> String -> String
forall a. a -> [a] -> [a]
:) [String]
ls
| Bool
otherwise = [String]
ls
ptraceAtIO :: (MonadIO m, Show a) => Int -> String -> a -> m ()
ptraceAtIO :: forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
ptraceAtIO Int
level String
label a
a =
if Int
level Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 Bool -> Bool -> Bool
&& Int
debugLevel Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
level
then () -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
else IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ String -> IO ()
traceIO (Bool -> String -> a -> String
forall a. Show a => Bool -> String -> a -> String
labelledPretty Bool
True String
label a
a)
debugLogFile :: FilePath
debugLogFile :: String
debugLogFile = String
progName String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
".log"
log' :: String -> a -> a
log' :: forall a. String -> a -> a
log' String
s a
x = IO a -> a
forall a. IO a -> a
unsafePerformIO (IO a -> a) -> IO a -> a
forall a b. (a -> b) -> a -> b
$ do
String -> IO String
forall a. a -> IO a
evaluate (String -> String
forall a. NFData a => a -> a
force String
s)
String -> String -> IO ()
appendFile String
debugLogFile (String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n")
a -> IO a
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return a
x
logAt :: Int -> String -> a -> a
logAt :: forall a. Int -> String -> a -> a
logAt Int
level String
str
| Int
level Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 Bool -> Bool -> Bool
&& Int
debugLevel Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
level = a -> a
forall a. a -> a
id
| Bool
otherwise = String -> a -> a
forall a. String -> a -> a
log' String
str
logIO :: MonadIO m => String -> m ()
logIO :: forall (m :: * -> *). MonadIO m => String -> m ()
logIO String
s = do
IO String -> m String
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO String -> m String) -> IO String -> m String
forall a b. (a -> b) -> a -> b
$ String -> IO String
forall a. a -> IO a
evaluate (String -> String
forall a. NFData a => a -> a
force String
s)
IO () -> m ()
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ String -> String -> IO ()
appendFile String
debugLogFile (String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
"\n")
logAtIO :: (MonadIO m) => Int -> String -> m ()
logAtIO :: forall (m :: * -> *). MonadIO m => Int -> String -> m ()
logAtIO Int
level String
str
| Int
level Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 Bool -> Bool -> Bool
&& Int
debugLevel Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
level = () -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
| Bool
otherwise = String -> m ()
forall (m :: * -> *). MonadIO m => String -> m ()
logIO String
str
logAtWith :: Int -> (a -> String) -> a -> a
logAtWith :: forall a. Int -> (a -> String) -> a -> a
logAtWith Int
level a -> String
f a
a = Int -> String -> a -> a
forall a. Int -> String -> a -> a
logAt Int
level (a -> String
f a
a) a
a
plogAt :: (Show a) => Int -> String -> a -> a
plogAt :: forall a. Show a => Int -> String -> a -> a
plogAt Int
level
| Int
level Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 Bool -> Bool -> Bool
&& Int
debugLevel Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
level = (a -> a) -> String -> a -> a
forall a b. a -> b -> a
const a -> a
forall a. a -> a
id
| Bool
otherwise = \String
lbl a
a -> String -> a -> a
forall a. String -> a -> a
log' (Bool -> String -> a -> String
forall a. Show a => Bool -> String -> a -> String
labelledPretty Bool
False String
lbl a
a) a
a
plogAtIO :: (MonadIO m, Show a) => Int -> String -> a -> m ()
plogAtIO :: forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
plogAtIO Int
level String
label a
a =
if Int
level Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 Bool -> Bool -> Bool
&& Int
debugLevel Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
level
then () -> m ()
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
else String -> m ()
forall (m :: * -> *). MonadIO m => String -> m ()
logIO (Bool -> String -> a -> String
forall a. Show a => Bool -> String -> a -> String
labelledPretty Bool
False String
label a
a)
shouldLog :: Bool
shouldLog :: Bool
shouldLog = String
".log" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isSuffixOf` String
modifiedProgName
dbgMsg :: Int -> String -> a -> a
dbgMsg :: forall a. Int -> String -> a -> a
dbgMsg = if Bool
shouldLog then Int -> String -> a -> a
forall a. Int -> String -> a -> a
logAt else Int -> String -> a -> a
forall a. Int -> String -> a -> a
traceAt
dbg0Msg :: String -> a -> a
dbg0Msg :: forall a. String -> a -> a
dbg0Msg = Int -> String -> a -> a
forall a. Int -> String -> a -> a
dbgMsg Int
0
dbg1Msg :: String -> a -> a
dbg1Msg :: forall a. String -> a -> a
dbg1Msg = Int -> String -> a -> a
forall a. Int -> String -> a -> a
dbgMsg Int
1
dbg2Msg :: String -> a -> a
dbg2Msg :: forall a. String -> a -> a
dbg2Msg = Int -> String -> a -> a
forall a. Int -> String -> a -> a
dbgMsg Int
2
dbg3Msg :: String -> a -> a
dbg3Msg :: forall a. String -> a -> a
dbg3Msg = Int -> String -> a -> a
forall a. Int -> String -> a -> a
dbgMsg Int
3
dbg4Msg :: String -> a -> a
dbg4Msg :: forall a. String -> a -> a
dbg4Msg = Int -> String -> a -> a
forall a. Int -> String -> a -> a
dbgMsg Int
4
dbg5Msg :: String -> a -> a
dbg5Msg :: forall a. String -> a -> a
dbg5Msg = Int -> String -> a -> a
forall a. Int -> String -> a -> a
dbgMsg Int
5
dbg6Msg :: String -> a -> a
dbg6Msg :: forall a. String -> a -> a
dbg6Msg = Int -> String -> a -> a
forall a. Int -> String -> a -> a
dbgMsg Int
6
dbg7Msg :: String -> a -> a
dbg7Msg :: forall a. String -> a -> a
dbg7Msg = Int -> String -> a -> a
forall a. Int -> String -> a -> a
dbgMsg Int
7
dbg8Msg :: String -> a -> a
dbg8Msg :: forall a. String -> a -> a
dbg8Msg = Int -> String -> a -> a
forall a. Int -> String -> a -> a
dbgMsg Int
8
dbg9Msg :: String -> a -> a
dbg9Msg :: forall a. String -> a -> a
dbg9Msg = Int -> String -> a -> a
forall a. Int -> String -> a -> a
dbgMsg Int
9
dbgMsgIO :: (MonadIO m) => Int -> String -> m ()
dbgMsgIO :: forall (m :: * -> *). MonadIO m => Int -> String -> m ()
dbgMsgIO = if Bool
shouldLog then Int -> String -> m ()
forall (m :: * -> *). MonadIO m => Int -> String -> m ()
logAtIO else Int -> String -> m ()
forall (m :: * -> *). MonadIO m => Int -> String -> m ()
traceAtIO
dbg0MsgIO :: (MonadIO m) => String -> m ()
dbg0MsgIO :: forall (m :: * -> *). MonadIO m => String -> m ()
dbg0MsgIO = Int -> String -> m ()
forall (m :: * -> *). MonadIO m => Int -> String -> m ()
dbgMsgIO Int
0
dbg1MsgIO :: (MonadIO m) => String -> m ()
dbg1MsgIO :: forall (m :: * -> *). MonadIO m => String -> m ()
dbg1MsgIO = Int -> String -> m ()
forall (m :: * -> *). MonadIO m => Int -> String -> m ()
dbgMsgIO Int
1
dbg2MsgIO :: (MonadIO m) => String -> m ()
dbg2MsgIO :: forall (m :: * -> *). MonadIO m => String -> m ()
dbg2MsgIO = Int -> String -> m ()
forall (m :: * -> *). MonadIO m => Int -> String -> m ()
dbgMsgIO Int
2
dbg3MsgIO :: (MonadIO m) => String -> m ()
dbg3MsgIO :: forall (m :: * -> *). MonadIO m => String -> m ()
dbg3MsgIO = Int -> String -> m ()
forall (m :: * -> *). MonadIO m => Int -> String -> m ()
dbgMsgIO Int
3
dbg4MsgIO :: (MonadIO m) => String -> m ()
dbg4MsgIO :: forall (m :: * -> *). MonadIO m => String -> m ()
dbg4MsgIO = Int -> String -> m ()
forall (m :: * -> *). MonadIO m => Int -> String -> m ()
dbgMsgIO Int
4
dbg5MsgIO :: (MonadIO m) => String -> m ()
dbg5MsgIO :: forall (m :: * -> *). MonadIO m => String -> m ()
dbg5MsgIO = Int -> String -> m ()
forall (m :: * -> *). MonadIO m => Int -> String -> m ()
dbgMsgIO Int
5
dbg6MsgIO :: (MonadIO m) => String -> m ()
dbg6MsgIO :: forall (m :: * -> *). MonadIO m => String -> m ()
dbg6MsgIO = Int -> String -> m ()
forall (m :: * -> *). MonadIO m => Int -> String -> m ()
dbgMsgIO Int
6
dbg7MsgIO :: (MonadIO m) => String -> m ()
dbg7MsgIO :: forall (m :: * -> *). MonadIO m => String -> m ()
dbg7MsgIO = Int -> String -> m ()
forall (m :: * -> *). MonadIO m => Int -> String -> m ()
dbgMsgIO Int
7
dbg8MsgIO :: (MonadIO m) => String -> m ()
dbg8MsgIO :: forall (m :: * -> *). MonadIO m => String -> m ()
dbg8MsgIO = Int -> String -> m ()
forall (m :: * -> *). MonadIO m => Int -> String -> m ()
dbgMsgIO Int
8
dbg9MsgIO :: (MonadIO m) => String -> m ()
dbg9MsgIO :: forall (m :: * -> *). MonadIO m => String -> m ()
dbg9MsgIO = Int -> String -> m ()
forall (m :: * -> *). MonadIO m => Int -> String -> m ()
dbgMsgIO Int
9
dbg :: (Show a) => Int -> String -> a -> a
dbg :: forall a. Show a => Int -> String -> a -> a
dbg = if Bool
shouldLog then Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
plogAt else Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
ptraceAt
dbg_ :: (Show a) => Int -> String -> a -> a
dbg_ :: forall a. Show a => Int -> String -> a -> a
dbg_ = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
dbg
dbg0 :: Show a => String -> a -> a
dbg0 :: forall a. Show a => String -> a -> a
dbg0 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
dbg Int
0
dbg1 :: Show a => String -> a -> a
dbg1 :: forall a. Show a => String -> a -> a
dbg1 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
dbg Int
1
dbg2 :: Show a => String -> a -> a
dbg2 :: forall a. Show a => String -> a -> a
dbg2 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
dbg Int
2
dbg3 :: Show a => String -> a -> a
dbg3 :: forall a. Show a => String -> a -> a
dbg3 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
dbg Int
3
dbg4 :: Show a => String -> a -> a
dbg4 :: forall a. Show a => String -> a -> a
dbg4 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
dbg Int
4
dbg5 :: Show a => String -> a -> a
dbg5 :: forall a. Show a => String -> a -> a
dbg5 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
dbg Int
5
dbg6 :: Show a => String -> a -> a
dbg6 :: forall a. Show a => String -> a -> a
dbg6 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
dbg Int
6
dbg7 :: Show a => String -> a -> a
dbg7 :: forall a. Show a => String -> a -> a
dbg7 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
dbg Int
7
dbg8 :: Show a => String -> a -> a
dbg8 :: forall a. Show a => String -> a -> a
dbg8 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
dbg Int
8
dbg9 :: Show a => String -> a -> a
dbg9 :: forall a. Show a => String -> a -> a
dbg9 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
dbg Int
9
dbgIO :: (MonadIO m, Show a) => Int -> String -> a -> m ()
dbgIO :: forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
dbgIO = if Bool
shouldLog then Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
plogAtIO else Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
ptraceAtIO
dbg0IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg0IO :: forall (m :: * -> *) a. (MonadIO m, Show a) => String -> a -> m ()
dbg0IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
dbgIO Int
0
dbg1IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg1IO :: forall (m :: * -> *) a. (MonadIO m, Show a) => String -> a -> m ()
dbg1IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
dbgIO Int
1
dbg2IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg2IO :: forall (m :: * -> *) a. (MonadIO m, Show a) => String -> a -> m ()
dbg2IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
dbgIO Int
2
dbg3IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg3IO :: forall (m :: * -> *) a. (MonadIO m, Show a) => String -> a -> m ()
dbg3IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
dbgIO Int
3
dbg4IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg4IO :: forall (m :: * -> *) a. (MonadIO m, Show a) => String -> a -> m ()
dbg4IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
dbgIO Int
4
dbg5IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg5IO :: forall (m :: * -> *) a. (MonadIO m, Show a) => String -> a -> m ()
dbg5IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
dbgIO Int
5
dbg6IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg6IO :: forall (m :: * -> *) a. (MonadIO m, Show a) => String -> a -> m ()
dbg6IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
dbgIO Int
6
dbg7IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg7IO :: forall (m :: * -> *) a. (MonadIO m, Show a) => String -> a -> m ()
dbg7IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
dbgIO Int
7
dbg8IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg8IO :: forall (m :: * -> *) a. (MonadIO m, Show a) => String -> a -> m ()
dbg8IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
dbgIO Int
8
dbg9IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg9IO :: forall (m :: * -> *) a. (MonadIO m, Show a) => String -> a -> m ()
dbg9IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
dbgIO Int
9
dbgWith :: Int -> (a -> String) -> a -> a
dbgWith :: forall a. Int -> (a -> String) -> a -> a
dbgWith = if Bool
shouldLog then Int -> (a -> String) -> a -> a
forall a. Int -> (a -> String) -> a -> a
logAtWith else Int -> (a -> String) -> a -> a
forall a. Int -> (a -> String) -> a -> a
traceAtWith
dbg0With :: (a -> String) -> a -> a
dbg0With :: forall a. (a -> String) -> a -> a
dbg0With = Int -> (a -> String) -> a -> a
forall a. Int -> (a -> String) -> a -> a
dbgWith Int
0
dbg1With :: (a -> String) -> a -> a
dbg1With :: forall a. (a -> String) -> a -> a
dbg1With = Int -> (a -> String) -> a -> a
forall a. Int -> (a -> String) -> a -> a
dbgWith Int
1
dbg2With :: (a -> String) -> a -> a
dbg2With :: forall a. (a -> String) -> a -> a
dbg2With = Int -> (a -> String) -> a -> a
forall a. Int -> (a -> String) -> a -> a
dbgWith Int
2
dbg3With :: (a -> String) -> a -> a
dbg3With :: forall a. (a -> String) -> a -> a
dbg3With = Int -> (a -> String) -> a -> a
forall a. Int -> (a -> String) -> a -> a
dbgWith Int
3
dbg4With :: (a -> String) -> a -> a
dbg4With :: forall a. (a -> String) -> a -> a
dbg4With = Int -> (a -> String) -> a -> a
forall a. Int -> (a -> String) -> a -> a
dbgWith Int
4
dbg5With :: (a -> String) -> a -> a
dbg5With :: forall a. (a -> String) -> a -> a
dbg5With = Int -> (a -> String) -> a -> a
forall a. Int -> (a -> String) -> a -> a
dbgWith Int
5
dbg6With :: (a -> String) -> a -> a
dbg6With :: forall a. (a -> String) -> a -> a
dbg6With = Int -> (a -> String) -> a -> a
forall a. Int -> (a -> String) -> a -> a
dbgWith Int
6
dbg7With :: (a -> String) -> a -> a
dbg7With :: forall a. (a -> String) -> a -> a
dbg7With = Int -> (a -> String) -> a -> a
forall a. Int -> (a -> String) -> a -> a
dbgWith Int
7
dbg8With :: (a -> String) -> a -> a
dbg8With :: forall a. (a -> String) -> a -> a
dbg8With = Int -> (a -> String) -> a -> a
forall a. Int -> (a -> String) -> a -> a
dbgWith Int
8
dbg9With :: (a -> String) -> a -> a
dbg9With :: forall a. (a -> String) -> a -> a
dbg9With = Int -> (a -> String) -> a -> a
forall a. Int -> (a -> String) -> a -> a
dbgWith Int
9
lbl_ :: String -> String -> String -> String
lbl_ :: String -> String -> String -> String
lbl_ String
name String
desc String
val = String
name String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
": " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
desc String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
":" String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
" " String -> String -> String
forall a. Semigroup a => a -> a -> a
<> String
val
data GhcDebugMode =
GDNotSupported
| GDDisabled
| GDNoPause
| GDPauseAtStart
| GDPauseAtEnd
deriving (GhcDebugMode -> GhcDebugMode -> Bool
(GhcDebugMode -> GhcDebugMode -> Bool)
-> (GhcDebugMode -> GhcDebugMode -> Bool) -> Eq GhcDebugMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: GhcDebugMode -> GhcDebugMode -> Bool
== :: GhcDebugMode -> GhcDebugMode -> Bool
$c/= :: GhcDebugMode -> GhcDebugMode -> Bool
/= :: GhcDebugMode -> GhcDebugMode -> Bool
Eq,Eq GhcDebugMode
Eq GhcDebugMode =>
(GhcDebugMode -> GhcDebugMode -> Ordering)
-> (GhcDebugMode -> GhcDebugMode -> Bool)
-> (GhcDebugMode -> GhcDebugMode -> Bool)
-> (GhcDebugMode -> GhcDebugMode -> Bool)
-> (GhcDebugMode -> GhcDebugMode -> Bool)
-> (GhcDebugMode -> GhcDebugMode -> GhcDebugMode)
-> (GhcDebugMode -> GhcDebugMode -> GhcDebugMode)
-> Ord GhcDebugMode
GhcDebugMode -> GhcDebugMode -> Bool
GhcDebugMode -> GhcDebugMode -> Ordering
GhcDebugMode -> GhcDebugMode -> GhcDebugMode
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: GhcDebugMode -> GhcDebugMode -> Ordering
compare :: GhcDebugMode -> GhcDebugMode -> Ordering
$c< :: GhcDebugMode -> GhcDebugMode -> Bool
< :: GhcDebugMode -> GhcDebugMode -> Bool
$c<= :: GhcDebugMode -> GhcDebugMode -> Bool
<= :: GhcDebugMode -> GhcDebugMode -> Bool
$c> :: GhcDebugMode -> GhcDebugMode -> Bool
> :: GhcDebugMode -> GhcDebugMode -> Bool
$c>= :: GhcDebugMode -> GhcDebugMode -> Bool
>= :: GhcDebugMode -> GhcDebugMode -> Bool
$cmax :: GhcDebugMode -> GhcDebugMode -> GhcDebugMode
max :: GhcDebugMode -> GhcDebugMode -> GhcDebugMode
$cmin :: GhcDebugMode -> GhcDebugMode -> GhcDebugMode
min :: GhcDebugMode -> GhcDebugMode -> GhcDebugMode
Ord,Int -> GhcDebugMode -> String -> String
[GhcDebugMode] -> String -> String
GhcDebugMode -> String
(Int -> GhcDebugMode -> String -> String)
-> (GhcDebugMode -> String)
-> ([GhcDebugMode] -> String -> String)
-> Show GhcDebugMode
forall a.
(Int -> a -> String -> String)
-> (a -> String) -> ([a] -> String -> String) -> Show a
$cshowsPrec :: Int -> GhcDebugMode -> String -> String
showsPrec :: Int -> GhcDebugMode -> String -> String
$cshow :: GhcDebugMode -> String
show :: GhcDebugMode -> String
$cshowList :: [GhcDebugMode] -> String -> String
showList :: [GhcDebugMode] -> String -> String
Show)
ghcDebugSupportedInLib :: Bool
ghcDebugSupportedInLib :: Bool
ghcDebugSupportedInLib =
#ifdef GHCDEBUG
True
#else
Bool
False
#endif
ghcDebugMode :: GhcDebugMode
ghcDebugMode :: GhcDebugMode
ghcDebugMode =
#ifdef GHCDEBUG
case debugLevel of
_ | not ghcDebugSupportedInLib -> GDNotSupported
(-1) -> GDNoPause
(-2) -> GDPauseAtStart
(-3) -> GDPauseAtEnd
_ -> GDDisabled
#else
GhcDebugMode
GDNotSupported
#endif
withGhcDebug' :: a -> a
withGhcDebug' =
#ifdef GHCDEBUG
if ghcDebugMode > GDDisabled then withGhcDebug else id
#else
a -> a
forall a. a -> a
id
#endif
ghcDebugPause' :: IO ()
ghcDebugPause' :: IO ()
ghcDebugPause' =
#ifdef GHCDEBUG
pause
#else
() -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
#endif