packages feed

postgresql-tx-simple-0.2.0.0: src/Database/PostgreSQL/Tx/Simple/Internal.hs

{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeApplications #-}
module Database.PostgreSQL.Tx.Simple.Internal
  ( -- * Disclaimer
    -- $disclaimer

    -- ** Internals
    module Database.PostgreSQL.Tx.Simple.Internal
  ) where

import Data.Kind (Constraint)
import Database.PostgreSQL.Tx (TxEnv, TxException, TxM, askTxEnv, mapExceptionTx)
import Database.PostgreSQL.Tx.Unsafe (unsafeMkTxException, unsafeMksTxM, unsafeRunIOInTxM, unsafeRunTxM)
import qualified Data.ByteString.Char8 as Char8
import qualified Database.PostgreSQL.Simple as Simple

-- | Runtime environment needed to run @postgresql-simple@ via @postgresql-tx@.
--
-- @since 0.2.0.0
type PgSimpleEnv r = (TxEnv Simple.Connection r) :: Constraint

-- | Monad type alias for running @postgresql-simple@ via @postgresql-tx@.
--
-- @since 0.2.0.0
type PgSimpleM a = forall r. (PgSimpleEnv r) => TxM r a

unsafeRunTransaction
  :: (PgSimpleEnv r)
  => (Simple.Connection -> IO a -> IO a)
  -> r -> TxM r a -> IO a
unsafeRunTransaction f r x = do
  unsafeRunTxM r do
    conn <- askTxEnv
    unsafeRunIOInTxM $ f conn (unsafeRunTxM r x)

fromSqlError :: Simple.SqlError -> TxException
fromSqlError = unsafeMkTxException (Just . Char8.unpack . Simple.sqlState)

unsafeFromPgSimple
  :: (Simple.Connection -> IO x)
  -> PgSimpleM x
unsafeFromPgSimple f =
  mapExceptionTx (Just . fromSqlError) do
    unsafeMksTxM f

unsafeFromPgSimple1
  :: (Simple.Connection -> a1 -> IO x)
  -> a1 -> PgSimpleM x
unsafeFromPgSimple1 f a1 = unsafeFromPgSimple \c -> f c a1

unsafeFromPgSimple2
  :: (Simple.Connection -> a1 -> a2 -> IO x)
  -> a1 -> a2 -> PgSimpleM x
unsafeFromPgSimple2 f a1 a2 = unsafeFromPgSimple \c -> f c a1 a2

-- $disclaimer
--
-- Changes to this module will not be reflected in the library's version
-- updates.