{-# OPTIONS_GHC -fno-warn-orphans #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiParamTypeClasses #-} -- | -- Module : Database.Relational.Query.Monad.Restrict -- Copyright : 2013 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.Query.Monad.Restrict ( -- * Monad to restrict target records. Restrict, RestrictedStatement, -- restricted, extract ) where import Database.Relational.Query.Component (Config, QueryRestriction) import Database.Relational.Query.Context (Flat) import Database.Relational.Query.Projection (Projection) import Database.Relational.Query.Monad.Class (MonadQualify(..)) import Database.Relational.Query.Monad.Trans.Restricting (Restrictings, restrictings, extractRestrict) import Database.Relational.Query.Monad.Type (ConfigureQuery, configureQuery) -- | Restrict only monad type used from update statement and delete statement. type Restrict = Restrictings Flat ConfigureQuery -- | RestrictedStatement type synonym. -- Projection record type 'r' must be -- the same as 'Restrictings' type parameter 'r'. type RestrictedStatement r a = Projection Flat r -> Restrict a -- | Instance to lift from qualified table forms into 'Restrict'. instance MonadQualify ConfigureQuery Restrict where liftQualify = restrictings -- -- | 'return' of 'Restrict' -- restricted :: a -> Restrict a -- restricted = restrict . Identity -- | Run 'Restrict' to get 'QueryRestriction'. extract :: Restrict a -> Config -> (a, QueryRestriction Flat) extract = configureQuery . extractRestrict