on fadfc3e help sign in
rel8/src/Rel8/Expr/Null.hs
87 lines 2.5 kB history raw
1{-# language DataKinds #-}
2{-# language FlexibleContexts #-}
3{-# language TypeFamilies #-}
5{-# options -fno-warn-redundant-constraints #-}
7module Rel8.Expr.Null
8 ( null, snull, nullable, nullableOf
9 , isNull, isNonNull
10 , nullify, unsafeUnnullify
11 , mapNullable, liftOpNullable
12 , unsafeMapNullable, unsafeLiftOpNullable
13 )
14where
16-- base
17import Prelude hiding ( null )
19-- opaleye
20import qualified Opaleye.Internal.HaskellDB.PrimQuery as Opaleye
22-- rel8
23import {-# SOURCE #-} Rel8.Expr ( Expr( Expr ) )
24import Rel8.Expr.Bool ( (||.), boolExpr )
25import Rel8.Expr.Opaleye ( scastExpr, mapPrimExpr )
26import Rel8.Schema.Nullability ( Nullability( Nullable ), IsMaybe )
27import Rel8.Type ( DBType, typeInformation )
28import Rel8.Type.Information ( TypeInformation )
31nullify :: IsMaybe a ~ 'False => Expr a -> Expr (Maybe a)
32nullify (Expr a) = Expr a
35unsafeUnnullify :: Expr (Maybe a) -> Expr a
36unsafeUnnullify (Expr a) = Expr a
39nullable :: Expr b -> (Expr a -> Expr b) -> Expr (Maybe a) -> Expr b
40nullable b f ma = boolExpr (f (unsafeUnnullify ma)) b (isNull ma)
43nullableOf :: (IsMaybe a ~ 'False, DBType a)
44 => Maybe (Expr a) -> Expr (Maybe a)
45nullableOf = maybe null nullify
48isNull :: Expr (Maybe a) -> Expr Bool
49isNull = mapPrimExpr (Opaleye.UnExpr Opaleye.OpIsNull)
52isNonNull :: Expr (Maybe a) -> Expr Bool
53isNonNull = mapPrimExpr (Opaleye.UnExpr Opaleye.OpIsNotNull)
56mapNullable :: (IsMaybe b ~ 'False, DBType b)
57 => (Expr a -> Expr b) -> Expr (Maybe a) -> Expr (Maybe b)
58mapNullable f ma = boolExpr (unsafeMapNullable f ma) null (isNull ma)
61liftOpNullable :: (IsMaybe c ~ 'False, DBType c)
62 => (Expr a -> Expr b -> Expr c)
63 -> Expr (Maybe a) -> Expr (Maybe b) -> Expr (Maybe c)
64liftOpNullable f ma mb =
65 boolExpr (unsafeLiftOpNullable f ma mb) null
66 (isNull ma ||. isNull mb)
69snull :: Nullability a (Maybe a) -> TypeInformation a -> Expr (Maybe a)
70snull nullability info =
71 scastExpr nullability info $ Expr $ Opaleye.ConstExpr Opaleye.NullLit
74null :: (IsMaybe a ~ 'False, DBType a) => Expr (Maybe a)
75null = snull Nullable typeInformation
78unsafeMapNullable :: IsMaybe b ~ 'False
79 => (Expr a -> Expr b) -> Expr (Maybe a) -> Expr (Maybe b)
80unsafeMapNullable f ma = nullify (f (unsafeUnnullify ma))
83unsafeLiftOpNullable :: IsMaybe c ~ 'False
84 => (Expr a -> Expr b -> Expr c)
85 -> Expr (Maybe a) -> Expr (Maybe b) -> Expr (Maybe c)
86unsafeLiftOpNullable f ma mb =
87 nullify (f (unsafeUnnullify ma) (unsafeUnnullify mb))