{-# language FlexibleContexts #-}
{-# language NamedFieldPuns #-}
{-# language ScopedTypeVariables #-}
{-# language TypeApplications #-}
{-# language TypeFamilies #-}
{-# options_ghc -fno-warn-redundant-constraints #-}
module Rel8.Expr.Opaleye
( castExpr, unsafeCastExpr
, scastExpr, sunsafeCastExpr
, unsafeLiteral
, fromPrimExpr, toPrimExpr, mapPrimExpr, zipPrimExprsWith, traversePrimExpr
, toColumn, fromColumn, traverseFieldP
)
where
import Prelude
import qualified Opaleye.Internal.Column as Opaleye
import qualified Opaleye.Internal.HaskellDB.PrimQuery as Opaleye
import {-# SOURCE #-} Rel8.Expr ( Expr( Expr ) )
import Rel8.Schema.Null ( Unnullify, Sql )
import Rel8.Type ( DBType, typeInformation )
import Rel8.Type.Information ( TypeInformation(..) )
import Rel8.Type.Name (TypeName, showTypeName)
import Data.Profunctor ( Profunctor, dimap )
castExpr :: Sql DBType a => Expr a -> Expr a
castExpr :: forall a. Sql DBType a => Expr a -> Expr a
castExpr = TypeInformation (Unnullify' (IsMaybe a) a) -> Expr a -> Expr a
forall a. TypeInformation (Unnullify a) -> Expr a -> Expr a
scastExpr TypeInformation (Unnullify' (IsMaybe a) a)
forall a. DBType a => TypeInformation a
typeInformation
unsafeCastExpr :: forall b a. Sql DBType b => Expr a -> Expr b
unsafeCastExpr :: forall b a. Sql DBType b => Expr a -> Expr b
unsafeCastExpr = case forall a. DBType a => TypeInformation a
typeInformation @(Unnullify b) of
TypeInformation {TypeName
typeName :: TypeName
typeName :: forall a. TypeInformation a -> TypeName
typeName} -> TypeName -> Expr a -> Expr b
forall a b. TypeName -> Expr a -> Expr b
sunsafeCastExpr TypeName
typeName
scastExpr :: TypeInformation (Unnullify a) -> Expr a -> Expr a
scastExpr :: forall a. TypeInformation (Unnullify a) -> Expr a -> Expr a
scastExpr TypeInformation {TypeName
typeName :: forall a. TypeInformation a -> TypeName
typeName :: TypeName
typeName} = TypeName -> Expr a -> Expr a
forall a b. TypeName -> Expr a -> Expr b
sunsafeCastExpr TypeName
typeName
sunsafeCastExpr :: ()
=> TypeName -> Expr a -> Expr b
sunsafeCastExpr :: forall a b. TypeName -> Expr a -> Expr b
sunsafeCastExpr TypeName
name =
PrimExpr -> Expr b
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr b) -> (Expr a -> PrimExpr) -> Expr a -> Expr b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> PrimExpr -> PrimExpr
Opaleye.CastExpr (TypeName -> Name
showTypeName TypeName
name) (PrimExpr -> PrimExpr)
-> (Expr a -> PrimExpr) -> Expr a -> PrimExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr a -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr
unsafeLiteral :: String -> Expr a
unsafeLiteral :: forall a. Name -> Expr a
unsafeLiteral = PrimExpr -> Expr a
forall a. PrimExpr -> Expr a
Expr (PrimExpr -> Expr a) -> (Name -> PrimExpr) -> Name -> Expr a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Literal -> PrimExpr
Opaleye.ConstExpr (Literal -> PrimExpr) -> (Name -> Literal) -> Name -> PrimExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Name -> Literal
Opaleye.OtherLit
fromPrimExpr :: Opaleye.PrimExpr -> Expr a
fromPrimExpr :: forall a. PrimExpr -> Expr a
fromPrimExpr = PrimExpr -> Expr a
forall a. PrimExpr -> Expr a
Expr
toPrimExpr :: Expr a -> Opaleye.PrimExpr
toPrimExpr :: forall a. Expr a -> PrimExpr
toPrimExpr (Expr PrimExpr
a) = PrimExpr
a
mapPrimExpr :: (Opaleye.PrimExpr -> Opaleye.PrimExpr) -> Expr a -> Expr b
mapPrimExpr :: forall a b. (PrimExpr -> PrimExpr) -> Expr a -> Expr b
mapPrimExpr PrimExpr -> PrimExpr
f = PrimExpr -> Expr b
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr b) -> (Expr a -> PrimExpr) -> Expr a -> Expr b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrimExpr -> PrimExpr
f (PrimExpr -> PrimExpr)
-> (Expr a -> PrimExpr) -> Expr a -> PrimExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr a -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr
zipPrimExprsWith :: ()
=> (Opaleye.PrimExpr -> Opaleye.PrimExpr -> Opaleye.PrimExpr)
-> Expr a -> Expr b -> Expr c
zipPrimExprsWith :: forall a b c.
(PrimExpr -> PrimExpr -> PrimExpr) -> Expr a -> Expr b -> Expr c
zipPrimExprsWith PrimExpr -> PrimExpr -> PrimExpr
f Expr a
a Expr b
b = PrimExpr -> Expr c
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> PrimExpr -> PrimExpr
f (Expr a -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr Expr a
a) (Expr b -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr Expr b
b))
traversePrimExpr :: Functor f
=> (Opaleye.PrimExpr -> f Opaleye.PrimExpr) -> Expr a -> f (Expr b)
traversePrimExpr :: forall (f :: * -> *) a b.
Functor f =>
(PrimExpr -> f PrimExpr) -> Expr a -> f (Expr b)
traversePrimExpr PrimExpr -> f PrimExpr
f = (PrimExpr -> Expr b) -> f PrimExpr -> f (Expr b)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap PrimExpr -> Expr b
forall a. PrimExpr -> Expr a
fromPrimExpr (f PrimExpr -> f (Expr b))
-> (Expr a -> f PrimExpr) -> Expr a -> f (Expr b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. PrimExpr -> f PrimExpr
f (PrimExpr -> f PrimExpr)
-> (Expr a -> PrimExpr) -> Expr a -> f PrimExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr a -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr
traverseFieldP :: Profunctor p
=> p (Opaleye.Field_ n x) (Opaleye.Field_ m y)
-> p (Expr a) (Expr b)
traverseFieldP :: forall (p :: * -> * -> *) (n :: Nullability) x (m :: Nullability) y
a b.
Profunctor p =>
p (Field_ n x) (Field_ m y) -> p (Expr a) (Expr b)
traverseFieldP = (Expr a -> Field_ n x)
-> (Field_ m y -> Expr b)
-> p (Field_ n x) (Field_ m y)
-> p (Expr a) (Expr b)
forall a b c d. (a -> b) -> (c -> d) -> p b c -> p a d
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap (PrimExpr -> Field_ n x
forall (n :: Nullability) b. PrimExpr -> Field_ n b
toColumn (PrimExpr -> Field_ n x)
-> (Expr a -> PrimExpr) -> Expr a -> Field_ n x
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Expr a -> PrimExpr
forall a. Expr a -> PrimExpr
toPrimExpr) (PrimExpr -> Expr b
forall a. PrimExpr -> Expr a
fromPrimExpr (PrimExpr -> Expr b)
-> (Field_ m y -> PrimExpr) -> Field_ m y -> Expr b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Field_ m y -> PrimExpr
forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn)
toColumn :: Opaleye.PrimExpr -> Opaleye.Field_ n b
toColumn :: forall (n :: Nullability) b. PrimExpr -> Field_ n b
toColumn = PrimExpr -> Field_ n b
forall (n :: Nullability) b. PrimExpr -> Field_ n b
Opaleye.Column
fromColumn :: Opaleye.Field_ n b -> Opaleye.PrimExpr
fromColumn :: forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn (Opaleye.Column PrimExpr
a) = PrimExpr
a