linear-base-0.2.0: src/Debug/Trace/Linear.hs
{-# LANGUAGE LinearTypes #-}
{-# LANGUAGE NoImplicitPrelude #-}
-- |
-- A thin wrapper on top of "Debug.Trace", providing linear versions of
-- tracing functions.
--
-- It only contains minimal amount of documentation; you should consult
-- the original "Debug.Trace" module for more detailed information.
module Debug.Trace.Linear
( -- * Tracing
trace,
traceShow,
traceId,
traceStack,
traceIO,
traceM,
traceShowM,
-- * Eventlog tracing
traceEvent,
traceEventIO,
-- * Execution phase markers
traceMarker,
traceMarkerIO,
)
where
import Data.Functor.Linear
import Data.Unrestricted.Linear
import qualified Debug.Trace as NonLinear
import Prelude.Linear.Internal
import System.IO.Linear
import qualified Unsafe.Linear as Unsafe
import Prelude (Show (..), String)
-- | The 'trace' function outputs the trace message given as its first
-- argument, before returning the second argument as its result.
trace :: String %1 -> a %1 -> a
trace = Unsafe.toLinear2 NonLinear.trace
-- | Like 'trace', but uses 'show' on the argument to convert it to
-- a 'String'.
traceShow :: Show a => a -> b %1 -> b
traceShow a = Unsafe.toLinear (NonLinear.traceShow a)
-- | Like 'trace' but returns the message instead of a third value.
traceId :: String %1 -> String
traceId s = dup s & \(s', s'') -> trace s' s''
-- | Like 'trace', but additionally prints a call stack if one is
-- available.
traceStack :: String %1 -> a %1 -> a
traceStack = Unsafe.toLinear2 NonLinear.traceStack
-- | The 'traceIO' function outputs the trace message from the IO monad.
-- This sequences the output with respect to other IO actions.
traceIO :: String %1 -> IO ()
traceIO s = fromSystemIO (Unsafe.toLinear NonLinear.traceIO s)
-- | Like 'trace' but returning unit in an arbitrary 'Applicative'
-- context. Allows for convenient use in do-notation.
traceM :: Applicative f => String %1 -> f ()
traceM s = trace s $ pure ()
-- | Like 'traceM', but uses 'show' on the argument to convert it to a
-- 'String'.
traceShowM :: (Show a, Applicative f) => a -> f ()
traceShowM a = traceM (show a)
-- | The 'traceEvent' function behaves like 'trace' with the difference
-- that the message is emitted to the eventlog, if eventlog profiling is
-- available and enabled at runtime.
traceEvent :: String %1 -> a %1 -> a
traceEvent = Unsafe.toLinear2 NonLinear.traceEvent
-- | The 'traceEventIO' function emits a message to the eventlog, if
-- eventlog profiling is available and enabled at runtime.
traceEventIO :: String %1 -> IO ()
traceEventIO s = fromSystemIO (Unsafe.toLinear NonLinear.traceEventIO s)
-- | The 'traceMarker' function emits a marker to the eventlog, if eventlog
-- profiling is available and enabled at runtime. The @String@ is the name
-- of the marker. The name is just used in the profiling tools to help you
-- keep clear which marker is which.
traceMarker :: String %1 -> a %1 -> a
traceMarker = Unsafe.toLinear2 NonLinear.traceMarker
-- | The 'traceMarkerIO' function emits a marker to the eventlog, if
-- eventlog profiling is available and enabled at runtime.
traceMarkerIO :: String %1 -> IO ()
traceMarkerIO s = fromSystemIO (Unsafe.toLinear NonLinear.traceMarkerIO s)