{-# LANGUAGE FlexibleContexts #-}

-- | Classy shim around @Database.Esqueleto.Legacy@
--
-- In the style of @Database.Persist.Monad@, this exposes a "classy"
-- (typeclass-using) API for Esqueleto functions, allowing them to be
-- used with 'MonadSqlQuery' constraints rather than a
-- @'ReaderT' 'SqlBackend'@ concrete type.
--
-- The goal of this module is to be a drop-in replacement for
-- @Database.Esqueleto.Legacy@.
module Database.Esqueleto.Monad.Legacy
  ( select
  , selectOne
  , delete
  , update
  , renderQuerySelect
  , P.deleteWhere
  , P.get
  , P.getBy
  , P.getEntity
  , P.getMany
  , P.insert
  , P.insert_
  , P.insertKey
  , P.insertMany_
  , P.insertEntityMany
  , P.selectFirst
  , P.updateWhere
  , module Database.Esqueleto.Legacy
  ) where

import Data.Text(Text)
import Database.Esqueleto.Internal.Internal (SqlSelect)
import qualified Database.Esqueleto.Legacy as E
import Database.Esqueleto.Legacy hiding
  ( select
  , selectOne
  , delete
  , update
  , renderQuerySelect

  -- Persistent re-exports
  , deleteWhere
  , get
  , getBy
  , getEntity
  , getMany
  , insert
  , insert_
  , insertKey
  , insertMany_
  , insertEntityMany
  , selectFirst
  , updateWhere
  )
import qualified Database.Persist.Monad as P

-- | Classy version of 'E.select'
select :: (P.MonadSqlQuery m, SqlSelect a r) => SqlQuery a -> m [r]
select :: forall (m :: * -> *) a r.
(MonadSqlQuery m, SqlSelect a r) =>
SqlQuery a -> m [r]
select SqlQuery a
query = Text
-> (forall (m2 :: * -> *). MonadIO m2 => SqlPersistT m2 [r])
-> m [r]
forall (m :: * -> *) a.
MonadSqlQuery m =>
Text
-> (forall (m2 :: * -> *). MonadIO m2 => SqlPersistT m2 a) -> m a
P.unsafeLiftSql Text
"esqueleto-select" (SqlQuery a -> ReaderT SqlBackend m2 [r]
forall a r (m :: * -> *) backend.
(SqlSelect a r, MonadIO m, SqlBackendCanRead backend) =>
SqlQuery a -> ReaderT backend m [r]
E.select SqlQuery a
query)

-- | Classy version of 'E.selectOne'
selectOne :: (P.MonadSqlQuery m, SqlSelect a r) => SqlQuery a -> m (Maybe r)
selectOne :: forall (m :: * -> *) a r.
(MonadSqlQuery m, SqlSelect a r) =>
SqlQuery a -> m (Maybe r)
selectOne SqlQuery a
query = Text
-> (forall (m2 :: * -> *). MonadIO m2 => SqlPersistT m2 (Maybe r))
-> m (Maybe r)
forall (m :: * -> *) a.
MonadSqlQuery m =>
Text
-> (forall (m2 :: * -> *). MonadIO m2 => SqlPersistT m2 a) -> m a
P.unsafeLiftSql Text
"esqueleto-selectOne" (SqlQuery a -> ReaderT SqlBackend m2 (Maybe r)
forall a r (m :: * -> *) backend.
(SqlSelect a r, MonadIO m, SqlBackendCanRead backend) =>
SqlQuery a -> ReaderT backend m (Maybe r)
E.selectOne SqlQuery a
query)

-- | Classy version of 'E.delete'
delete :: (P.MonadSqlQuery m) => SqlQuery () -> m ()
delete :: forall (m :: * -> *). MonadSqlQuery m => SqlQuery () -> m ()
delete SqlQuery ()
query = Text
-> (forall (m2 :: * -> *). MonadIO m2 => SqlPersistT m2 ()) -> m ()
forall (m :: * -> *) a.
MonadSqlQuery m =>
Text
-> (forall (m2 :: * -> *). MonadIO m2 => SqlPersistT m2 a) -> m a
P.unsafeLiftSql Text
"esqueleto-delete" (SqlQuery () -> ReaderT SqlBackend m2 ()
forall (m :: * -> *) backend.
(MonadIO m, SqlBackendCanWrite backend) =>
SqlQuery () -> ReaderT backend m ()
E.delete SqlQuery ()
query)

-- | Classy version of 'E.update'
update ::
     ( P.MonadSqlQuery m
     , PersistEntity val
     , BackendCompatible SqlBackend (PersistEntityBackend val)
     )
  => (SqlExpr (Entity val) -> SqlQuery ()) -> m ()
update :: forall (m :: * -> *) val.
(MonadSqlQuery m, PersistEntity val,
 BackendCompatible SqlBackend (PersistEntityBackend val)) =>
(SqlExpr (Entity val) -> SqlQuery ()) -> m ()
update SqlExpr (Entity val) -> SqlQuery ()
query = Text
-> (forall (m2 :: * -> *). MonadIO m2 => SqlPersistT m2 ()) -> m ()
forall (m :: * -> *) a.
MonadSqlQuery m =>
Text
-> (forall (m2 :: * -> *). MonadIO m2 => SqlPersistT m2 a) -> m a
P.unsafeLiftSql Text
"esqueleto-update" ((SqlExpr (Entity val) -> SqlQuery ()) -> ReaderT SqlBackend m2 ()
forall (m :: * -> *) val backend.
(MonadIO m, PersistEntity val,
 BackendCompatible SqlBackend (PersistEntityBackend val),
 SqlBackendCanWrite backend) =>
(SqlExpr (Entity val) -> SqlQuery ()) -> ReaderT backend m ()
E.update SqlExpr (Entity val) -> SqlQuery ()
query)

renderQuerySelect :: (P.MonadSqlQuery m, SqlSelect a r) => SqlQuery a -> m (Text, [PersistValue])
renderQuerySelect :: forall (m :: * -> *) a r.
(MonadSqlQuery m, SqlSelect a r) =>
SqlQuery a -> m (Text, [PersistValue])
renderQuerySelect SqlQuery a
query = Text
-> (forall (m2 :: * -> *).
    MonadIO m2 =>
    SqlPersistT m2 (Text, [PersistValue]))
-> m (Text, [PersistValue])
forall (m :: * -> *) a.
MonadSqlQuery m =>
Text
-> (forall (m2 :: * -> *). MonadIO m2 => SqlPersistT m2 a) -> m a
P.unsafeLiftSql Text
"esqueleto-renderQuerySelect" (SqlQuery a -> ReaderT SqlBackend m2 (Text, [PersistValue])
forall a r backend (m :: * -> *).
(SqlSelect a r, BackendCompatible SqlBackend backend, Monad m) =>
SqlQuery a -> ReaderT backend m (Text, [PersistValue])
E.renderQuerySelect SqlQuery a
query)