{-# language FlexibleContexts #-}
{-# language TypeFamilies #-}
{-# language ViewPatterns #-}
module Rel8.Table.Bool
( bool
, case_
, nullable
)
where
import Prelude
import Rel8.Expr ( Expr )
import Rel8.Expr.Bool ( boolExpr, caseExpr )
import Rel8.Expr.Null ( isNull, unsafeUnnullify )
import Rel8.Schema.HTable ( htabulate, hfield )
import Rel8.Table ( Table, fromColumns, toColumns )
bool :: Table Expr a => a -> a -> Expr Bool -> a
bool :: forall a. Table Expr a => a -> a -> Expr Bool -> a
bool (forall (context :: Context) a.
Table context a =>
a -> Columns a context
toColumns -> Columns a Expr
false) (forall (context :: Context) a.
Table context a =>
a -> Columns a context
toColumns -> Columns a Expr
true) Expr Bool
condition =
forall (context :: Context) a.
Table context a =>
Columns a context -> a
fromColumns forall a b. (a -> b) -> a -> b
$ forall (t :: HTable) (context :: Context).
HTable t =>
(forall a. HField t a -> context a) -> t context
htabulate forall a b. (a -> b) -> a -> b
$ \HField (Columns a) a
field ->
case (forall (t :: HTable) (context :: Context) a.
HTable t =>
t context -> HField t a -> context a
hfield Columns a Expr
false HField (Columns a) a
field, forall (t :: HTable) (context :: Context) a.
HTable t =>
t context -> HField t a -> context a
hfield Columns a Expr
true HField (Columns a) a
field) of
(Expr a
falseExpr, Expr a
trueExpr) -> forall a. Expr a -> Expr a -> Expr Bool -> Expr a
boolExpr Expr a
falseExpr Expr a
trueExpr Expr Bool
condition
{-# INLINABLE bool #-}
case_ :: Table Expr a => [(Expr Bool, a)] -> a -> a
case_ :: forall a. Table Expr a => [(Expr Bool, a)] -> a -> a
case_ (forall a b. (a -> b) -> [a] -> [b]
map (forall (f :: Context) a b. Functor f => (a -> b) -> f a -> f b
fmap forall (context :: Context) a.
Table context a =>
a -> Columns a context
toColumns) -> [(Expr Bool, Columns a Expr)]
branches) (forall (context :: Context) a.
Table context a =>
a -> Columns a context
toColumns -> Columns a Expr
fallback) =
forall (context :: Context) a.
Table context a =>
Columns a context -> a
fromColumns forall a b. (a -> b) -> a -> b
$ forall (t :: HTable) (context :: Context).
HTable t =>
(forall a. HField t a -> context a) -> t context
htabulate forall a b. (a -> b) -> a -> b
$ \HField (Columns a) a
field -> case forall (t :: HTable) (context :: Context) a.
HTable t =>
t context -> HField t a -> context a
hfield Columns a Expr
fallback HField (Columns a) a
field of
Expr a
fallbackExpr ->
case forall a b. (a -> b) -> [a] -> [b]
map (forall (f :: Context) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall (t :: HTable) (context :: Context) a.
HTable t =>
t context -> HField t a -> context a
`hfield` HField (Columns a) a
field)) [(Expr Bool, Columns a Expr)]
branches of
[(Expr Bool, Expr a)]
branchExprs -> forall a. [(Expr Bool, Expr a)] -> Expr a -> Expr a
caseExpr [(Expr Bool, Expr a)]
branchExprs Expr a
fallbackExpr
nullable :: Table Expr b => b -> (Expr a -> b) -> Expr (Maybe a) -> b
nullable :: forall b a.
Table Expr b =>
b -> (Expr a -> b) -> Expr (Maybe a) -> b
nullable b
b Expr a -> b
f Expr (Maybe a)
ma = forall a. Table Expr a => a -> a -> Expr Bool -> a
bool (Expr a -> b
f (forall a. Expr (Maybe a) -> Expr a
unsafeUnnullify Expr (Maybe a)
ma)) b
b (forall a. Expr (Maybe a) -> Expr Bool
isNull Expr (Maybe a)
ma)