module PlutusTx.Plugin.Timing (timeStage, timingsEnabled) where
import Control.Monad.IO.Class (MonadIO)
import GHC.Driver.Flags (DumpFlag (Opt_D_dump_timings))
import GHC.Utils.Error (withTiming)
import GHC.Utils.Logger (Logger, logHasDumpFlag, logVerbAtLeast)
import GHC.Utils.Outputable (brackets, text, (<+>))
timeStage
:: MonadIO monad
=> Logger
-> Bool
-> String
-> String
-> (result -> ())
-> monad result
-> monad result
timeStage :: forall (monad :: * -> *) result.
MonadIO monad =>
Logger
-> Bool
-> String
-> String
-> (result -> ())
-> monad result
-> monad result
timeStage Logger
logger Bool
forceResults String
scope String
stage result -> ()
forceResult =
Logger -> SDoc -> (result -> ()) -> monad result -> monad result
forall (m :: * -> *) a.
MonadIO m =>
Logger -> SDoc -> (a -> ()) -> m a -> m a
withTiming
Logger
logger
(String -> SDoc
forall doc. IsLine doc => String -> doc
text String
"Plinth" SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> String -> SDoc
forall doc. IsLine doc => String -> doc
text String
stage SDoc -> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc -> doc
<+> SDoc -> SDoc
forall doc. IsLine doc => doc -> doc
brackets (String -> SDoc
forall doc. IsLine doc => String -> doc
text String
scope))
(if Bool
forceResults then result -> ()
forceResult else () -> result -> ()
forall a b. a -> b -> a
const ())
timingsEnabled :: Logger -> Bool
timingsEnabled :: Logger -> Bool
timingsEnabled Logger
logger = Logger -> Int -> Bool
logVerbAtLeast Logger
logger Int
2 Bool -> Bool -> Bool
|| Logger -> DumpFlag -> Bool
logHasDumpFlag Logger
logger DumpFlag
Opt_D_dump_timings