on fadfc3e help sign in
rel8/src/Rel8/Expr/Bool.hs
68 lines 1.5 kB history raw
1module Rel8.Expr.Bool
2 ( false, true
3 , (&&.), (||.), not_
4 , and_, or_
5 , boolExpr
6 , caseExpr
7 , coalesce
8 )
9where
11-- base
12import Data.Foldable ( foldl' )
13import Prelude hiding ( null )
15-- opaleye
16import qualified Opaleye.Internal.HaskellDB.PrimQuery as Opaleye
18-- rel8
19import {-# SOURCE #-} Rel8.Expr ( Expr( Expr ) )
20import Rel8.Expr.Opaleye ( mapPrimExpr, zipPrimExprsWith )
21import Rel8.Expr.Serialize ( litExpr )
24false :: Expr Bool
25false = litExpr False
28true :: Expr Bool
29true = litExpr True
32(&&.) :: Expr Bool -> Expr Bool -> Expr Bool
33(&&.) = zipPrimExprsWith (Opaleye.BinExpr Opaleye.OpAnd)
34infixr 3 &&.
37(||.) :: Expr Bool -> Expr Bool -> Expr Bool
38(||.) = zipPrimExprsWith (Opaleye.BinExpr Opaleye.OpOr)
39infixr 2 ||.
42not_ :: Expr Bool -> Expr Bool
43not_ = mapPrimExpr (Opaleye.UnExpr Opaleye.OpNot)
46and_ :: Foldable f => f (Expr Bool) -> Expr Bool
47and_ = foldl' (&&.) true
50or_ :: Foldable f => f (Expr Bool) -> Expr Bool
51or_ = foldl' (||.) false
54boolExpr :: Expr a -> Expr a -> Expr Bool -> Expr a
55boolExpr ifFalse ifTrue condition = caseExpr [(condition, ifTrue)] ifFalse
58caseExpr :: [(Expr Bool, Expr a)] -> Expr a -> Expr a
59caseExpr branches (Expr fallback) =
60 Expr $ Opaleye.CaseExpr (map go branches) fallback
61 where
62 go (Expr condition, Expr value) = (condition, value)
65coalesce :: Expr (Maybe Bool) -> Expr Bool
66coalesce (Expr a) = Expr a &&. Expr (Opaleye.FunExpr "COALESCE" [a, untrue])
67 where
68 untrue = Opaleye.ConstExpr (Opaleye.BoolLit False)