{-# 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.:||))