1{-# LANGUAGE DeriveAnyClass #-}
2{-# LANGUAGE DerivingStrategies #-}
3{-# LANGUAGE DeriveGeneric #-}
4{-# LANGUAGE NamedFieldPuns #-}
5{-# LANGUAGE LambdaCase #-}
6{-# language ConstraintKinds #-}
7{-# language DataKinds #-}
8{-# language FlexibleInstances #-}
10{-# language InstanceSigs #-}
11{-# language MultiParamTypeClasses #-}
12{-# language QuantifiedConstraints #-}
13{-# language RankNTypes #-}
14{-# language RecordWildCards #-}
15{-# language ScopedTypeVariables #-}
16{-# language StandaloneKindSignatures #-}
17{-# language TypeApplications #-}
18{-# language TypeFamilies #-}
19{-# language UndecidableInstances #-}
21module Rel8.Schema.HTable.Nullify
22 ( HNullify( HNullify )
24 , hnulls, hnullify, hunnullify
29import Prelude hiding ( null )
32import Rel8.Schema.HTable
34 , hfield, htabulate, htabulateA, hspecs
36import qualified Rel8.Schema.Kind as K
37import Rel8.Schema.Nullability ( Nullability( Nullable, NonNullable ) )
38import Rel8.Schema.Spec ( Spec( Spec ), SSpec(..) )
41import Data.Functor.Apply ( Apply )
42import Rel8.Schema.HTable.MapTable
44import GHC.Generics (Generic)
47type HNullify :: K.HTable -> K.HTable
48newtype HNullify table context = HNullify (HMapTable Nullify table context)
49 deriving stock Generic
50 deriving anyclass HTable
54-- | Transform a 'Spec' by allowing it to be @null@.
55data Nullify :: Spec -> Exp Spec
58type instance Eval (Nullify ('Spec labels necessity dbType _)) =
59 'Spec labels necessity dbType (Maybe dbType)
62instance MapSpec Nullify where
64 SSpec{labels, necessity, info, nullability} -> SSpec
68 , nullability = case nullability of
70 NonNullable -> Nullable
75 => (forall labels necessity dbType. ()
76 => context ('Spec labels necessity dbType (Maybe dbType)))
78hnulls null = HNullify $ htabulate $ \(HMapTableField field) -> case hfield hspecs field of
80{-# INLINABLE hnulls #-}
84 => (forall labels necessity dbType a. ()
85 => SSpec ('Spec labels necessity dbType a)
86 -> context ('Spec labels necessity dbType a)
87 -> context ('Spec labels necessity dbType (Maybe dbType)))
90hnullify nullifier a = HNullify $ htabulate $ \(HMapTableField field) ->
91 case hfield hspecs field of
92 spec@SSpec {} -> nullifier spec (hfield a field)
93{-# INLINABLE hnullify #-}
96hunnullify :: (HTable t, Apply m)
97 => (forall labels necessity dbType a. ()
98 => SSpec ('Spec labels necessity dbType a)
99 -> context ('Spec labels necessity dbType (Maybe dbType))
100 -> m (context ('Spec labels necessity dbType a)))
101 -> HNullify t context
103hunnullify unnullifier (HNullify as) =
104 htabulateA $ \field -> case hfield hspecs field of
105 spec@SSpec {} -> case hfield as (HMapTableField field) of
106 a -> unnullifier spec a
107{-# INLINABLE hunnullify #-}
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list