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 MultiParamTypeClasses #-}
11{-# language QuantifiedConstraints #-}
12{-# language RankNTypes #-}
13{-# language ScopedTypeVariables #-}
14{-# language StandaloneKindSignatures #-}
15{-# language TypeFamilies #-}
16{-# language UndecidableInstances #-}
18module Rel8.Schema.HTable.Nullify
19 ( HNullify( HNullify )
21 , hnulls, hnullify, hunnullify
26import Prelude hiding ( null )
29import Rel8.Schema.HTable
31 , hfield, htabulate, htabulateA, hspecs
33import qualified Rel8.Schema.Kind as K
34import Rel8.Schema.Nullability ( Nullability( Nullable, NonNullable ) )
35import qualified Rel8.Schema.Nullability as Type ( Nullify )
36import Rel8.Schema.Spec ( Spec( Spec ), SSpec(..) )
39import Data.Functor.Apply ( Apply )
40import Rel8.Schema.HTable.MapTable
42import GHC.Generics (Generic)
45type HNullify :: K.HTable -> K.HTable
46newtype HNullify table context = HNullify (HMapTable Nullify table context)
47 deriving stock Generic
48 deriving anyclass HTable
52-- | Transform a 'Spec' by allowing it to be @null@.
53data Nullify :: Spec -> Exp Spec
56type instance Eval (Nullify ('Spec labels necessity a)) =
57 'Spec labels necessity (Type.Nullify a)
60instance MapSpec Nullify where
62 SSpec{labels, necessity, info, nullability} -> SSpec
66 , nullability = case nullability of
68 NonNullable -> Nullable
73 => (forall labels necessity a. ()
74 => context ('Spec labels necessity (Maybe a)))
76hnulls null = HNullify $ htabulate $ \(HMapTableField field) -> case hfield hspecs field of
78{-# INLINABLE hnulls #-}
82 => (forall labels necessity a. ()
83 => SSpec ('Spec labels necessity a)
84 -> context ('Spec labels necessity a)
85 -> context ('Spec labels necessity (Type.Nullify a)))
88hnullify nullifier a = HNullify $ htabulate $ \(HMapTableField field) ->
89 case hfield hspecs field of
90 spec@SSpec {} -> nullifier spec (hfield a field)
91{-# INLINABLE hnullify #-}
94hunnullify :: (HTable t, Apply m)
95 => (forall labels necessity a. ()
96 => SSpec ('Spec labels necessity a)
97 -> context ('Spec labels necessity (Type.Nullify a))
98 -> m (context ('Spec labels necessity a)))
101hunnullify unnullifier (HNullify as) =
102 htabulateA $ \field -> case hfield hspecs field of
103 spec@SSpec {} -> case hfield as (HMapTableField field) of
104 a -> unnullifier spec a
105{-# 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