packages feed

debuggable-0.1.0: src/Debug/NonInterleavedIO/Scoped.hs

-- | Utilities for writing debugging messages that include provenance
--
-- Intended for qualified import.
--
-- > import Debug.NonInterleavedIO.Scoped qualified as Scoped
module Debug.NonInterleavedIO.Scoped (
    putStrLn
  ) where

import Prelude hiding (putStrLn)

import Control.Monad.IO.Class
import Data.List (intercalate)

import Debug.NonInterleavedIO qualified as NIIO
import Debug.Provenance.Internal
import Debug.Provenance.Scope

{-------------------------------------------------------------------------------
  Uniques
-------------------------------------------------------------------------------}

-- | Print debug message, showing current scope
putStrLn :: (HasCallStack, MonadIO m) => String -> m ()
putStrLn str = do
    scope <- getScope
    here  <- newInvocationFrom callSite -- the call to 'putStrLn'

    let prettyScope :: String
        prettyScope = concat [
            "["
          , intercalate ", " $ map prettyInvocation (here : scope)
          , "]"
          ]

    NIIO.putStrLn $
      case lines str of
        [one] -> prettyScope ++ " " ++ one
        many  -> intercalate "\n" $ prettyScope : map ("  " ++) many