module Debug.Print.StackTraceDebug where
import Control.Concurrent
import Debug.Trace
import GHC.Stack
import GHC.SrcLoc
import System.Info
import Data.List
import Data.List.Split
debugMode :: Bool
debugMode = True
debugTraceIO :: (?loc :: CallStack) => String -> IO ()
debugTraceIO message = do
callStacks <- return(getCallStack (?loc))
let callStack = Data.List.last(callStacks)
let callOrigin = snd callStack
let pathToFileName = srcLocModule callOrigin
let fileName = srcLocFile callOrigin
let lineNumber = show(srcLocStartLine callOrigin)
noMonadThreadId <- myThreadId
let threadName = show(noMonadThreadId)
let threadNameWords = splitOn " " threadName
let threadNumberString = Data.List.last threadNameWords
let fileNameSplit = if ((Data.List.isInfixOf "win" os) || (Data.List.isInfixOf "Win" os) || (Data.List.isInfixOf "mingw" os))
then splitOn (windowsSeparator) fileName
else splitOn (linuxSeparator) fileName
let fileNameSplitDropHead = if (length fileNameSplit > 1)
then tail fileNameSplit
else fileNameSplit
let fileNameParsed = if ((Data.List.isInfixOf "win" os) || (Data.List.isInfixOf "Win" os) || (Data.List.isInfixOf "mingw" os))
then intercalate windowsSeparator fileNameSplitDropHead
else intercalate linuxSeparator fileNameSplitDropHead
let lineOne = message ++ " in" ++ " thread" ++ " " ++ "\"" ++ threadNumberString ++ "\"" ++ " :"
let lineTwo = " " ++ "at " ++ pathToFileName ++ ".call" ++ "(" ++ fileNameParsed ++ ":" ++ lineNumber ++ ")"
let toPrint = if ((Data.List.isInfixOf "win" os) || (Data.List.isInfixOf "Win" os) || (Data.List.isInfixOf "mingw" os))
then lineOne ++ windowsNewline ++ lineTwo ++ windowsNewline
else lineOne ++ linuxNewLine ++ lineTwo ++ linuxNewLine
if debugMode
then traceIO toPrint
else return()
prt :: (?loc :: CallStack) => String -> IO ()
prt = debugTraceIO
windowsNewline :: [Char]
windowsNewline = "\r\n"
linuxNewLine :: [Char]
linuxNewLine = "\n"
windowsSeparator :: [Char]
windowsSeparator = "\\"
linuxSeparator :: [Char]
linuxSeparator = "/"
test :: IO()
test = do
debugTraceIO "foobarbaz"
debugTraceIO "lalalalaaaaa"
prt "Shorthand for debugTraceIO"