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 qualified Rel8.Schema.Nullability as Type ( Nullify )
39import Rel8.Schema.Spec ( Spec( Spec ), SSpec(..) )
42import Data.Functor.Apply ( Apply )
43import Rel8.Schema.HTable.MapTable
45import GHC.Generics (Generic)
48type HNullify :: K.HTable -> K.HTable
49newtype HNullify table context = HNullify (HMapTable Nullify table context)
50 deriving stock Generic
51 deriving anyclass HTable
55-- | Transform a 'Spec' by allowing it to be @null@.
56data Nullify :: Spec -> Exp Spec
59type instance Eval (Nullify ('Spec labels necessity a)) =
60 'Spec labels necessity (Type.Nullify a)
63instance MapSpec Nullify where
65 SSpec{labels, necessity, info, nullability} -> SSpec
69 , nullability = case nullability of
71 NonNullable -> Nullable
76 => (forall labels necessity a. ()
77 => context ('Spec labels necessity (Maybe a)))
79hnulls null = HNullify $ htabulate $ \(HMapTableField field) -> case hfield hspecs field of
81{-# INLINABLE hnulls #-}
85 => (forall labels necessity a. ()
86 => SSpec ('Spec labels necessity a)
87 -> context ('Spec labels necessity a)
88 -> context ('Spec labels necessity (Type.Nullify a)))
91hnullify nullifier a = HNullify $ htabulate $ \(HMapTableField field) ->
92 case hfield hspecs field of
93 spec@SSpec {} -> nullifier spec (hfield a field)
94{-# INLINABLE hnullify #-}
97hunnullify :: (HTable t, Apply m)
98 => (forall labels necessity a. ()
99 => SSpec ('Spec labels necessity a)
100 -> context ('Spec labels necessity (Type.Nullify a))
101 -> m (context ('Spec labels necessity a)))
102 -> HNullify t context
104hunnullify unnullifier (HNullify as) =
105 htabulateA $ \field -> case hfield hspecs field of
106 spec@SSpec {} -> case hfield as (HMapTableField field) of
107 a -> unnullifier spec a
108{-# 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