{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}

-- |
-- Module      : Database.Relational.Monad.Restrict
-- Copyright   : 2013-2019 Kei Hibino
-- License     : BSD3
--
-- Maintainer  : ex8k.hibino@gmail.com
-- Stability   : experimental
-- Portability : unknown
--
-- This module contains definitions about simple restrict context monad type.
module Database.Relational.Monad.Restrict (
  -- * Monad to restrict target records.
  Restrict, RestrictedStatement,
  extract
  ) where

import Database.Relational.Internal.ContextType (Flat)
import Database.Relational.Internal.Config (Config)
import Database.Relational.SqlSyntax (Predicate, Record)

import Database.Relational.Monad.Trans.Restricting
  (Restrictings, extractRestrict)
import Database.Relational.Monad.BaseType (ConfigureQuery, configureQuery)


-- | Restrict only monad type used from update statement and delete statement.
type Restrict = Restrictings Flat ConfigureQuery

-- | RestrictedStatement type synonym.
--   Record type 'r' must be
--   the same as 'Restrictings' type parameter 'r'.
type RestrictedStatement r a = Record Flat r -> Restrict a

-- | Run 'Restrict' to get 'QueryRestriction'.
extract :: Restrict a -> Config -> (a, [Predicate Flat])
extract :: Restrict a -> Config -> (a, [Predicate Flat])
extract =  ConfigureQuery (a, [Predicate Flat])
-> Config -> (a, [Predicate Flat])
forall q. ConfigureQuery q -> Config -> q
configureQuery (ConfigureQuery (a, [Predicate Flat])
 -> Config -> (a, [Predicate Flat]))
-> (Restrict a -> ConfigureQuery (a, [Predicate Flat]))
-> Restrict a
-> Config
-> (a, [Predicate Flat])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Restrict a -> ConfigureQuery (a, [Predicate Flat])
forall (m :: * -> *) c a.
(Monad m, Functor m) =>
Restrictings c m a -> m (a, [Predicate c])
extractRestrict