packages feed

debuggable-0.1.1: demo/Demo/Invocation.hs

module Demo.Invocation (
    Example(..)
  , DebuggableExample(..)
  , demo
  ) where

import Control.Monad

import Debug.Provenance

{-------------------------------------------------------------------------------
  Top-level
-------------------------------------------------------------------------------}

data Example =
    WithoutDebuggable
  | UseDebuggable DebuggableExample
  deriving stock (Show)

data DebuggableExample =
    Example1
  | Example2
  deriving stock (Show)

demo :: Example -> IO ()
demo WithoutDebuggable        = f4
demo (UseDebuggable Example1) = g1
demo (UseDebuggable Example2) = g4

{-------------------------------------------------------------------------------
  Without the library
-------------------------------------------------------------------------------}

f4 :: IO ()
f4 = do
    putStrLn "f4:1"
    -- f4 does something ..
    putStrLn "f4:2"
    -- f4 does something else ..
    putStrLn "f4:3"

{-------------------------------------------------------------------------------
  Using the library
-------------------------------------------------------------------------------}

g1 :: IO ()
g1 = replicateM_ 2 g2

g2 :: HasCallStack => IO ()
g2 = do
    print =<< newInvocation
    replicateM_ 2 g3

g3 :: HasCallStack => IO ()
g3 = print =<< newInvocation

g4 :: HasCallStack => IO ()
g4 = do
    print =<< newInvocation
    -- f4 does something ..
    print =<< newInvocation
    -- f4 does something else ..
    print =<< newInvocation