on master help sign in
Remove Opaque constraint synonyms
593e21bShane O'Brien
rel8.cabal−2
@@ -114,7 +114,6 @@ library
114 Rel8.Schema.Kind
114 Rel8.Schema.Kind
115 Rel8.Schema.Name
115 Rel8.Schema.Name
116 Rel8.Schema.Nullability
116 Rel8.Schema.Nullability
117− Rel8.Schema.Nullability.Internal
118 Rel8.Schema.Spec
117 Rel8.Schema.Spec
119 Rel8.Schema.Spec.ConstrainDBType
118 Rel8.Schema.Spec.ConstrainDBType
120 Rel8.Schema.Spec.ConstrainType
119 Rel8.Schema.Spec.ConstrainType
@@ -164,7 +163,6 @@ library
164 Rel8.Type.Sum
163 Rel8.Type.Sum
165 Rel8.Type.Tag
164 Rel8.Type.Tag
166
165
167− Rel8.Opaque
168 Rel8.Schema.Structure
166 Rel8.Schema.Structure
169
167
170test-suite tests
168test-suite tests
src/Rel8/Aggregate.hs−2
@@ -32,7 +32,6 @@ import qualified Opaleye.Internal.PackMap as Opaleye
32
32
33-- rel8
33-- rel8
34import Rel8.Expr ( Expr, Col(..) )
34import Rel8.Expr ( Expr, Col(..) )
35−import Rel8.Opaque ( Opaque )
36import Rel8.Schema.Context ( Interpretation(..) )
35import Rel8.Schema.Context ( Interpretation(..) )
37import Rel8.Schema.Context.Label ( Labelable(..) )
36import Rel8.Schema.Context.Label ( Labelable(..) )
38import Rel8.Schema.HTable ( hfield, htabulate, htabulateA, hspecs )
37import Rel8.Schema.HTable ( hfield, htabulate, htabulateA, hspecs )
@@ -114,7 +113,6 @@ instance Labelable Aggregate where
114type Aggregates :: Type -> Type -> Constraint
113type Aggregates :: Type -> Type -> Constraint
115class Recontextualize Aggregate Expr aggregates exprs => Aggregates aggregates exprs
114class Recontextualize Aggregate Expr aggregates exprs => Aggregates aggregates exprs
116instance Recontextualize Aggregate Expr aggregates exprs => Aggregates aggregates exprs
115instance Recontextualize Aggregate Expr aggregates exprs => Aggregates aggregates exprs
117−instance {-# OVERLAPPING #-} Aggregates (Opaque Aggregate Opaque) (Opaque Expr Opaque)
118
116
119
117
120foldInputs :: Monoid b
118foldInputs :: Monoid b
src/Rel8/Aggregate/Legacy.hs−1
@@ -1,5 +1,4 @@
1{-# language FlexibleContexts #-}
1{-# language FlexibleContexts #-}
2−{-# language NamedFieldPuns #-}
3{-# language ScopedTypeVariables #-}
2{-# language ScopedTypeVariables #-}
4{-# language TypeApplications #-}
3{-# language TypeApplications #-}
5{-# language TypeFamilies #-}
4{-# language TypeFamilies #-}
src/Rel8/Expr.hs−1
@@ -3,7 +3,6 @@
3{-# language FlexibleInstances #-}
3{-# language FlexibleInstances #-}
4{-# language GADTs #-}
4{-# language GADTs #-}
5{-# language MultiParamTypeClasses #-}
5{-# language MultiParamTypeClasses #-}
6−{-# language NamedFieldPuns #-}
7{-# language RoleAnnotations #-}
6{-# language RoleAnnotations #-}
8{-# language ScopedTypeVariables #-}
7{-# language ScopedTypeVariables #-}
9{-# language StandaloneKindSignatures #-}
8{-# language StandaloneKindSignatures #-}
src/Rel8/Expr/Aggregate.hs−1
@@ -1,7 +1,6 @@
1{-# language DataKinds #-}
1{-# language DataKinds #-}
2{-# language FlexibleContexts #-}
2{-# language FlexibleContexts #-}
3{-# language ScopedTypeVariables #-}
3{-# language ScopedTypeVariables #-}
4−{-# language TypeApplications #-}
5{-# language TypeFamilies #-}
4{-# language TypeFamilies #-}
6
5
7{-# options_ghc -fno-warn-redundant-constraints #-}
6{-# options_ghc -fno-warn-redundant-constraints #-}
src/Rel8/Expr/Eq.hs−1
@@ -1,6 +1,5 @@
1{-# language FlexibleContexts #-}
1{-# language FlexibleContexts #-}
2{-# language GADTs #-}
2{-# language GADTs #-}
3−{-# language LambdaCase #-}
4{-# language ScopedTypeVariables #-}
3{-# language ScopedTypeVariables #-}
5{-# language TypeApplications #-}
4{-# language TypeApplications #-}
6{-# language ViewPatterns #-}
5{-# language ViewPatterns #-}
src/Rel8/Expr/Opaleye.hs−2
@@ -1,8 +1,6 @@
1{-# language FlexibleContexts #-}
1{-# language FlexibleContexts #-}
2−{-# language LambdaCase #-}
3{-# language NamedFieldPuns #-}
2{-# language NamedFieldPuns #-}
4{-# language ScopedTypeVariables #-}
3{-# language ScopedTypeVariables #-}
5−{-# language TypeApplications #-}
6{-# language TypeFamilies #-}
4{-# language TypeFamilies #-}
7
5
8{-# options_ghc -fno-warn-redundant-constraints #-}
6{-# options_ghc -fno-warn-redundant-constraints #-}
src/Rel8/Expr/Ord.hs−1
@@ -1,6 +1,5 @@
1{-# language DataKinds #-}
1{-# language DataKinds #-}
2{-# language FlexibleContexts #-}
2{-# language FlexibleContexts #-}
3−{-# language LambdaCase #-}
4{-# language GADTs #-}
3{-# language GADTs #-}
5{-# language ScopedTypeVariables #-}
4{-# language ScopedTypeVariables #-}
6{-# language TypeApplications #-}
5{-# language TypeApplications #-}
src/Rel8/Opaque.hsdeleted−15
@@ -1,15 +0,0 @@
1−{-# language PolyKinds #-}
2−{-# language StandaloneKindSignatures #-}
3−{-# language TypeFamilies #-}
4−
5−module Rel8.Opaque
6− ( Opaque
7− )
8−where
9−
10−-- base
11−import Prelude ()
12−
13−
14−type Opaque :: k
15−data family Opaque :: k
src/Rel8/Query.hs−1
@@ -1,4 +1,3 @@
1−{-# language DerivingStrategies #-}
2{-# language DerivingVia #-}
1{-# language DerivingVia #-}
3{-# language GeneralizedNewtypeDeriving #-}
2{-# language GeneralizedNewtypeDeriving #-}
4{-# language StandaloneKindSignatures #-}
3{-# language StandaloneKindSignatures #-}
src/Rel8/Query/Each.hs+1
@@ -1,4 +1,5 @@
1{-# language FlexibleContexts #-}
1{-# language FlexibleContexts #-}
2+{-# language MonoLocalBinds #-}
2
3
3module Rel8.Query.Each
4module Rel8.Query.Each
4 ( each
5 ( each
src/Rel8/Schema/Context/Nullify.hs−2
@@ -2,12 +2,10 @@
2{-# language FlexibleContexts #-}
2{-# language FlexibleContexts #-}
3{-# language FlexibleInstances #-}
3{-# language FlexibleInstances #-}
4{-# language InstanceSigs #-}
4{-# language InstanceSigs #-}
5−{-# language LambdaCase #-}
6{-# language MultiParamTypeClasses #-}
5{-# language MultiParamTypeClasses #-}
7{-# language NamedFieldPuns #-}
6{-# language NamedFieldPuns #-}
8{-# language ScopedTypeVariables #-}
7{-# language ScopedTypeVariables #-}
9{-# language StandaloneKindSignatures #-}
8{-# language StandaloneKindSignatures #-}
10−{-# language TypeApplications #-}
11{-# language TypeFamilies #-}
9{-# language TypeFamilies #-}
12
10
13module Rel8.Schema.Context.Nullify
11module Rel8.Schema.Context.Nullify
src/Rel8/Schema/HTable/Label.hs−2
@@ -6,14 +6,12 @@
6{-# language DataKinds #-}
6{-# language DataKinds #-}
7{-# language FlexibleInstances #-}
7{-# language FlexibleInstances #-}
8{-# language GADTs #-}
8{-# language GADTs #-}
9−{-# language InstanceSigs #-}
10{-# language MultiParamTypeClasses #-}
9{-# language MultiParamTypeClasses #-}
11{-# language QuantifiedConstraints #-}
10{-# language QuantifiedConstraints #-}
12{-# language RankNTypes #-}
11{-# language RankNTypes #-}
13{-# language RecordWildCards #-}
12{-# language RecordWildCards #-}
14{-# language ScopedTypeVariables #-}
13{-# language ScopedTypeVariables #-}
15{-# language StandaloneKindSignatures #-}
14{-# language StandaloneKindSignatures #-}
16−{-# language TypeApplications #-}
17{-# language TypeFamilies #-}
15{-# language TypeFamilies #-}
18{-# language TypeOperators #-}
16{-# language TypeOperators #-}
19{-# language UndecidableInstances #-}
17{-# language UndecidableInstances #-}
src/Rel8/Schema/HTable/Nullify.hs−3
@@ -7,14 +7,11 @@
7{-# language DataKinds #-}
7{-# language DataKinds #-}
8{-# language FlexibleInstances #-}
8{-# language FlexibleInstances #-}
9{-# language GADTs #-}
9{-# language GADTs #-}
10−{-# language InstanceSigs #-}
11{-# language MultiParamTypeClasses #-}
10{-# language MultiParamTypeClasses #-}
12{-# language QuantifiedConstraints #-}
11{-# language QuantifiedConstraints #-}
13{-# language RankNTypes #-}
12{-# language RankNTypes #-}
14−{-# language RecordWildCards #-}
15{-# language ScopedTypeVariables #-}
13{-# language ScopedTypeVariables #-}
16{-# language StandaloneKindSignatures #-}
14{-# language StandaloneKindSignatures #-}
17−{-# language TypeApplications #-}
18{-# language TypeFamilies #-}
15{-# language TypeFamilies #-}
19{-# language UndecidableInstances #-}
16{-# language UndecidableInstances #-}
20
17
src/Rel8/Schema/HTable/Vectorize.hs+4−6
@@ -1,14 +1,13 @@
1−{-# LANGUAGE DeriveAnyClass #-}
2−{-# LANGUAGE DeriveGeneric #-}
3−{-# LANGUAGE DerivingStrategies #-}
4−{-# LANGUAGE LambdaCase #-}
5{-# language AllowAmbiguousTypes #-}
1{-# language AllowAmbiguousTypes #-}
6{-# language ConstraintKinds #-}
2{-# language ConstraintKinds #-}
7{-# language DataKinds #-}
3{-# language DataKinds #-}
4+{-# language DeriveAnyClass #-}
5+{-# language DeriveGeneric #-}
6+{-# language DerivingStrategies #-}
8{-# language FlexibleContexts #-}
7{-# language FlexibleContexts #-}
9{-# language FlexibleInstances #-}
8{-# language FlexibleInstances #-}
10{-# language GADTs #-}
9{-# language GADTs #-}
11−{-# language InstanceSigs #-}
10+{-# language LambdaCase #-}
12{-# language MultiParamTypeClasses #-}
11{-# language MultiParamTypeClasses #-}
13{-# language NamedFieldPuns #-}
12{-# language NamedFieldPuns #-}
14{-# language QuantifiedConstraints #-}
13{-# language QuantifiedConstraints #-}
@@ -18,7 +17,6 @@
18{-# language StandaloneKindSignatures #-}
17{-# language StandaloneKindSignatures #-}
19{-# language TypeApplications #-}
18{-# language TypeApplications #-}
20{-# language TypeFamilies #-}
19{-# language TypeFamilies #-}
21−{-# language TypeOperators #-}
22{-# language UndecidableInstances #-}
20{-# language UndecidableInstances #-}
23
21
24module Rel8.Schema.HTable.Vectorize
22module Rel8.Schema.HTable.Vectorize
src/Rel8/Schema/Insert.hs−4
@@ -6,9 +6,7 @@
6{-# language LambdaCase #-}
6{-# language LambdaCase #-}
7{-# language MultiParamTypeClasses #-}
7{-# language MultiParamTypeClasses #-}
8{-# language NamedFieldPuns #-}
8{-# language NamedFieldPuns #-}
9−{-# language ScopedTypeVariables #-}
10{-# language StandaloneKindSignatures #-}
9{-# language StandaloneKindSignatures #-}
11−{-# language TypeApplications #-}
12{-# language TypeFamilies #-}
10{-# language TypeFamilies #-}
13{-# language UndecidableInstances #-}
11{-# language UndecidableInstances #-}
14{-# language UndecidableSuperClasses #-}
12{-# language UndecidableSuperClasses #-}
@@ -31,7 +29,6 @@ import Prelude
31import Rel8.Aggregate ( Aggregate )
29import Rel8.Aggregate ( Aggregate )
32import Rel8.Expr ( Expr )
30import Rel8.Expr ( Expr )
33import Rel8.Kind.Necessity ( Necessity(Optional, Required) )
31import Rel8.Kind.Necessity ( Necessity(Optional, Required) )
34−import Rel8.Opaque ( Opaque )
35import Rel8.Schema.Context ( Interpretation(..) )
32import Rel8.Schema.Context ( Interpretation(..) )
36import Rel8.Schema.Context.Label ( Labelable(..) )
33import Rel8.Schema.Context.Label ( Labelable(..) )
37import Rel8.Schema.Context.Nullify
34import Rel8.Schema.Context.Nullify
@@ -161,4 +158,3 @@ instance Nullifiable Insert where
161type Inserts :: Type -> Type -> Constraint
158type Inserts :: Type -> Type -> Constraint
162class Recontextualize Expr Insert exprs inserts => Inserts exprs inserts
159class Recontextualize Expr Insert exprs inserts => Inserts exprs inserts
163instance Recontextualize Expr Insert exprs inserts => Inserts exprs inserts
160instance Recontextualize Expr Insert exprs inserts => Inserts exprs inserts
164−instance {-# OVERLAPPING #-} Inserts (Opaque Expr Opaque) (Opaque Insert Opaque)
src/Rel8/Schema/Name.hs−4
@@ -5,9 +5,7 @@
5{-# language GeneralizedNewtypeDeriving #-}
5{-# language GeneralizedNewtypeDeriving #-}
6{-# language MultiParamTypeClasses #-}
6{-# language MultiParamTypeClasses #-}
7{-# language RankNTypes #-}
7{-# language RankNTypes #-}
8−{-# language ScopedTypeVariables #-}
9{-# language StandaloneKindSignatures #-}
8{-# language StandaloneKindSignatures #-}
10−{-# language TypeApplications #-}
11{-# language TypeFamilies #-}
9{-# language TypeFamilies #-}
12{-# language UndecidableInstances #-}
10{-# language UndecidableInstances #-}
13{-# language UndecidableSuperClasses #-}
11{-# language UndecidableSuperClasses #-}
@@ -27,7 +25,6 @@ import Prelude
27
25
28-- rel8
26-- rel8
29import Rel8.Expr ( Expr )
27import Rel8.Expr ( Expr )
30−import Rel8.Opaque ( Opaque )
31import Rel8.Schema.Context ( Interpretation, Col )
28import Rel8.Schema.Context ( Interpretation, Col )
32import Rel8.Schema.Context.Label ( Labelable, labeler, unlabeler )
29import Rel8.Schema.Context.Label ( Labelable, labeler, unlabeler )
33import Rel8.Schema.HTable.Type ( HType( HType ) )
30import Rel8.Schema.HTable.Type ( HType( HType ) )
@@ -85,4 +82,3 @@ instance Labelable Name where
85type Selects :: Type -> Type -> Constraint
82type Selects :: Type -> Type -> Constraint
86class Recontextualize Name Expr names exprs => Selects names exprs
83class Recontextualize Name Expr names exprs => Selects names exprs
87instance Recontextualize Name Expr names exprs => Selects names exprs
84instance Recontextualize Name Expr names exprs => Selects names exprs
88−instance {-# OVERLAPPING #-} Selects (Opaque Name Opaque) (Opaque Expr Opaque)
src/Rel8/Schema/Nullability.hs+117−8
@@ -1,22 +1,131 @@
1{-# language ConstraintKinds #-}
1{-# language ConstraintKinds #-}
2+{-# language DataKinds #-}
3+{-# language FlexibleContexts #-}
2{-# language FlexibleInstances #-}
4{-# language FlexibleInstances #-}
3−{-# language MonoLocalBinds #-}
5+{-# language GADTs #-}
4{-# language MultiParamTypeClasses #-}
6{-# language MultiParamTypeClasses #-}
7+{-# language RankNTypes #-}
8+{-# language StandaloneKindSignatures #-}
9+{-# language TypeFamilies #-}
5{-# language UndecidableInstances #-}
10{-# language UndecidableInstances #-}
6−
11+{-# language UndecidableSuperClasses #-}
7−{-# options_ghc -fno-warn-orphans #-}
8
12
9module Rel8.Schema.Nullability
13module Rel8.Schema.Nullability
10− ( module Rel8.Schema.Nullability.Internal
14+ ( Nullify, Unnullify
15+ , NotNull
16+ , Homonullable
17+ , Nullability( Nullable, NonNullable )
18+ , HasNullability, nullabilization
19+ , Sql, fromSql, mapSql, toSql
11 )
20 )
12where
21where
13
22
14-- base
23-- base
15−import Prelude ()
24+import Data.Kind ( Constraint, Type )
25+import Prelude
16
26
17-- rel8
27-- rel8
18−import Rel8.Opaque ( Opaque )
28+import Rel8.Schema.Dict ( Dict( Dict ) )
19−import Rel8.Schema.Nullability.Internal
29+
30+
31+type IsMaybe :: Type -> Bool
32+type family IsMaybe a where
33+ IsMaybe (Maybe _) = 'True
34+ IsMaybe _ = 'False
35+
36+
37+type Unnullify' :: Bool -> Type -> Type
38+type family Unnullify' isMaybe ma where
39+ Unnullify' 'False a = a
40+ Unnullify' 'True (Maybe a) = a
41+
42+
43+type Unnullify :: Type -> Type
44+type Unnullify a = Unnullify' (IsMaybe a) a
45+
46+
47+type Nullify' :: Bool -> Type -> Type
48+type family Nullify' isMaybe a where
49+ Nullify' 'False a = a
50+ Nullify' 'True a = Maybe a
51+
52+
53+type Nullify :: Type -> Type
54+type Nullify a = Maybe (Unnullify a)
55+
56+
57+-- | @nullify a@ means @a@ cannot take @null@ as a value.
58+type NotNull :: Type -> Constraint
59+class (HasNullability a, IsMaybe a ~ 'False) => NotNull a
60+instance (HasNullability a, IsMaybe a ~ 'False) => NotNull a
61+
62+
63+-- | @Homonullable a b@ means that both @a@ and @b@ can be @null@, or neither
64+-- @a@ or @b@ can be @null@.
65+type Homonullable :: Type -> Type -> Constraint
66+class IsMaybe a ~ IsMaybe b => Homonullable a b
67+instance IsMaybe a ~ IsMaybe b => Homonullable a b
68+
69+
70+type Nullability :: Type -> Type
71+data Nullability a where
72+ NonNullable :: NotNull a => Nullability a
73+ Nullable :: NotNull a => Nullability (Maybe a)
74+
75+
76+type HasNullability' :: Bool -> Type -> Constraint
77+class
78+ ( IsMaybe a ~ isMaybe
79+ , IsMaybe (Unnullify a) ~ 'False
80+ , Nullify' isMaybe (Unnullify a) ~ a
81+ ) => HasNullability' isMaybe a
82+ where
83+ nullabilization' :: Nullability a
84+
85+
86+instance IsMaybe a ~ 'False => HasNullability' 'False a where
87+ nullabilization' = NonNullable
88+
89+
90+instance IsMaybe a ~ 'False => HasNullability' 'True (Maybe a) where
91+ nullabilization' = Nullable
92+
93+
94+-- | @HasNullability a@ means that @rel8@ is able to check if the type @a@ is a
95+-- type that can take @null@ values or not.
96+type HasNullability :: Type -> Constraint
97+class HasNullability' (IsMaybe a) a => HasNullability a
98+instance HasNullability' (IsMaybe a) a => HasNullability a
99+
100+
101+nullabilization :: HasNullability a => Nullability a
102+nullabilization = nullabilization'
103+
104+
105+-- | The @Sql@ type class describes both null and not null database values,
106+-- constrained by a specific class.
107+--
108+-- For example, if you see @Sql DBEq a@, this means any database type that
109+-- supports equality, and @a@ can either be exactly an @a@, or it could also be
110+-- @Maybe a@.
111+type Sql :: (Type -> Constraint) -> Type -> Constraint
112+class (constraint (Unnullify a), HasNullability a) => Sql constraint a
113+instance (constraint (Unnullify a), HasNullability a) => Sql constraint a
114+
115+
116+fromSql :: Dict (Sql constraint) a -> (Nullability a, Dict constraint (Unnullify a))
117+fromSql Dict = (nullabilization, Dict)
118+{-# INLINABLE fromSql #-}
119+
120+
121+mapSql :: ()
122+ => (forall x. Dict constraint x -> Dict constraint' x)
123+ -> Dict (Sql constraint) a -> Dict (Sql constraint') a
124+mapSql f dict = case fromSql dict of
125+ (nullability, dict') -> toSql nullability (f dict')
20
126
21
127
22−instance {-# OVERLAPPING #-} (c Opaque, Sql c Opaque) => Sql c Opaque
128+toSql :: Nullability a -> Dict constraint (Unnullify a) -> Dict (Sql constraint) a
129+toSql NonNullable Dict = Dict
130+toSql Nullable Dict = Dict
131+{-# INLINABLE toSql #-}
src/Rel8/Schema/Nullability/Internal.hsdeleted−136
@@ -1,136 +0,0 @@
1−{-# language ConstraintKinds #-}
2−{-# language DataKinds #-}
3−{-# language FlexibleContexts #-}
4−{-# language FlexibleInstances #-}
5−{-# language FunctionalDependencies #-}
6−{-# language GADTs #-}
7−{-# language MultiParamTypeClasses #-}
8−{-# language RankNTypes #-}
9−{-# language StandaloneKindSignatures #-}
10−{-# language TypeFamilies #-}
11−{-# language UndecidableInstances #-}
12−{-# language UndecidableSuperClasses #-}
13−
14−module Rel8.Schema.Nullability.Internal
15− ( Nullify, Unnullify
16− , NotNull
17− , Homonullable
18− , Nullability( Nullable, NonNullable )
19− , HasNullability, nullabilization
20− , Sql, fromSql, mapSql, toSql
21− )
22−where
23−
24−-- base
25−import Data.Kind ( Constraint, Type )
26−import Prelude
27−
28−-- rel8
29−import Rel8.Opaque ( Opaque )
30−import Rel8.Schema.Dict ( Dict( Dict ) )
31−
32−
33−type IsMaybe :: Type -> Bool
34−type family IsMaybe a where
35− IsMaybe (Maybe _) = 'True
36− IsMaybe _ = 'False
37−
38−
39−type Unnullify' :: Bool -> Type -> Type
40−type family Unnullify' isMaybe ma where
41− Unnullify' 'False a = a
42− Unnullify' 'True (Maybe a) = a
43−
44−
45−type Unnullify :: Type -> Type
46−type Unnullify a = Unnullify' (IsMaybe a) a
47−
48−
49−type Nullify' :: Bool -> Type -> Type
50−type family Nullify' isMaybe a where
51− Nullify' 'False a = a
52− Nullify' 'True a = Maybe a
53−
54−
55−type Nullify :: Type -> Type
56−type Nullify a = Maybe (Unnullify a)
57−
58−
59−-- | @NotNull a@ means @a@ cannot take @null@ as a value.
60−type NotNull :: Type -> Constraint
61−class (HasNullability a, IsMaybe a ~ 'False) => NotNull a
62−instance (HasNullability a, IsMaybe a ~ 'False) => NotNull a
63−instance {-# OVERLAPPING #-} NotNull Opaque
64−
65−
66−-- | @Homonullable a b@ means that both @a@ and @b@ can be @null@, or neither
67−-- @a@ or @b@ can be @null@.
68−type Homonullable :: Type -> Type -> Constraint
69−class IsMaybe a ~ IsMaybe b => Homonullable a b
70−instance IsMaybe a ~ IsMaybe b => Homonullable a b
71−instance {-# OVERLAPPING #-} Homonullable Opaque Opaque
72−
73−
74−type Nullability :: Type -> Type
75−data Nullability a where
76− NonNullable :: NotNull a => Nullability a
77− Nullable :: NotNull a => Nullability (Maybe a)
78−
79−
80−type HasNullability' :: Bool -> Type -> Constraint
81−class
82− ( IsMaybe a ~ isMaybe
83− , IsMaybe (Unnullify a) ~ 'False
84− , Nullify' isMaybe (Unnullify a) ~ a
85− ) => HasNullability' isMaybe a
86− where
87− nullabilization' :: Nullability a
88−
89−
90−instance IsMaybe a ~ 'False => HasNullability' 'False a where
91− nullabilization' = NonNullable
92−
93−
94−instance IsMaybe a ~ 'False => HasNullability' 'True (Maybe a) where
95− nullabilization' = Nullable
96−
97−
98−-- | @HasNullability a@ means that @rel8@ is able to check if the type @a@ is a
99−-- type that can take @null@ values or not.
100−type HasNullability :: Type -> Constraint
101−class HasNullability' (IsMaybe a) a => HasNullability a
102−instance HasNullability' (IsMaybe a) a => HasNullability a
103−instance {-# OVERLAPPING #-} HasNullability Opaque
104−
105−
106−nullabilization :: HasNullability a => Nullability a
107−nullabilization = nullabilization'
108−
109−
110−-- | The @Sql@ type class describes both null and not null database values,
111−-- constrained by a specific class.
112−--
113−-- For example, if you see @Sql DBEq a@, this means any database type that
114−-- supports equality, and @a@ can either be exactly an @a@, or it could also be
115−-- @Maybe a@.
116−type Sql :: (Type -> Constraint) -> Type -> Constraint
117−class (constraint (Unnullify a), HasNullability a) => Sql constraint a
118−instance (constraint (Unnullify a), HasNullability a) => Sql constraint a
119−
120−
121−fromSql :: Dict (Sql constraint) a -> (Nullability a, Dict constraint (Unnullify a))
122−fromSql Dict = (nullabilization, Dict)
123−{-# INLINABLE fromSql #-}
124−
125−
126−mapSql :: ()
127− => (forall x. Dict constraint x -> Dict constraint' x)
128− -> Dict (Sql constraint) a -> Dict (Sql constraint') a
129−mapSql f dict = case fromSql dict of
130− (nullability, dict') -> toSql nullability (f dict')
131−
132−
133−toSql :: Nullability a -> Dict constraint (Unnullify a) -> Dict (Sql constraint) a
134−toSql NonNullable Dict = Dict
135−toSql Nullable Dict = Dict
136−{-# INLINABLE toSql #-}
src/Rel8/Statement/Select.hs+1
@@ -1,3 +1,4 @@
1+{-# language MonoLocalBinds #-}
1{-# language ScopedTypeVariables #-}
2{-# language ScopedTypeVariables #-}
2{-# language TypeApplications #-}
3{-# language TypeApplications #-}
3
4
src/Rel8/Statement/View.hs+1
@@ -1,4 +1,5 @@
1{-# language FlexibleContexts #-}
1{-# language FlexibleContexts #-}
2+{-# language MonoLocalBinds #-}
2
3
3module Rel8.Statement.View
4module Rel8.Statement.View
4 ( createView
5 ( createView
src/Rel8/Table.hs−18
@@ -20,8 +20,6 @@ import Data.Kind ( Constraint, Type )
20import Prelude
20import Prelude
21
21
22-- rel8
22-- rel8
23−import {-# SOURCE #-} Rel8.Expr ( Expr )
24−import Rel8.Opaque ( Opaque )
25import Rel8.Schema.Context ( Col(..) )
23import Rel8.Schema.Context ( Col(..) )
26import Rel8.Schema.Context.Label ( Labelable, labeler, unlabeler )
24import Rel8.Schema.Context.Label ( Labelable, labeler, unlabeler )
27import Rel8.Schema.HTable ( HTable )
25import Rel8.Schema.HTable ( HTable )
@@ -201,22 +199,6 @@ instance
201 )
199 )
202
200
203
201
204−instance Table Expr Opaque where
205− type Columns Opaque = HType Opaque
206− type Context Opaque = Expr
207−
208− fromColumns = error "opaque"
209− toColumns = error "opaque"
210−
211−
212−instance Table context (Opaque context a) where
213− type Columns (Opaque context a) = HType Opaque
214− type Context (Opaque context a) = context
215−
216− fromColumns = error "opaque"
217− toColumns = error "opaque"
218−
219−
220type Congruent :: Type -> Type -> Constraint
202type Congruent :: Type -> Type -> Constraint
221class Columns a ~ Columns b => Congruent a b
203class Columns a ~ Columns b => Congruent a b
222instance Columns a ~ Columns b => Congruent a b
204instance Columns a ~ Columns b => Congruent a b
src/Rel8/Table/Aggregate.hs−1
@@ -1,5 +1,4 @@
1{-# language FlexibleContexts #-}
1{-# language FlexibleContexts #-}
2−{-# language NamedFieldPuns #-}
3{-# language ScopedTypeVariables #-}
2{-# language ScopedTypeVariables #-}
4{-# language TypeApplications #-}
3{-# language TypeApplications #-}
5{-# language TypeFamilies #-}
4{-# language TypeFamilies #-}
src/Rel8/Table/Eq.hs−2
@@ -5,8 +5,6 @@
5{-# language DisambiguateRecordFields #-}
5{-# language DisambiguateRecordFields #-}
6{-# language FlexibleContexts #-}
6{-# language FlexibleContexts #-}
7{-# language FlexibleInstances #-}
7{-# language FlexibleInstances #-}
8−{-# language LambdaCase #-}
9−{-# language NamedFieldPuns #-}
10{-# language ScopedTypeVariables #-}
8{-# language ScopedTypeVariables #-}
11{-# language StandaloneKindSignatures #-}
9{-# language StandaloneKindSignatures #-}
12{-# language TypeApplications #-}
10{-# language TypeApplications #-}
src/Rel8/Table/Lifted.hs−1
@@ -1,4 +1,3 @@
1−{-# language ConstrainedClassMethods #-}
2{-# language ConstraintKinds #-}
1{-# language ConstraintKinds #-}
3{-# language DataKinds #-}
2{-# language DataKinds #-}
4{-# language FlexibleContexts #-}
3{-# language FlexibleContexts #-}
src/Rel8/Table/Ord.hs−1
@@ -3,7 +3,6 @@
3{-# language DefaultSignatures #-}
3{-# language DefaultSignatures #-}
4{-# language DisambiguateRecordFields #-}
4{-# language DisambiguateRecordFields #-}
5{-# language FlexibleInstances #-}
5{-# language FlexibleInstances #-}
6−{-# language NamedFieldPuns #-}
7{-# language ScopedTypeVariables #-}
6{-# language ScopedTypeVariables #-}
8{-# language StandaloneKindSignatures #-}
7{-# language StandaloneKindSignatures #-}
9{-# language TypeApplications #-}
8{-# language TypeApplications #-}
src/Rel8/Table/Order.hs−1
@@ -1,5 +1,4 @@
1{-# language DataKinds #-}
1{-# language DataKinds #-}
2−{-# language NamedFieldPuns #-}
3{-# language ScopedTypeVariables #-}
2{-# language ScopedTypeVariables #-}
4{-# language TypeApplications #-}
3{-# language TypeApplications #-}
5{-# language TypeFamilies #-}
4{-# language TypeFamilies #-}
src/Rel8/Table/Recontextualize.hs−44
@@ -17,13 +17,11 @@ import Data.Kind ( Constraint, Type )
17import Prelude ()
17import Prelude ()
18
18
19-- rel8
19-- rel8
20−import Rel8.Opaque ( Opaque )
21import Rel8.Schema.Context ( Col )
20import Rel8.Schema.Context ( Col )
22import Rel8.Schema.Context.Label ( Labelable )
21import Rel8.Schema.Context.Label ( Labelable )
23import Rel8.Schema.HTable ( HTable )
22import Rel8.Schema.HTable ( HTable )
24import qualified Rel8.Schema.Kind as K
23import qualified Rel8.Schema.Kind as K
25import Rel8.Schema.Nullability ( Sql )
24import Rel8.Schema.Nullability ( Sql )
26−import Rel8.Schema.Spec ( KnownSpec )
27import Rel8.Table ( Table, Congruent )
25import Rel8.Table ( Table, Congruent )
28import Rel8.Type ( DBType )
26import Rel8.Type ( DBType )
29
27
@@ -43,51 +41,9 @@ class
43 , b from -> a
41 , b from -> a
44
42
45
43
46−instance KnownSpec spec =>
47− Recontextualize from to (Col from spec) (Col to spec)
48−
49−
50−{-
51−instance Sql DBType a =>
52− Recontextualize Aggregate Insertion (Aggregate (Expr a)) (Insertion a)
53−
54−
55−instance Sql DBType a => Recontextualize Expr Insertion (Expr a) (Insertion a)
56−-}
57−
58−
59instance Sql DBType a => Recontextualize Identity Identity (Identity a) (Identity a)
44instance Sql DBType a => Recontextualize Identity Identity (Identity a) (Identity a)
60
45
61
46
62−{-
63−instance Sql DBType a =>
64− Recontextualize Identity Insertion (Identity a) (Insertion a)
65−
66−
67−instance Sql DBType a =>
68− Recontextualize Insertion Aggregate (Insertion a) (Aggregate (Expr a))
69−
70−
71−instance Sql DBType a => Recontextualize Insertion Expr (Insertion a) (Expr a)
72−
73−
74−instance Sql DBType a =>
75− Recontextualize Insertion Identity (Insertion a) (Identity a)
76−
77−
78−instance Sql DBType a => Recontextualize Insertion Insertion (Insertion a) (Insertion a)
79−
80−
81−instance Sql DBType a => Recontextualize Insertion Name (Insertion a) (Name a)
82−
83−
84−instance Sql DBType a => Recontextualize Name Insertion (Name a) (Insertion a)
85−-}
86−
87−
88−instance Recontextualize from to (Opaque from a) (Opaque to a)
89−
90−
91instance HTable t => Recontextualize from to (t (Col from)) (t (Col to))
47instance HTable t => Recontextualize from to (t (Col from)) (t (Col to))
92
48
93
49
src/Rel8/Table/Serialize.hs−1
@@ -9,7 +9,6 @@
9{-# language StandaloneKindSignatures #-}
9{-# language StandaloneKindSignatures #-}
10{-# language TypeApplications #-}
10{-# language TypeApplications #-}
11{-# language TypeFamilies #-}
11{-# language TypeFamilies #-}
12−{-# language ViewPatterns #-}
13{-# language UndecidableInstances #-}
12{-# language UndecidableInstances #-}
14
13
15module Rel8.Table.Serialize
14module Rel8.Table.Serialize
src/Rel8/Type.hs+3−14
@@ -1,8 +1,6 @@
1{-# language FlexibleInstances #-}
1{-# language FlexibleInstances #-}
2−{-# language MultiParamTypeClasses #-}
2+{-# language MonoLocalBinds #-}
3{-# language StandaloneKindSignatures #-}
3{-# language StandaloneKindSignatures #-}
4−{-# language TypeApplications #-}
5−{-# language UndecidableInstances #-}
6{-# language UndecidableInstances #-}
4{-# language UndecidableInstances #-}
7
5
8module Rel8.Type
6module Rel8.Type
@@ -37,10 +35,9 @@ import qualified Opaleye.Internal.HaskellDB.PrimQuery as Opaleye
37import qualified Opaleye.Internal.HaskellDB.Sql.Default as Opaleye ( quote )
35import qualified Opaleye.Internal.HaskellDB.Sql.Default as Opaleye ( quote )
38
36
39-- rel8
37-- rel8
40−import Rel8.Opaque ( Opaque )
41import Rel8.Schema.Nullability
38import Rel8.Schema.Nullability
42− ( NotNull, Unnullify
39+ ( NotNull
43− , HasNullability, nullabilization
40+ , nullabilization
44 , Sql
41 , Sql
45 )
42 )
46import Rel8.Type.Array ( listTypeInformation, nonEmptyTypeInformation )
43import Rel8.Type.Array ( listTypeInformation, nonEmptyTypeInformation )
@@ -283,11 +280,3 @@ instance Sql DBType a => DBType [a] where
283
280
284instance Sql DBType a => DBType (NonEmpty a) where
281instance Sql DBType a => DBType (NonEmpty a) where
285 typeInformation = nonEmptyTypeInformation nullabilization typeInformation
282 typeInformation = nonEmptyTypeInformation nullabilization typeInformation
286−
287−
288−instance {-# OVERLAPPING #-} DBType Opaque where
289− typeInformation = error "opaque"
290−
291−
292−instance {-# INCOHERENT #-} (HasNullability a, DBType (Unnullify a)) =>
293− Sql DBType a
src/Rel8/Type/Eq.hs+2−7
@@ -1,5 +1,6 @@
1{-# language FlexibleContexts #-}
1{-# language FlexibleContexts #-}
2{-# language FlexibleInstances #-}
2{-# language FlexibleInstances #-}
3+{-# language MonoLocalBinds #-}
3{-# language MultiParamTypeClasses #-}
4{-# language MultiParamTypeClasses #-}
4{-# language StandaloneKindSignatures #-}
5{-# language StandaloneKindSignatures #-}
5{-# language UndecidableInstances #-}
6{-# language UndecidableInstances #-}
@@ -26,8 +27,7 @@ import qualified Data.ByteString.Lazy as Lazy ( ByteString )
26import Data.CaseInsensitive ( CI )
27import Data.CaseInsensitive ( CI )
27
28
28-- rel8
29-- rel8
29−import Rel8.Opaque ( Opaque )
30−import Rel8.Schema.Nullability ( Unnullify, HasNullability, Sql )
30+import Rel8.Schema.Nullability ( Sql )
31import Rel8.Type ( DBType )
31import Rel8.Type ( DBType )
32
32
33-- scientific
33-- scientific
@@ -76,8 +76,3 @@ instance DBEq UUID
76instance DBEq Value
76instance DBEq Value
77instance Sql DBEq a => DBEq [a]
77instance Sql DBEq a => DBEq [a]
78instance Sql DBEq a => DBEq (NonEmpty a)
78instance Sql DBEq a => DBEq (NonEmpty a)
79−instance DBEq Opaque
80−
81−
82−instance {-# INCOHERENT #-} (HasNullability a, DBEq (Unnullify a)) =>
83− Sql DBEq a
src/Rel8/Type/Monoid.hs+1−8
@@ -27,10 +27,7 @@ import Data.CaseInsensitive ( CI )
27import {-# SOURCE #-} Rel8.Expr ( Expr )
27import {-# SOURCE #-} Rel8.Expr ( Expr )
28import Rel8.Expr.Array ( sempty )
28import Rel8.Expr.Array ( sempty )
29import Rel8.Expr.Serialize ( litExpr )
29import Rel8.Expr.Serialize ( litExpr )
30−import Rel8.Schema.Nullability
30+import Rel8.Schema.Nullability ( Sql, nullabilization )
31− ( Unnullify
32− , Sql, HasNullability, nullabilization
33− )
34import Rel8.Type ( DBType, typeInformation )
31import Rel8.Type ( DBType, typeInformation )
35import Rel8.Type.Semigroup ( DBSemigroup )
32import Rel8.Type.Semigroup ( DBSemigroup )
36
33
@@ -80,7 +77,3 @@ instance DBMonoid ByteString where
80
77
81instance DBMonoid Lazy.ByteString where
78instance DBMonoid Lazy.ByteString where
82 memptyExpr = litExpr ""
79 memptyExpr = litExpr ""
83−
84−
85−instance {-# INCOHERENT #-} (HasNullability a, DBMonoid (Unnullify a)) =>
86− Sql DBMonoid a
src/Rel8/Type/Num.hs−13
@@ -17,7 +17,6 @@ import Data.Kind ( Constraint, Type )
17import Prelude
17import Prelude
18
18
19-- rel8
19-- rel8
20−import Rel8.Schema.Nullability ( HasNullability, Unnullify, Sql )
21import Rel8.Type ( DBType )
20import Rel8.Type ( DBType )
22
21
23-- scientific
22-- scientific
@@ -36,10 +35,6 @@ instance DBNum Double
36instance DBNum Scientific
35instance DBNum Scientific
37
36
38
37
39−instance {-# INCOHERENT #-} (HasNullability a, DBNum (Unnullify a)) =>
40− Sql DBNum a
41−
42−
43-- | The class of database types that can be coerced to from integral
38-- | The class of database types that can be coerced to from integral
44-- expressions. This is a Rel8 concept, and allows us to provide
39-- expressions. This is a Rel8 concept, and allows us to provide
45-- 'fromIntegral'.
40-- 'fromIntegral'.
@@ -50,16 +45,8 @@ instance DBIntegral Int32
50instance DBIntegral Int64
45instance DBIntegral Int64
51
46
52
47
53−instance {-# INCOHERENT #-} (HasNullability a, DBIntegral (Unnullify a)) =>
54− Sql DBIntegral a
55−
56−
57-- | The class of database types that support the @/@ operator.
48-- | The class of database types that support the @/@ operator.
58class DBNum a => DBFractional a
49class DBNum a => DBFractional a
59instance DBFractional Float
50instance DBFractional Float
60instance DBFractional Double
51instance DBFractional Double
61instance DBFractional Scientific
52instance DBFractional Scientific
62−
63−
64−instance {-# INCOHERENT #-} (HasNullability a, DBFractional (Unnullify a)) =>
65− Sql DBFractional a
src/Rel8/Type/Ord.hs+2−15
@@ -1,5 +1,6 @@
1{-# language FlexibleContexts #-}
1{-# language FlexibleContexts #-}
2{-# language FlexibleInstances #-}
2{-# language FlexibleInstances #-}
3+{-# language MonoLocalBinds #-}
3{-# language MultiParamTypeClasses #-}
4{-# language MultiParamTypeClasses #-}
4{-# language StandaloneKindSignatures #-}
5{-# language StandaloneKindSignatures #-}
5{-# language UndecidableInstances #-}
6{-# language UndecidableInstances #-}
@@ -24,8 +25,7 @@ import qualified Data.ByteString.Lazy as Lazy ( ByteString )
24import Data.CaseInsensitive ( CI )
25import Data.CaseInsensitive ( CI )
25
26
26-- rel8
27-- rel8
27−import Rel8.Opaque ( Opaque )
28−import Rel8.Schema.Nullability ( Unnullify, Sql, HasNullability )
28+import Rel8.Schema.Nullability ( Sql )
29import Rel8.Type.Eq ( DBEq )
29import Rel8.Type.Eq ( DBEq )
30
30
31-- scientific
31-- scientific
@@ -70,11 +70,6 @@ instance DBOrd Lazy.ByteString
70instance DBOrd UUID
70instance DBOrd UUID
71instance Sql DBOrd a => DBOrd [a]
71instance Sql DBOrd a => DBOrd [a]
72instance Sql DBOrd a => DBOrd (NonEmpty a)
72instance Sql DBOrd a => DBOrd (NonEmpty a)
73−instance {-# OVERLAPPING #-} DBOrd Opaque
74−
75−
76−instance {-# INCOHERENT #-} (HasNullability a, DBOrd (Unnullify a)) =>
77− Sql DBOrd a
78
73
79
74
80-- | The class of database types that support the @max@ aggregation function.
75-- | The class of database types that support the @max@ aggregation function.
@@ -103,10 +98,6 @@ instance Sql DBMax a => DBMax [a]
103instance Sql DBMax a => DBMax (NonEmpty a)
98instance Sql DBMax a => DBMax (NonEmpty a)
104
99
105
100
106−instance {-# INCOHERENT #-} (HasNullability a, DBMax (Unnullify a)) =>
107− Sql DBMax a
108−
109−
110-- | The class of database types that support the @min@ aggregation function.
101-- | The class of database types that support the @min@ aggregation function.
111type DBMin :: Type -> Constraint
102type DBMin :: Type -> Constraint
112class DBOrd a => DBMin a
103class DBOrd a => DBMin a
@@ -131,7 +122,3 @@ instance DBMin ByteString
131instance DBMin Lazy.ByteString
122instance DBMin Lazy.ByteString
132instance Sql DBMin a => DBMin [a]
123instance Sql DBMin a => DBMin [a]
133instance Sql DBMin a => DBMin (NonEmpty a)
124instance Sql DBMin a => DBMin (NonEmpty a)
134−
135−
136−instance {-# INCOHERENT #-} (HasNullability a, DBMin (Unnullify a)) =>
137− Sql DBMin a
src/Rel8/Type/Semigroup.hs+1−7
@@ -2,9 +2,7 @@
2{-# language FlexibleContexts #-}
2{-# language FlexibleContexts #-}
3{-# language FlexibleInstances #-}
3{-# language FlexibleInstances #-}
4{-# language MultiParamTypeClasses #-}
4{-# language MultiParamTypeClasses #-}
5−{-# language ScopedTypeVariables #-}
6{-# language StandaloneKindSignatures #-}
5{-# language StandaloneKindSignatures #-}
7−{-# language TypeApplications #-}
8{-# language TypeFamilies #-}
6{-# language TypeFamilies #-}
9{-# language UndecidableInstances #-}
7{-# language UndecidableInstances #-}
10
8
@@ -31,7 +29,7 @@ import qualified Opaleye.Internal.HaskellDB.PrimQuery as Opaleye
31-- rel8
29-- rel8
32import {-# SOURCE #-} Rel8.Expr ( Expr )
30import {-# SOURCE #-} Rel8.Expr ( Expr )
33import Rel8.Expr.Opaleye ( zipPrimExprsWith )
31import Rel8.Expr.Opaleye ( zipPrimExprsWith )
34−import Rel8.Schema.Nullability ( Unnullify, Sql, HasNullability )
32+import Rel8.Schema.Nullability ( Sql )
35import Rel8.Type ( DBType )
33import Rel8.Type ( DBType )
36
34
37-- text
35-- text
@@ -85,7 +83,3 @@ instance DBSemigroup ByteString where
85
83
86instance DBSemigroup Lazy.ByteString where
84instance DBSemigroup Lazy.ByteString where
87 (<>.) = zipPrimExprsWith (Opaleye.BinExpr (Opaleye.:||))
85 (<>.) = zipPrimExprsWith (Opaleye.BinExpr (Opaleye.:||))
88−
89−
90−instance {-# INCOHERENT #-} (HasNullability a, DBSemigroup (Unnullify a)) =>
91− Sql DBSemigroup a
src/Rel8/Type/String.hs−5
@@ -21,7 +21,6 @@ import qualified Data.ByteString.Lazy as Lazy ( ByteString )
21import Data.CaseInsensitive ( CI )
21import Data.CaseInsensitive ( CI )
22
22
23-- rel8
23-- rel8
24−import Rel8.Schema.Nullability ( HasNullability, Unnullify, Sql )
25import Rel8.Type ( DBType )
24import Rel8.Type ( DBType )
26
25
27-- text
26-- text
@@ -39,7 +38,3 @@ instance DBString (CI Text)
39instance DBString (CI Lazy.Text)
38instance DBString (CI Lazy.Text)
40instance DBString ByteString
39instance DBString ByteString
41instance DBString Lazy.ByteString
40instance DBString Lazy.ByteString
42−
43−
44−instance {-# INCOHERENT #-} (HasNullability a, DBString (Unnullify a)) =>
45− Sql DBString a
src/Rel8/Type/Sum.hs−5
@@ -17,7 +17,6 @@ import Data.Kind ( Constraint, Type )
17import Prelude
17import Prelude
18
18
19-- rel8
19-- rel8
20−import Rel8.Schema.Nullability ( HasNullability, Unnullify, Sql )
21import Rel8.Type ( DBType )
20import Rel8.Type ( DBType )
22
21
23-- scientific
22-- scientific
@@ -37,7 +36,3 @@ instance DBSum Float
37instance DBSum Double
36instance DBSum Double
38instance DBSum Scientific
37instance DBSum Scientific
39instance DBSum CalendarDiffTime
38instance DBSum CalendarDiffTime
40−
41−
42−instance {-# INCOHERENT #-} (HasNullability a, DBSum (Unnullify a)) =>
43− Sql DBSum a