module Agda.Utils.CallStack.Base (
SrcLocPackage
, SrcLocModule
, SrcFun
, SrcLocFile
, SrcLocLine
, SrcLocCol
, CallSite
, CallSiteFilter
, prettySrcLoc
, prettyCallSite
, prettyCallStack
, filterCallStack
, headCallSite
, overCallSites
, popnCallStack
, truncatedCallStack
, withCallerCallStack
, withCurrentCallStack
, withNBackCallStack
, CallStack
, callStack
, fromCallSiteList
, getCallStack
, HasCallStack
, SrcLoc(..)
)
where
import Data.List ( intercalate )
import Data.Maybe ( listToMaybe )
import GHC.Stack
( callStack
, CallStack
, emptyCallStack
, fromCallSiteList
, getCallStack
, HasCallStack
, popCallStack
, prettySrcLoc
, SrcLoc(..)
)
type SrcLocPackage = String
type SrcLocModule = String
type SrcFun = String
type SrcLocFile = String
type SrcLocLine = Int
type SrcLocCol = Int
type CallSite = (SrcFun, SrcLoc)
type CallSiteFilter = CallSite -> Bool
prettyCallSite :: CallSite -> String
prettyCallSite :: CallSite -> [Char]
prettyCallSite ([Char]
fun, SrcLoc
loc) = [Char]
fun forall a. [a] -> [a] -> [a]
++ [Char]
", called at " forall a. [a] -> [a] -> [a]
++ SrcLoc -> [Char]
prettySrcLoc SrcLoc
loc
prettyCallStack :: CallStack -> String
prettyCallStack :: CallStack -> [Char]
prettyCallStack CallStack
cs = case forall a b. (a -> b) -> [a] -> [b]
map CallSite -> [Char]
prettyCallSite (CallStack -> [CallSite]
getCallStack CallStack
cs) of
[] -> [Char]
"(empty CallStack)"
[Char]
firstLoc : [[Char]]
restLocs -> forall a. [a] -> [[a]] -> [a]
intercalate [Char]
"\n" ([Char]
firstLoc forall a. a -> [a] -> [a]
: (forall a b. (a -> b) -> [a] -> [b]
map ([Char]
" " forall a. [a] -> [a] -> [a]
++) [[Char]]
restLocs))
headCallSite :: CallStack -> Maybe CallSite
headCallSite :: CallStack -> Maybe CallSite
headCallSite = forall a. [a] -> Maybe a
listToMaybe forall b c a. (b -> c) -> (a -> b) -> a -> c
. CallStack -> [CallSite]
getCallStack
truncatedCallStack :: CallStack -> CallStack
truncatedCallStack :: CallStack -> CallStack
truncatedCallStack CallStack
cs = forall b a. b -> (a -> b) -> Maybe a -> b
maybe CallStack
emptyCallStack ([CallSite] -> CallStack
fromCallSiteList forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (f :: * -> *) a. Applicative f => a -> f a
pure) (CallStack -> Maybe CallSite
headCallSite CallStack
cs)
overCallSites :: ([CallSite] -> [CallSite]) -> CallStack -> CallStack
overCallSites :: ([CallSite] -> [CallSite]) -> CallStack -> CallStack
overCallSites [CallSite] -> [CallSite]
f = [CallSite] -> CallStack
fromCallSiteList forall b c a. (b -> c) -> (a -> b) -> a -> c
. [CallSite] -> [CallSite]
f forall b c a. (b -> c) -> (a -> b) -> a -> c
. CallStack -> [CallSite]
getCallStack
filterCallStack :: CallSiteFilter -> CallStack -> CallStack
filterCallStack :: CallSiteFilter -> CallStack -> CallStack
filterCallStack = ([CallSite] -> [CallSite]) -> CallStack -> CallStack
overCallSites forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. (a -> Bool) -> [a] -> [a]
filter
popnCallStack :: Word -> CallStack -> CallStack
popnCallStack :: Word -> CallStack -> CallStack
popnCallStack Word
0 = forall a. a -> a
id
popnCallStack Word
n = (Word -> CallStack -> CallStack
popnCallStack (Word
n forall a. Num a => a -> a -> a
- Word
1)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. CallStack -> CallStack
popCallStack
withNBackCallStack :: HasCallStack => Word -> (CallStack -> b) -> b
withNBackCallStack :: forall b. HasCallStack => Word -> (CallStack -> b) -> b
withNBackCallStack Word
n CallStack -> b
f = CallStack -> b
f (Word -> CallStack -> CallStack
popnCallStack Word
n CallStack
from)
where
here :: CallStack
here = HasCallStack => CallStack
callStack
from :: CallStack
from = CallStack -> CallStack
popCallStack CallStack
here
withCurrentCallStack :: HasCallStack => (CallStack -> b) -> b
withCurrentCallStack :: forall b. HasCallStack => (CallStack -> b) -> b
withCurrentCallStack = forall b. HasCallStack => Word -> (CallStack -> b) -> b
withNBackCallStack Word
0
withCallerCallStack :: HasCallStack => (CallStack -> b) -> b
withCallerCallStack :: forall b. HasCallStack => (CallStack -> b) -> b
withCallerCallStack = forall b. HasCallStack => Word -> (CallStack -> b) -> b
withNBackCallStack Word
1