{-# LANGUAGE FlexibleContexts, TypeFamilies #-}
module Hledger.Utils.Debug (
pprint
,pshow
,traceWith
,ptrace
,debugLevel
,traceAt
,traceAtWith
,ptraceAt
,ptraceAtWith
,dbg0
,dbg1
,dbg2
,dbg3
,dbg4
,dbg5
,dbg6
,dbg7
,dbg8
,dbg9
,dbgExit
,dbg0With
,dbg1With
,dbg2With
,dbg3With
,dbg4With
,dbg5With
,dbg6With
,dbg7With
,dbg8With
,dbg9With
,ptraceAtIO
,dbg0IO
,dbg1IO
,dbg2IO
,dbg3IO
,dbg4IO
,dbg5IO
,dbg6IO
,dbg7IO
,dbg8IO
,dbg9IO
,traceParse
,dbgparse
,module Debug.Trace
,useColorOnStdout
,useColorOnStderr
)
where
import Control.Monad (when)
import Control.Monad.IO.Class
import Data.List hiding (uncons)
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import Debug.Trace
import Hledger.Utils.Parse
import Safe (readDef)
import System.Environment (getArgs, lookupEnv)
import System.Exit
import System.IO.Unsafe (unsafePerformIO)
import Text.Megaparsec
import Text.Printf
import Text.Pretty.Simple
import Data.Maybe (isJust)
import System.Console.ANSI (hSupportsANSIColor)
import System.IO (stdout, Handle, stderr)
prettyopts :: OutputOptions
prettyopts =
OutputOptions
baseopts
{ outputOptionsIndentAmount :: Int
outputOptionsIndentAmount=Int
2
, outputOptionsCompact :: Bool
outputOptionsCompact=Bool
True
}
where
baseopts :: OutputOptions
baseopts
| Bool
useColorOnStderr = OutputOptions
defaultOutputOptionsDarkBg
| Bool
otherwise = OutputOptions
defaultOutputOptionsNoColor
pprint :: Show a => a -> IO ()
pprint :: a -> IO ()
pprint = CheckColorTty -> OutputOptions -> a -> IO ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
CheckColorTty -> OutputOptions -> a -> m ()
pPrintOpt CheckColorTty
CheckColorTty OutputOptions
prettyopts
pshow :: Show a => a -> String
pshow :: a -> String
pshow = Text -> String
TL.unpack (Text -> String) -> (a -> Text) -> a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OutputOptions -> a -> Text
forall a. Show a => OutputOptions -> a -> Text
pShowOpt OutputOptions
prettyopts
ptrace :: Show a => a -> a
ptrace :: a -> a
ptrace = (a -> String) -> a -> a
forall a. Show a => (a -> String) -> a -> a
traceWith a -> String
forall a. Show a => a -> String
pshow
traceWith :: Show a => (a -> String) -> a -> a
traceWith :: (a -> String) -> a -> a
traceWith a -> String
f a
a = String -> a -> a
forall a. String -> a -> a
trace (a -> String
f a
a) a
a
{-# NOINLINE debugLevel #-}
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]
args 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]
args 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
where
args :: [String]
args = IO [String] -> [String]
forall a. IO a -> a
unsafePerformIO IO [String]
getArgs
useColorOnStdout :: Bool
useColorOnStdout :: Bool
useColorOnStdout = Bool -> Bool
not Bool
hasOutputFile Bool -> Bool -> Bool
&& Handle -> Bool
useColorOnHandle Handle
stdout
useColorOnStderr :: Bool
useColorOnStderr :: Bool
useColorOnStderr = Handle -> Bool
useColorOnHandle Handle
stderr
useColorOnHandle :: Handle -> Bool
useColorOnHandle :: Handle -> Bool
useColorOnHandle Handle
h = IO Bool -> Bool
forall a. IO a -> a
unsafePerformIO (IO Bool -> Bool) -> IO Bool -> Bool
forall a b. (a -> b) -> a -> b
$ do
Bool
no_color <- Maybe String -> Bool
forall a. Maybe a -> Bool
isJust (Maybe String -> Bool) -> IO (Maybe String) -> IO Bool
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> IO (Maybe String)
lookupEnv String
"NO_COLOR"
Bool
supports_color <- Handle -> IO Bool
hSupportsANSIColor Handle
h
let coloroption :: String
coloroption = String
colorOption
Bool -> IO Bool
forall (m :: * -> *) a. Monad m => a -> m a
return (Bool -> IO Bool) -> Bool -> IO Bool
forall a b. (a -> b) -> a -> b
$ String
coloroption String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` [String
"always",String
"yes"]
Bool -> Bool -> Bool
|| (String
coloroption String -> [String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [String
"never",String
"no"] Bool -> Bool -> Bool
&& Bool -> Bool
not Bool
no_color Bool -> Bool -> Bool
&& Bool
supports_color)
colorOption :: String
colorOption :: String
colorOption =
let args :: [String]
args = IO [String] -> [String]
forall a. IO a -> a
unsafePerformIO IO [String]
getArgs in
case (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/=String
"--color") [String]
args of
String
"--color":String
v:[String]
_ -> String
v
[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
"--color=" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf`) [String]
args of
[Char
'-':Char
'-':Char
'c':Char
'o':Char
'l':Char
'o':Char
'r':Char
'=':String
v] -> String
v
[String]
_ ->
case (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/=String
"--colour") [String]
args of
String
"--colour":String
v:[String]
_ -> String
v
[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
"--colour=" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf`) [String]
args of
[Char
'-':Char
'-':Char
'c':Char
'o':Char
'l':Char
'o':Char
'u':Char
'r':Char
'=':String
v] -> String
v
[String]
_ -> String
""
hasOutputFile :: Bool
hasOutputFile :: Bool
hasOutputFile = Maybe String
outputFileOption Maybe String -> [Maybe String] -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`notElem` [Maybe String
forall a. Maybe a
Nothing, String -> Maybe String
forall a. a -> Maybe a
Just String
"-"]
outputFileOption :: Maybe String
outputFileOption :: Maybe String
outputFileOption =
let args :: [String]
args = IO [String] -> [String]
forall a. IO a -> a
unsafePerformIO IO [String]
getArgs in
case (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Bool -> Bool
not (Bool -> Bool) -> (String -> Bool) -> String -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String
"-o" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf`)) [String]
args of
(Char
'-':Char
'o':v :: String
v@(Char
_:String
_)):[String]
_ -> String -> Maybe String
forall a. a -> Maybe a
Just String
v
String
"-o":String
v:[String]
_ -> String -> Maybe String
forall a. a -> Maybe a
Just String
v
[String]
_ ->
case (String -> Bool) -> [String] -> [String]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/=String
"--output-file") [String]
args of
String
"--output-file":String
v:[String]
_ -> String -> Maybe String
forall a. a -> Maybe a
Just String
v
[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
"--output-file=" String -> String -> Bool
forall a. Eq a => [a] -> [a] -> Bool
`isPrefixOf`) [String]
args of
[Char
'-':Char
'-':Char
'o':Char
'u':Char
't':Char
'p':Char
'u':Char
't':Char
'-':Char
'f':Char
'i':Char
'l':Char
'e':Char
'=':String
v] -> String -> Maybe String
forall a. a -> Maybe a
Just String
v
[String]
_ -> Maybe String
forall a. Maybe a
Nothing
traceAt :: Int -> String -> a -> a
traceAt :: 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
traceAtWith :: Int -> (a -> String) -> a -> a
traceAtWith :: 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 :: 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
s a
a -> let p :: String
p = a -> String
forall a. Show a => a -> String
pshow a
a
ls :: [String]
ls = String -> [String]
lines String
p
nlorspace :: String
nlorspace | [String] -> 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
11 Int -> Int -> Int
forall a. Num a => a -> a -> a
- String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
s) Char
' '
ls' :: [String]
ls' | [String] -> 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
in String -> a -> a
forall a. String -> a -> a
trace (String
sString -> String -> String
forall a. [a] -> [a] -> [a]
++String
":"String -> String -> String
forall a. [a] -> [a] -> [a]
++String
nlorspaceString -> String -> String
forall a. [a] -> [a] -> [a]
++String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
"\n" [String]
ls') a
a
ptraceAtWith :: Show a => Int -> (a -> String) -> a -> a
ptraceAtWith :: Int -> (a -> String) -> a -> a
ptraceAtWith Int
level a -> String
f
| 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 = \a
a -> let p :: String
p = a -> String
f a
a
in String -> a -> a
forall a. String -> a -> a
trace String
p a
a
dbg0 :: Show a => String -> a -> a
dbg0 :: String -> a -> a
dbg0 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
ptraceAt Int
0
dbg1 :: Show a => String -> a -> a
dbg1 :: String -> a -> a
dbg1 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
ptraceAt Int
1
dbg2 :: Show a => String -> a -> a
dbg2 :: String -> a -> a
dbg2 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
ptraceAt Int
2
dbg3 :: Show a => String -> a -> a
dbg3 :: String -> a -> a
dbg3 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
ptraceAt Int
3
dbg4 :: Show a => String -> a -> a
dbg4 :: String -> a -> a
dbg4 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
ptraceAt Int
4
dbg5 :: Show a => String -> a -> a
dbg5 :: String -> a -> a
dbg5 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
ptraceAt Int
5
dbg6 :: Show a => String -> a -> a
dbg6 :: String -> a -> a
dbg6 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
ptraceAt Int
6
dbg7 :: Show a => String -> a -> a
dbg7 :: String -> a -> a
dbg7 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
ptraceAt Int
7
dbg8 :: Show a => String -> a -> a
dbg8 :: String -> a -> a
dbg8 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
ptraceAt Int
8
dbg9 :: Show a => String -> a -> a
dbg9 :: String -> a -> a
dbg9 = Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
ptraceAt Int
9
dbgExit :: Show a => String -> a -> a
dbgExit :: String -> a -> a
dbgExit String
msg = a -> a -> a
forall a b. a -> b -> a
const (IO a -> a
forall a. IO a -> a
unsafePerformIO IO a
forall a. IO a
exitFailure) (a -> a) -> (a -> a) -> a -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> a -> a
forall a. Show a => String -> a -> a
dbg0 String
msg
dbg0With :: Show a => (a -> String) -> a -> a
dbg0With :: (a -> String) -> a -> a
dbg0With = Int -> (a -> String) -> a -> a
forall a. Show a => Int -> (a -> String) -> a -> a
ptraceAtWith Int
0
dbg1With :: Show a => (a -> String) -> a -> a
dbg1With :: (a -> String) -> a -> a
dbg1With = Int -> (a -> String) -> a -> a
forall a. Show a => Int -> (a -> String) -> a -> a
ptraceAtWith Int
1
dbg2With :: Show a => (a -> String) -> a -> a
dbg2With :: (a -> String) -> a -> a
dbg2With = Int -> (a -> String) -> a -> a
forall a. Show a => Int -> (a -> String) -> a -> a
ptraceAtWith Int
2
dbg3With :: Show a => (a -> String) -> a -> a
dbg3With :: (a -> String) -> a -> a
dbg3With = Int -> (a -> String) -> a -> a
forall a. Show a => Int -> (a -> String) -> a -> a
ptraceAtWith Int
3
dbg4With :: Show a => (a -> String) -> a -> a
dbg4With :: (a -> String) -> a -> a
dbg4With = Int -> (a -> String) -> a -> a
forall a. Show a => Int -> (a -> String) -> a -> a
ptraceAtWith Int
4
dbg5With :: Show a => (a -> String) -> a -> a
dbg5With :: (a -> String) -> a -> a
dbg5With = Int -> (a -> String) -> a -> a
forall a. Show a => Int -> (a -> String) -> a -> a
ptraceAtWith Int
5
dbg6With :: Show a => (a -> String) -> a -> a
dbg6With :: (a -> String) -> a -> a
dbg6With = Int -> (a -> String) -> a -> a
forall a. Show a => Int -> (a -> String) -> a -> a
ptraceAtWith Int
6
dbg7With :: Show a => (a -> String) -> a -> a
dbg7With :: (a -> String) -> a -> a
dbg7With = Int -> (a -> String) -> a -> a
forall a. Show a => Int -> (a -> String) -> a -> a
ptraceAtWith Int
7
dbg8With :: Show a => (a -> String) -> a -> a
dbg8With :: (a -> String) -> a -> a
dbg8With = Int -> (a -> String) -> a -> a
forall a. Show a => Int -> (a -> String) -> a -> a
ptraceAtWith Int
8
dbg9With :: Show a => (a -> String) -> a -> a
dbg9With :: (a -> String) -> a -> a
dbg9With = Int -> (a -> String) -> a -> a
forall a. Show a => Int -> (a -> String) -> a -> a
ptraceAtWith Int
9
ptraceAtIO :: (MonadIO m, Show a) => Int -> String -> a -> m ()
ptraceAtIO :: Int -> String -> a -> m ()
ptraceAtIO Int
lvl String
lbl a
x = IO () -> m ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO () -> m ()) -> IO () -> m ()
forall a b. (a -> b) -> a -> b
$ Int -> String -> a -> a
forall a. Show a => Int -> String -> a -> a
ptraceAt Int
lvl String
lbl a
x a -> IO () -> IO ()
`seq` () -> IO ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
dbg0IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg0IO :: String -> a -> m ()
dbg0IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
ptraceAtIO Int
0
dbg1IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg1IO :: String -> a -> m ()
dbg1IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
ptraceAtIO Int
1
dbg2IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg2IO :: String -> a -> m ()
dbg2IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
ptraceAtIO Int
2
dbg3IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg3IO :: String -> a -> m ()
dbg3IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
ptraceAtIO Int
3
dbg4IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg4IO :: String -> a -> m ()
dbg4IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
ptraceAtIO Int
4
dbg5IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg5IO :: String -> a -> m ()
dbg5IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
ptraceAtIO Int
5
dbg6IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg6IO :: String -> a -> m ()
dbg6IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
ptraceAtIO Int
6
dbg7IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg7IO :: String -> a -> m ()
dbg7IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
ptraceAtIO Int
7
dbg8IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg8IO :: String -> a -> m ()
dbg8IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
ptraceAtIO Int
8
dbg9IO :: (MonadIO m, Show a) => String -> a -> m ()
dbg9IO :: String -> a -> m ()
dbg9IO = Int -> String -> a -> m ()
forall (m :: * -> *) a.
(MonadIO m, Show a) =>
Int -> String -> a -> m ()
ptraceAtIO Int
9
traceParse :: String -> TextParser m ()
traceParse :: String -> TextParser m ()
traceParse String
msg = do
SourcePos
pos <- ParsecT CustomErr Text m SourcePos
forall s e (m :: * -> *).
(TraversableStream s, MonadParsec e s m) =>
m SourcePos
getSourcePos
Text
next <- (Int -> Text -> Text
T.take Int
peeklength) (Text -> Text)
-> ParsecT CustomErr Text m Text -> ParsecT CustomErr Text m Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
`fmap` ParsecT CustomErr Text m Text
forall e s (m :: * -> *). MonadParsec e s m => m s
getInput
let (Pos
l,Pos
c) = (SourcePos -> Pos
sourceLine SourcePos
pos, SourcePos -> Pos
sourceColumn SourcePos
pos)
s :: String
s = String -> Int -> Int -> String -> String
forall r. PrintfType r => String -> r
printf String
"at line %2d col %2d: %s" (Pos -> Int
unPos Pos
l) (Pos -> Int
unPos Pos
c) (Text -> String
forall a. Show a => a -> String
show Text
next) :: String
s' :: String
s' = String -> String -> String
forall r. PrintfType r => String -> r
printf (String
"%-"String -> String -> String
forall a. [a] -> [a] -> [a]
++Int -> String
forall a. Show a => a -> String
show (Int
peeklengthInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
30)String -> String -> String
forall a. [a] -> [a] -> [a]
++String
"s") String
s String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
" " String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
msg
String -> TextParser m () -> TextParser m ()
forall a. String -> a -> a
trace String
s' (TextParser m () -> TextParser m ())
-> TextParser m () -> TextParser m ()
forall a b. (a -> b) -> a -> b
$ () -> TextParser m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ()
where
peeklength :: Int
peeklength = Int
30
traceParseAt :: Int -> String -> TextParser m ()
traceParseAt :: Int -> String -> TextParser m ()
traceParseAt Int
level String
msg = Bool -> TextParser m () -> TextParser m ()
forall (f :: * -> *). Applicative f => Bool -> f () -> f ()
when (Int
level Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Int
debugLevel) (TextParser m () -> TextParser m ())
-> TextParser m () -> TextParser m ()
forall a b. (a -> b) -> a -> b
$ String -> TextParser m ()
forall (m :: * -> *). String -> TextParser m ()
traceParse String
msg
dbgparse :: Int -> String -> TextParser m ()
dbgparse :: Int -> String -> TextParser m ()
dbgparse = Int -> String -> TextParser m ()
forall (m :: * -> *). Int -> String -> TextParser m ()
traceParseAt