debuggable-0.1.1: demo/Demo/Scope.hs
module Demo.Scope (Example(..), demo) where
import Control.Concurrent
import Control.Concurrent.Async
import Debug.NonInterleavedIO.Scoped qualified as Scoped
import Debug.Provenance.Scope
{-------------------------------------------------------------------------------
Top-level
-------------------------------------------------------------------------------}
data Example =
Example1
| Example2
| Example3
| Example4
deriving (Show)
demo :: Example -> IO ()
demo Example1 = g4
demo Example2 = g1
demo Example3 = concurrent
demo Example4 = h1
{-------------------------------------------------------------------------------
Using the library
-------------------------------------------------------------------------------}
g1 :: IO ()
g1 = g2
g2 :: HasCallStack => IO ()
g2 = scoped g3
g3 :: HasCallStack => IO ()
g3 = scoped g4
g4 :: HasCallStack => IO ()
g4 = do
Scoped.putStrLn "start"
-- f4 does something ..
Scoped.putStrLn "middle"
-- f4 does something else ..
Scoped.putStrLn "end"
concurrent :: IO ()
concurrent = concurrently_ g4 g4
h1 :: IO ()
h1 = h2
h2 :: HasCallStack => IO ()
h2 = scoped h3
h3 :: HasCallStack => IO ()
h3 = scoped $ do
tid <- myThreadId
concurrently_
(inheritScope tid >> g4)
(inheritScope tid >> g4)