{-# language FlexibleContexts #-}

module Main (main) where

import RequireCallStack (RequireCallStack, provideCallStack)
import Control.Exception

panic :: RequireCallStack => String -> IO a
panic = error

foo :: RequireCallStack => Int -> IO String
foo _ = panic "foo"

bar :: RequireCallStack => Int -> IO String
bar = foo

baz :: Int -> IO String
baz = provideCallStack bar

main :: IO ()
main = do
    -- won't work, no callstack
    -- panic "asdf"

    provideCallStack $ do
            -- panic "one level of provide callstack"
            pure ()

    Left (ErrorCall "foo") <- try $ baz 3


    -- bar 3

    pure ()
