{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeApplications #-}
module Database.PostgreSQL.Tx.MonadLogger.Unsafe where

import Control.Monad.Logger (LoggingT(runLoggingT))
import Database.PostgreSQL.Tx (TxEnv, TxM, askTxEnv)
import Database.PostgreSQL.Tx.MonadLogger (Logger)
import Database.PostgreSQL.Tx.Unsafe (unsafeRunIOInTxM)

-- | Promote a 'LoggingT' over 'IO' to 'TxM'.
-- Use this function with care - arbitrary 'IO' should only be run
-- within a transaction when truly necessary.
--
-- @since 0.2.0.0
unsafeRunLoggerIOInTxM :: (TxEnv Logger r) => LoggingT IO a -> TxM r a
unsafeRunLoggerIOInTxM :: LoggingT IO a -> TxM r a
unsafeRunLoggerIOInTxM LoggingT IO a
x = do
  Loc -> LogSource -> LogLevel -> LogStr -> IO ()
logger <- TxM r (Loc -> LogSource -> LogLevel -> LogStr -> IO ())
forall a r. TxEnv a r => TxM r a
askTxEnv
  IO a -> TxM r a
forall a r. IO a -> TxM r a
unsafeRunIOInTxM (IO a -> TxM r a) -> IO a -> TxM r a
forall a b. (a -> b) -> a -> b
$ LoggingT IO a
-> (Loc -> LogSource -> LogLevel -> LogStr -> IO ()) -> IO a
forall (m :: * -> *) a.
LoggingT m a
-> (Loc -> LogSource -> LogLevel -> LogStr -> IO ()) -> m a
runLoggingT LoggingT IO a
x Loc -> LogSource -> LogLevel -> LogStr -> IO ()
logger