rel8-1.0.0.0: src/Rel8/Type/Semigroup.hs
{-# language BlockArguments #-}
{-# language DataKinds #-}
{-# language FlexibleContexts #-}
{-# language FlexibleInstances #-}
{-# language MultiParamTypeClasses #-}
{-# language StandaloneKindSignatures #-}
{-# language TypeFamilies #-}
{-# language UndecidableInstances #-}
module Rel8.Type.Semigroup
( DBSemigroup( (<>.))
)
where
-- base
import Data.Kind ( Constraint, Type )
import Data.List.NonEmpty ( NonEmpty )
import Prelude ()
-- bytestring
import Data.ByteString ( ByteString )
import qualified Data.ByteString.Lazy as Lazy ( ByteString )
-- case-insensitive
import Data.CaseInsensitive ( CI )
-- opaleye
import qualified Opaleye.Internal.HaskellDB.PrimQuery as Opaleye
-- rel8
import {-# SOURCE #-} Rel8.Expr ( Expr )
import Rel8.Expr.Array ( sappend, sappend1 )
import Rel8.Expr.Opaleye ( zipPrimExprsWith )
import Rel8.Schema.Null ( Sql )
import Rel8.Type ( DBType )
-- text
import Data.Text ( Text )
import qualified Data.Text.Lazy as Lazy ( Text )
-- time
import Data.Time.LocalTime ( CalendarDiffTime )
-- | The class of 'Rel8.DBType's that form a semigroup. This class is purely a
-- Rel8 concept, and exists to mirror the 'Semigroup' class.
type DBSemigroup :: Type -> Constraint
class DBType a => DBSemigroup a where
-- | An associative operation.
(<>.) :: Expr a -> Expr a -> Expr a
infixr 6 <>.
instance Sql DBType a => DBSemigroup [a] where
(<>.) = sappend
instance Sql DBType a => DBSemigroup (NonEmpty a) where
(<>.) = sappend1
instance DBSemigroup CalendarDiffTime where
(<>.) = zipPrimExprsWith (Opaleye.BinExpr (Opaleye.:+))
instance DBSemigroup Text where
(<>.) = zipPrimExprsWith (Opaleye.BinExpr (Opaleye.:||))
instance DBSemigroup Lazy.Text where
(<>.) = zipPrimExprsWith (Opaleye.BinExpr (Opaleye.:||))
instance DBSemigroup (CI Text) where
(<>.) = zipPrimExprsWith (Opaleye.BinExpr (Opaleye.:||))
instance DBSemigroup (CI Lazy.Text) where
(<>.) = zipPrimExprsWith (Opaleye.BinExpr (Opaleye.:||))
instance DBSemigroup ByteString where
(<>.) = zipPrimExprsWith (Opaleye.BinExpr (Opaleye.:||))
instance DBSemigroup Lazy.ByteString where
(<>.) = zipPrimExprsWith (Opaleye.BinExpr (Opaleye.:||))