on master help sign in
Allow the derivation of Rel8able on vanilla HKDs (#111)
commit119c825e552b9ee3728992f545afda61e07d7625 authorShane <shane.obrien@circuithub.com> dateWed 7 Jul 2021, 16:05 (5 years ago) parentf47423e
13 files changed+376−356
rel8.cabal−1 src/Rel8/Generic/Rel8able.hs+115−64 src/Rel8/Generic/Table.hs+26−27 src/Rel8/Generic/Table/ADT.hs+56−59 src/Rel8/Generic/Table/Record.hs+78−50 src/Rel8/Schema/Context/Virtual.hs−70 src/Rel8/Table.hs+38−24 src/Rel8/Table/ADT.hs+13−25 src/Rel8/Table/Eq.hs+3−9 src/Rel8/Table/HKD.hs+13−13 src/Rel8/Table/Ord.hs+3−9 src/Rel8/Table/Rel8able.hs+4−4 tests/Rel8/Generic/Rel8able/Test.hs+27−1
rel8.cabal−1
@@ -115,7 +115,6 @@ library
115115 Rel8.Query.Values
116116
117117 Rel8.Schema.Context.Nullify
118− Rel8.Schema.Context.Virtual
119118 Rel8.Schema.Dict
120119 Rel8.Schema.HTable
121120 Rel8.Schema.HTable.Either
src/Rel8/Generic/Rel8able.hs+115−64
@@ -3,12 +3,14 @@
33{-# language DataKinds #-}
44{-# language DefaultSignatures #-}
55{-# language FlexibleContexts #-}
6+{-# language FlexibleInstances #-}
67{-# language LambdaCase #-}
8+{-# language MultiParamTypeClasses #-}
79{-# language ScopedTypeVariables #-}
810{-# language StandaloneKindSignatures #-}
911{-# language TypeApplications #-}
10−{-# language TypeFamilies #-}
1112{-# language TypeFamilyDependencies #-}
13+{-# language TypeOperators #-}
1214{-# language UndecidableInstances #-}
1315
1416module Rel8.Generic.Rel8able
@@ -17,31 +19,36 @@ module Rel8.Generic.Rel8able
1719 , GRep
1820 , GColumns, gfromColumns, gtoColumns
1921 , GFromExprs, gfromResult, gtoResult
22+ , TSerialize, serialize, deserialize
2023 )
2124where
2225
2326-- base
2427import Data.Kind ( Constraint, Type )
28+import Data.Type.Equality ( type (==) )
2529import GHC.Generics ( Generic, Rep, from, to )
2630import Prelude
2731
2832-- rel8
2933import Rel8.Aggregate ( Aggregate )
3034import Rel8.Expr ( Expr )
31−import Rel8.Generic.Map ( GMap )
35+import Rel8.FCF ( Exp, Eval )
3236import Rel8.Generic.Record ( Record(..) )
3337import Rel8.Generic.Table ( GAlgebra )
3438import qualified Rel8.Generic.Table.Record as G
3539import qualified Rel8.Kind.Algebra as K ( Algebra(..) )
36−import Rel8.Schema.Context.Virtual ( Abstract(..) )
40+import Rel8.Kind.Context ( SContext(..) )
3741import Rel8.Schema.HTable ( HTable )
3842import qualified Rel8.Schema.Kind as K
3943import Rel8.Schema.Name ( Name )
4044import Rel8.Schema.Result ( Result )
4145import Rel8.Table
42− ( fromColumns, toColumns, fromResult, toResult
43− , TTable, TColumns, TFromExprs
46+ ( Table, Columns, Context, fromColumns, toColumns
47+ , FromExprs, fromResult, toResult
48+ , Transpose
49+ , TTable, TColumns
4450 )
51+import Rel8.Table.Transpose ( Transposes )
4552
4653
4754-- | The kind of 'Rel8able' types
@@ -49,6 +56,40 @@ type KRel8able :: Type
4956type KRel8able = K.Rel8able
5057
5158
59+type Serialize :: Bool -> Type -> Type -> Constraint
60+class transposition ~ (a == Transpose Result expr) =>
61+ Serialize transposition expr a
62+ where
63+ serialize :: a -> Columns expr Result
64+ deserialize :: Columns expr Result -> a
65+
66+
67+instance
68+ ( (a == Transpose Result expr) ~ 'True
69+ , Transposes Expr Result expr a
70+ )
71+ => Serialize 'True expr a
72+ where
73+ serialize = toColumns
74+ deserialize = fromColumns
75+
76+
77+instance
78+ ( (a == Transpose Result expr) ~ 'False
79+ , Table (Context expr) expr
80+ , FromExprs expr ~ a
81+ )
82+ => Serialize 'False expr a
83+ where
84+ serialize = toResult @_ @expr
85+ deserialize = fromResult @_ @expr
86+
87+
88+data TSerialize :: Type -> Type -> Exp Constraint
89+type instance Eval (TSerialize expr a) =
90+ Serialize (a == Transpose Result expr) expr a
91+
92+
5293-- | This type class allows you to define custom 'Table's using higher-kinded
5394-- data types. Higher-kinded data types are data types of the pattern:
5495--
@@ -96,8 +137,8 @@ class HTable (GColumns t) => Rel8able t where
96137 type GColumns t :: K.HTable
97138 type GFromExprs t :: Type
98139
99− gfromColumns :: Abstract context -> GColumns t context -> t context
100− gtoColumns :: Abstract context -> t context -> GColumns t context
140+ gfromColumns :: SContext context -> GColumns t context -> t context
141+ gtoColumns :: SContext context -> t context -> GColumns t context
101142
102143 gfromResult :: GColumns t Result -> GFromExprs t
103144 gtoResult :: GFromExprs t -> GColumns t Result
@@ -106,62 +147,38 @@ class HTable (GColumns t) => Rel8able t where
106147 type GFromExprs t = t Result
107148
108149 default gfromColumns :: forall context.
109− ( VRel8able t Aggregate
110− , VRel8able t Expr
111− , VRel8able t Name
150+ ( SRel8able t Aggregate
151+ , SRel8able t Expr
152+ , SRel8able t Name
153+ , SSerialize t
112154 )
113− => Abstract context -> GColumns t context -> t context
155+ => SContext context -> GColumns t context -> t context
114156 gfromColumns = \case
115− VAggregate -> vfromColumns
116− VExpr -> vfromColumns
117− VName -> vfromColumns
157+ SAggregate -> sfromColumns
158+ SExpr -> sfromColumns
159+ SName -> sfromColumns
160+ SResult -> sfromResult
118161
119162 default gtoColumns :: forall context.
120− ( VRel8able t Aggregate
121− , VRel8able t Expr
122− , VRel8able t Name
163+ ( SRel8able t Aggregate
164+ , SRel8able t Expr
165+ , SRel8able t Name
166+ , SSerialize t
123167 )
124− => Abstract context -> t context -> GColumns t context
168+ => SContext context -> t context -> GColumns t context
125169 gtoColumns = \case
126− VAggregate -> vtoColumns
127− VExpr -> vtoColumns
128− VName -> vtoColumns
129−
130− default gfromResult ::
131− ( Generic (Record (t Result))
132− , G.GTable (TTable Expr) TColumns TFromExprs (GRep t Expr)
133− , G.GColumns TColumns (GRep t Expr) ~ GColumns t
134− , Rep (Record (t Result)) ~ GMap TFromExprs (GRep t Expr)
135− , GFromExprs t ~ t Result
136− )
170+ SAggregate -> stoColumns
171+ SExpr -> stoColumns
172+ SName -> stoColumns
173+ SResult -> stoResult
174+
175+ default gfromResult :: (SSerialize t, GFromExprs t ~ t Result)
137176 => GColumns t Result -> GFromExprs t
138− gfromResult =
139− unrecord .
140− to .
141− G.gfromResult
142− @(TTable Expr)
143− @TColumns
144− @TFromExprs
145− @(GRep t Expr)
146− (\(_ :: proxy x) -> fromResult @Expr @x)
147−
148− default gtoResult ::
149− ( Generic (Record (t Result))
150− , G.GTable (TTable Expr) TColumns TFromExprs (GRep t Expr)
151− , G.GColumns TColumns (GRep t Expr) ~ GColumns t
152− , Rep (Record (t Result)) ~ GMap TFromExprs (GRep t Expr)
153− , GFromExprs t ~ t Result
154− )
177+ gfromResult = sfromResult
178+
179+ default gtoResult :: (SSerialize t, GFromExprs t ~ t Result)
155180 => GFromExprs t -> GColumns t Result
156− gtoResult =
157− G.gtoResult
158− @(TTable Expr)
159− @TColumns
160− @TFromExprs
161− @(GRep t Expr)
162− (\(_ :: proxy x) -> toResult @Expr @x) .
163− from .
164− Record
181+ gtoResult = stoResult
165182
166183
167184type Algebra :: K.Rel8able -> K.Algebra
@@ -172,25 +189,59 @@ type GRep :: K.Rel8able -> K.Context -> Type -> Type
172189type GRep t context = Rep (Record (t context))
173190
174191
175−type VRel8able :: K.Rel8able -> K.Context -> Constraint
176−type VRel8able t context =
192+type SRel8able :: K.Rel8able -> K.Context -> Constraint
193+type SRel8able t context =
177194 ( Generic (Record (t context))
178− , G.GTable (TTable context) TColumns TFromExprs (GRep t context)
195+ , G.GTable (TTable context) TColumns (GRep t context)
179196 , G.GColumns TColumns (GRep t context) ~ GColumns t
180197 )
181198
182199
183−vfromColumns :: forall t context. VRel8able t context
200+type SSerialize :: K.Rel8able -> Constraint
201+type SSerialize t =
202+ ( Generic (Record (t Result))
203+ , G.GSerialize TSerialize TColumns (GRep t Expr) (GRep t Result)
204+ , G.GColumns TColumns (GRep t Expr) ~ GColumns t
205+ )
206+
207+
208+sfromColumns :: forall t context. SRel8able t context
184209 => GColumns t context -> t context
185−vfromColumns =
210+sfromColumns =
186211 unrecord .
187212 to .
188− G.gfromColumns @(TTable context) @TColumns @TFromExprs fromColumns
213+ G.gfromColumns @(TTable context) @TColumns fromColumns
189214
190215
191−vtoColumns :: forall t context. VRel8able t context
216+stoColumns :: forall t context. SRel8able t context
192217 => t context -> GColumns t context
193−vtoColumns =
194− G.gtoColumns @(TTable context) @TColumns @TFromExprs toColumns .
218+stoColumns =
219+ G.gtoColumns @(TTable context) @TColumns toColumns .
220+ from .
221+ Record
222+
223+
224+sfromResult :: forall t. SSerialize t
225+ => GColumns t Result -> t Result
226+sfromResult =
227+ unrecord .
228+ to .
229+ G.gfromResult
230+ @TSerialize
231+ @TColumns
232+ @(GRep t Expr)
233+ @(GRep t Result)
234+ (\(_ :: proxy x) -> deserialize @_ @x)
235+
236+
237+stoResult :: forall t. SSerialize t
238+ => t Result -> GColumns t Result
239+stoResult =
240+ G.gtoResult
241+ @TSerialize
242+ @TColumns
243+ @(GRep t Expr)
244+ @(GRep t Result)
245+ (\(_ :: proxy x) -> serialize @_ @x) .
195246 from .
196247 Record
src/Rel8/Generic/Table.hs+26−27
@@ -12,7 +12,7 @@
1212{-# language UndecidableInstances #-}
1313
1414module Rel8.Generic.Table
15− ( GGTable, GGColumns, ggfromResult, ggtoResult
15+ ( GGSerialize, GGColumns, ggfromResult, ggtoResult
1616 , GAlgebra
1717 )
1818where
@@ -24,11 +24,10 @@ import Prelude ()
2424
2525-- rel8
2626import Rel8.FCF ( Eval, Exp )
27−import Rel8.Generic.Map ( GMap )
2827import Rel8.Generic.Table.ADT
29− ( GTableADT, GColumnsADT, gtoResultADT, gfromResultADT
28+ ( GSerializeADT, GColumnsADT, gtoResultADT, gfromResultADT
3029 )
31−import Rel8.Generic.Table.Record ( GTable, GColumns, gtoResult, gfromResult )
30+import Rel8.Generic.Table.Record ( GSerialize, GColumns, gtoResult, gfromResult )
3231import Rel8.Kind.Algebra
3332 ( Algebra( Product, Sum )
3433 , SAlgebra( SProduct, SSum )
@@ -38,21 +37,21 @@ import qualified Rel8.Schema.Kind as K
3837import Rel8.Schema.Result ( Result )
3938
4039
41−data GGTable
40+data GGSerialize
4241 :: Algebra
43− -> (Type -> Exp Constraint)
42+ -> (Type -> Type -> Exp Constraint)
4443 -> (Type -> Exp K.HTable)
45− -> (Type -> Exp Type)
44+ -> (Type -> Type)
4645 -> (Type -> Type)
4746 -> Exp Constraint
4847
4948
50−type instance Eval (GGTable 'Product _Table _Columns _FromExprs rep) =
51− GTable _Table _Columns _FromExprs rep
49+type instance Eval (GGSerialize 'Product _Serialize _Columns exprs rep) =
50+ GSerialize _Serialize _Columns exprs rep
5251
5352
54−type instance Eval (GGTable 'Sum _Table _Columns _FromExprs rep) =
55− GTableADT _Table _Columns _FromExprs rep
53+type instance Eval (GGSerialize 'Sum _Serialize _Columns exprs rep) =
54+ GSerializeADT _Serialize _Columns exprs rep
5655
5756
5857data GGColumns
@@ -78,27 +77,27 @@ type family GAlgebra rep where
7877 GAlgebra (K1 _ _) = 'Product
7978
8079
81−ggfromResult :: forall algebra _Table _Columns _FromExprs rep x.
80+ggfromResult :: forall algebra _Serialize _Columns exprs rep x.
8281 ( KnownAlgebra algebra
83− , Eval (GGTable algebra _Table _Columns _FromExprs rep)
82+ , Eval (GGSerialize algebra _Serialize _Columns exprs rep)
8483 )
85− => (forall a proxy. Eval (_Table a)
86− => proxy a -> Eval (_Columns a) Result -> Eval (_FromExprs a))
87− -> Eval (GGColumns algebra _Columns rep) Result
88− -> GMap _FromExprs rep x
84+ => (forall expr a proxy. Eval (_Serialize expr a)
85+ => proxy expr -> Eval (_Columns expr) Result -> a)
86+ -> Eval (GGColumns algebra _Columns exprs) Result
87+ -> rep x
8988ggfromResult f x = case algebraSing @algebra of
90− SProduct -> gfromResult @_Table @_Columns @_FromExprs @rep f x
91− SSum -> gfromResultADT @_Table @_Columns @_FromExprs @rep f x
89+ SProduct -> gfromResult @_Serialize @_Columns @exprs @rep f x
90+ SSum -> gfromResultADT @_Serialize @_Columns @exprs @rep f x
9291
9392
94−ggtoResult :: forall algebra _Table _Columns _FromExprs rep x.
93+ggtoResult :: forall algebra _Serialize _Columns exprs rep x.
9594 ( KnownAlgebra algebra
96− , Eval (GGTable algebra _Table _Columns _FromExprs rep)
95+ , Eval (GGSerialize algebra _Serialize _Columns exprs rep)
9796 )
98− => (forall a proxy. Eval (_Table a)
99− => proxy a -> Eval (_FromExprs a) -> Eval (_Columns a) Result)
100− -> GMap _FromExprs rep x
101− -> Eval (GGColumns algebra _Columns rep) Result
97+ => (forall expr a proxy. Eval (_Serialize expr a)
98+ => proxy expr -> a -> Eval (_Columns expr) Result)
99+ -> rep x
100+ -> Eval (GGColumns algebra _Columns exprs) Result
102101ggtoResult f x = case algebraSing @algebra of
103− SProduct -> gtoResult @_Table @_Columns @_FromExprs @rep f x
104− SSum -> gtoResultADT @_Table @_Columns @_FromExprs @rep f x
102+ SProduct -> gtoResult @_Serialize @_Columns @exprs @rep f x
103+ SSum -> gtoResultADT @_Serialize @_Columns @exprs @rep f x
src/Rel8/Generic/Table/ADT.hs+56−59
@@ -12,8 +12,8 @@
1212{-# language UndecidableInstances #-}
1313
1414module Rel8.Generic.Table.ADT
15− ( GTableADT, GColumnsADT, gfromResultADT, gtoResultADT
16− , GTableADT', GColumnsADT'
15+ ( GSerializeADT, GColumnsADT, gfromResultADT, gtoResultADT
16+ , GSerializeADT', GColumnsADT'
1717 )
1818where
1919
@@ -31,8 +31,7 @@ import Prelude hiding ( null )
3131
3232-- rel8
3333import Rel8.FCF ( Eval, Exp )
34−import Rel8.Generic.Map ( GMap )
35−import Rel8.Generic.Table.Record ( GTable, GColumns, gfromResult, gtoResult )
34+import Rel8.Generic.Table.Record ( GSerialize, GColumns, gfromResult, gtoResult )
3635import Rel8.Schema.HTable ( HTable )
3736import Rel8.Schema.HTable.Identity ( HIdentity( HIdentity ) )
3837import Rel8.Schema.HTable.Label ( HLabel, hlabel, hunlabel )
@@ -65,120 +64,118 @@ type family GColumnsADT' _Columns htable rep where
6564 HProduct htable (HLabel label (HNullify (GColumns _Columns rep)))
6665
6766
68−type GTableADT
69− :: (Type -> Exp Constraint)
67+type GSerializeADT
68+ :: (Type -> Type -> Exp Constraint)
7069 -> (Type -> Exp K.HTable)
71− -> (Type -> Exp Type)
72− -> (Type -> Type) -> Constraint
73−class GTableADT _Table _Columns _FromExprs rep where
70+ -> (Type -> Type) -> (Type -> Type) -> Constraint
71+class GSerializeADT _Serialize _Columns exprs rep where
7472 gfromResultADT :: ()
75− => (forall a proxy. Eval (_Table a)
76− => proxy a -> Eval (_Columns a) Result -> Eval (_FromExprs a))
77− -> GColumnsADT _Columns rep Result
78− -> GMap _FromExprs rep x
73+ => (forall expr a proxy. Eval (_Serialize expr a)
74+ => proxy expr -> Eval (_Columns expr) Result -> a)
75+ -> GColumnsADT _Columns exprs Result
76+ -> rep x
7977
8078 gtoResultADT :: ()
81− => (forall a proxy. Eval (_Table a)
82− => proxy a -> Eval (_FromExprs a) -> Eval (_Columns a) Result)
83− -> GMap _FromExprs rep x
84− -> GColumnsADT _Columns rep Result
79+ => (forall expr a proxy. Eval (_Serialize expr a)
80+ => proxy expr -> a -> Eval (_Columns expr) Result)
81+ -> rep x
82+ -> GColumnsADT _Columns exprs Result
8583
8684
8785instance
8886 ( htable ~ HLabel "tag" (HIdentity Tag)
89− , GTableADT' _Table _Columns _FromExprs htable rep
87+ , GSerializeADT' _Serialize _Columns htable exprs rep
9088 )
91− => GTableADT _Table _Columns _FromExprs (M1 D meta rep)
89+ => GSerializeADT _Serialize _Columns (M1 D meta exprs) (M1 D meta rep)
9290 where
9391 gfromResultADT fromResult columns =
94− case gfromResultADT' @_Table @_Columns @_FromExprs @htable @rep fromResult tag columns of
92+ case gfromResultADT' @_Serialize @_Columns @htable @exprs @rep fromResult tag columns of
9593 Just rep -> M1 rep
9694 _ -> error "ADT.fromColumns: mismatch between tag and data"
9795 where
9896 tag = (\(HIdentity (Identity a)) -> a) . hunlabel @"tag"
9997
10098 gtoResultADT toResult (M1 rep) =
101− gtoResultADT' @_Table @_Columns @_FromExprs @htable @rep toResult tag (Just rep)
99+ gtoResultADT' @_Serialize @_Columns @htable @exprs @rep toResult tag (Just rep)
102100 where
103101 tag = hlabel @"tag" . HIdentity . Identity
104102
105103
106−type GTableADT'
107− :: (Type -> Exp Constraint)
104+type GSerializeADT'
105+ :: (Type -> Type -> Exp Constraint)
108106 -> (Type -> Exp K.HTable)
109− -> (Type -> Exp Type)
110− -> K.HTable -> (Type -> Type) -> Constraint
111−class GTableADT' _Table _Columns _FromExprs htable rep where
107+ -> K.HTable -> (Type -> Type) -> (Type -> Type) -> Constraint
108+class GSerializeADT' _Serialize _Columns htable exprs rep where
112109 gfromResultADT' :: context ~ Result
113− => (forall a proxy. Eval (_Table a)
114− => proxy a -> Eval (_Columns a) context -> Eval (_FromExprs a))
110+ => (forall expr a proxy. Eval (_Serialize expr a)
111+ => proxy expr -> Eval (_Columns expr) context -> a)
115112 -> (htable Result -> Tag)
116− -> GColumnsADT' _Columns htable rep context
117− -> Maybe (GMap _FromExprs rep x)
113+ -> GColumnsADT' _Columns htable exprs context
114+ -> Maybe (rep x)
118115
119116 gtoResultADT' :: context ~ Result
120− => (forall a proxy. Eval (_Table a)
121− => proxy a -> Eval (_FromExprs a) -> Eval (_Columns a) context)
117+ => (forall expr a proxy. Eval (_Serialize expr a)
118+ => proxy expr -> a -> Eval (_Columns expr) context)
122119 -> (Tag -> htable Result)
123− -> Maybe (GMap _FromExprs rep x)
124− -> GColumnsADT' _Columns htable rep context
120+ -> Maybe (rep x)
121+ -> GColumnsADT' _Columns htable exprs context
125122
126− extract :: GColumnsADT' _Columns htable rep context -> htable context
123+ extract :: GColumnsADT' _Columns htable exprs context -> htable context
127124
128125
129126instance
130− ( htable' ~ GColumnsADT' _Columns htable a
131− , GTableADT' _Table _Columns _FromExprs htable a
132− , GTableADT' _Table _Columns _FromExprs htable' b
127+ ( htable' ~ GColumnsADT' _Columns htable exprs1
128+ , GSerializeADT' _Serialize _Columns htable exprs1 a
129+ , GSerializeADT' _Serialize _Columns htable' exprs2 b
133130 )
134− => GTableADT' _Table _Columns _FromExprs htable (a :+: b)
131+ => GSerializeADT' _Serialize _Columns htable (exprs1 :+: exprs2) (a :+: b)
135132 where
136133 gfromResultADT' fromResult f columns =
137134 case ma of
138135 Just a -> Just (L1 a)
139136 Nothing -> R1 <$>
140− gfromResultADT' @_Table @_Columns @_FromExprs @_ @b
137+ gfromResultADT' @_Serialize @_Columns @_ @exprs2 @b
141138 fromResult
142− (f . extract @_Table @_Columns @_FromExprs @_ @a)
139+ (f . extract @_Serialize @_Columns @_ @exprs1 @a)
143140 columns
144141 where
145142 ma =
146− gfromResultADT' @_Table @_Columns @_FromExprs @_ @a
143+ gfromResultADT' @_Serialize @_Columns @_ @exprs1 @a
147144 fromResult
148145 f
149− (extract @_Table @_Columns @_FromExprs @_ @b columns)
146+ (extract @_Serialize @_Columns @_ @exprs2 @b columns)
150147
151148 gtoResultADT' toResult tag = \case
152149 Just (L1 a) ->
153− gtoResultADT' @_Table @_Columns @_FromExprs @_ @b
150+ gtoResultADT' @_Serialize @_Columns @_ @exprs2 @b
154151 toResult
155− (\_ -> gtoResultADT' @_Table @_Columns @_FromExprs @_ @a
152+ (\_ -> gtoResultADT' @_Serialize @_Columns @_ @exprs1 @a
156153 toResult
157154 tag
158155 (Just a))
159156 Nothing
160157 Just (R1 b) ->
161− gtoResultADT' @_Table @_Columns @_FromExprs @_ @b
158+ gtoResultADT' @_Serialize @_Columns @_ @exprs2 @b
162159 toResult
163160 (\tag' ->
164− gtoResultADT' @_Table @_Columns @_FromExprs @_ @a
161+ gtoResultADT' @_Serialize @_Columns @_ @exprs1 @a
165162 toResult
166163 (\_ -> tag tag')
167164 Nothing)
168165 (Just b)
169166 Nothing ->
170− gtoResultADT' @_Table @_Columns @_FromExprs @_ @b
167+ gtoResultADT' @_Serialize @_Columns @_ @exprs2 @b
171168 toResult
172− (\_ -> gtoResultADT' @_Table @_Columns @_FromExprs @_ @a toResult tag Nothing)
169+ (\_ -> gtoResultADT' @_Serialize @_Columns @_ @exprs1 @a toResult tag Nothing)
173170 Nothing
174171
175172 extract =
176− extract @_Table @_Columns @_FromExprs @_ @a .
177− extract @_Table @_Columns @_FromExprs @_ @b
173+ extract @_Serialize @_Columns @_ @exprs1 @a .
174+ extract @_Serialize @_Columns @_ @exprs2 @b
178175
179176
180177instance (meta ~ 'MetaCons label _fixity _isRecord, KnownSymbol label) =>
181− GTableADT' _Table _Columns _FromExprs htable (M1 C meta U1)
178+ GSerializeADT' _Serialize _Columns _htable (M1 C meta U1) (M1 C meta U1)
182179 where
183180 gfromResultADT' _ tag columns
184181 | tag columns == tag' = Just (M1 U1)
@@ -194,18 +191,18 @@ instance (meta ~ 'MetaCons label _fixity _isRecord, KnownSymbol label) =>
194191
195192
196193instance {-# OVERLAPPABLE #-}
197− ( HTable (GColumns _Columns rep)
198− , GTable _Table _Columns _FromExprs rep
194+ ( HTable (GColumns _Columns exprs)
195+ , GSerialize _Serialize _Columns exprs rep
199196 , meta ~ 'MetaCons label _fixity _isRecord
200197 , KnownSymbol label
201− , GColumnsADT' _Columns htable (M1 C ('MetaCons label _fixity _isRecord) rep) ~
202− HProduct htable (HLabel label (HNullify (GColumns _Columns rep)))
198+ , GColumnsADT' _Columns htable (M1 C ('MetaCons label _fixity _isRecord) exprs) ~
199+ HProduct htable (HLabel label (HNullify (GColumns _Columns exprs)))
203200 )
204− => GTableADT' _Table _Columns _FromExprs htable (M1 C meta rep)
201+ => GSerializeADT' _Serialize _Columns htable (M1 C meta exprs) (M1 C meta rep)
205202 where
206203 gfromResultADT' fromResult tag (HProduct a b)
207204 | tag a == tag' =
208− M1 . gfromResult @_Table @_Columns @_FromExprs @rep fromResult <$>
205+ M1 . gfromResult @_Serialize @_Columns @exprs @rep fromResult <$>
209206 hunnullify unnullifier (hunlabel b)
210207 | otherwise = Nothing
211208 where
@@ -216,7 +213,7 @@ instance {-# OVERLAPPABLE #-}
216213 Just (M1 rep) -> HProduct (tag tag') $
217214 hlabel $
218215 hnullify nullifier $
219− gtoResult @_Table @_Columns @_FromExprs @rep toResult rep
216+ gtoResult @_Serialize @_Columns @exprs @rep toResult rep
220217 where
221218 tag' = Tag $ pack $ symbolVal (Proxy @label)
222219
src/Rel8/Generic/Table/Record.hs+78−50
@@ -13,8 +13,8 @@
1313{-# language UndecidableInstances #-}
1414
1515module Rel8.Generic.Table.Record
16− ( GTable, GColumns, GContext
17− , gfromColumns, gtoColumns, gfromResult, gtoResult, gtable
16+ ( GTable, GColumns, GContext, gfromColumns, gtoColumns, gtable
17+ , GSerialize, gfromResult, gtoResult
1818 )
1919where
2020
@@ -30,7 +30,6 @@ import Prelude hiding ( null )
3030
3131-- rel8
3232import Rel8.FCF ( Eval, Exp )
33−import Rel8.Generic.Map ( GMap )
3433import Rel8.Schema.HTable.Label ( HLabel, hlabel, hunlabel )
3534import Rel8.Schema.HTable.Product ( HProduct(..) )
3635import qualified Rel8.Schema.Kind as K
@@ -56,9 +55,8 @@ type family GContext _Context rep where
5655type GTable
5756 :: (Type -> Exp Constraint)
5857 -> (Type -> Exp K.HTable)
59− -> (Type -> Exp Type)
6058 -> (Type -> Type) -> Constraint
61−class GTable _Table _Columns _FromExprs rep
59+class GTable _Table _Columns rep
6260 where
6361 gfromColumns :: ()
6462 => (forall a. Eval (_Table a) => Eval (_Columns a) context -> a)
@@ -70,73 +68,93 @@ class GTable _Table _Columns _FromExprs rep
7068 -> rep x
7169 -> GColumns _Columns rep context
7270
73− gfromResult :: ()
74− => (forall a proxy. Eval (_Table a)
75− => proxy a -> Eval (_Columns a) context -> Eval (_FromExprs a))
76− -> GColumns _Columns rep context
77− -> GMap _FromExprs rep x
78−
79− gtoResult :: ()
80− => (forall a proxy. Eval (_Table a)
81− => proxy a -> Eval (_FromExprs a) -> Eval (_Columns a) context)
82− -> GMap _FromExprs rep x
83− -> GColumns _Columns rep context
84−
8571 gtable :: ()
8672 => (forall a proxy. Eval (_Table a) => proxy a -> Eval (_Columns a) context)
8773 -> GColumns _Columns rep context
8874
8975
90−instance GTable _Table _Columns _FromExprs rep =>
91− GTable _Table _Columns _FromExprs (M1 D c rep)
76+type GSerialize
77+ :: (Type -> Type -> Exp Constraint)
78+ -> (Type -> Exp K.HTable)
79+ -> (Type -> Type) -> (Type -> Type) -> Constraint
80+class GSerialize _Serialize _Columns exprs rep
81+ where
82+ gfromResult :: ()
83+ => (forall expr a proxy. Eval (_Serialize expr a)
84+ => proxy expr -> Eval (_Columns expr) context -> a)
85+ -> GColumns _Columns exprs context
86+ -> rep x
87+
88+ gtoResult :: ()
89+ => (forall expr a proxy. Eval (_Serialize expr a)
90+ => proxy expr -> a -> Eval (_Columns expr) context)
91+ -> rep x
92+ -> GColumns _Columns exprs context
93+
94+
95+instance GTable _Table _Columns rep => GTable _Table _Columns (M1 D c rep)
9296 where
9397 gfromColumns fromColumns =
94− M1 . gfromColumns @_Table @_Columns @_FromExprs @rep fromColumns
98+ M1 . gfromColumns @_Table @_Columns @rep fromColumns
9599 gtoColumns toColumns (M1 a) =
96− gtoColumns @_Table @_Columns @_FromExprs @rep toColumns a
100+ gtoColumns @_Table @_Columns @rep toColumns a
101+ gtable = gtable @_Table @_Columns @rep
102+
103+
104+instance GSerialize _Serialize _Columns exprs rep =>
105+ GSerialize _Serialize _Columns (M1 D c exprs) (M1 D c rep)
106+ where
97107 gfromResult fromResult =
98− M1 . gfromResult @_Table @_Columns @_FromExprs @rep fromResult
108+ M1 . gfromResult @_Serialize @_Columns @exprs @rep fromResult
99109 gtoResult toResult (M1 a) =
100− gtoResult @_Table @_Columns @_FromExprs @rep toResult a
101− gtable = gtable @_Table @_Columns @_FromExprs @rep
110+ gtoResult @_Serialize @_Columns @exprs @rep toResult a
102111
103112
104−instance GTable _Table _Columns _FromExprs rep =>
105− GTable _Table _Columns _FromExprs (M1 C c rep)
113+instance GTable _Table _Columns rep => GTable _Table _Columns (M1 C c rep)
106114 where
107115 gfromColumns fromColumns =
108− M1 . gfromColumns @_Table @_Columns @_FromExprs @rep fromColumns
116+ M1 . gfromColumns @_Table @_Columns @rep fromColumns
109117 gtoColumns toColumns (M1 a) =
110− gtoColumns @_Table @_Columns @_FromExprs @rep toColumns a
118+ gtoColumns @_Table @_Columns @rep toColumns a
119+ gtable = gtable @_Table @_Columns @rep
120+
121+
122+instance GSerialize _Serialize _Columns exprs rep =>
123+ GSerialize _Serialize _Columns (M1 C c exprs) (M1 C c rep)
124+ where
111125 gfromResult fromResult =
112− M1 . gfromResult @_Table @_Columns @_FromExprs @rep fromResult
126+ M1 . gfromResult @_Serialize @_Columns @exprs @rep fromResult
113127 gtoResult toResult (M1 a) =
114− gtoResult @_Table @_Columns @_FromExprs @rep toResult a
115− gtable = gtable @_Table @_Columns @_FromExprs @rep
128+ gtoResult @_Serialize @_Columns @exprs @rep toResult a
116129
117130
118−instance
119− ( GTable _Table _Columns _FromExprs rep1
120− , GTable _Table _Columns _FromExprs rep2
121− )
122− => GTable _Table _Columns _FromExprs (rep1 :*: rep2)
131+instance (GTable _Table _Columns rep1, GTable _Table _Columns rep2) =>
132+ GTable _Table _Columns (rep1 :*: rep2)
123133 where
124134 gfromColumns fromColumns (HProduct a b) =
125− gfromColumns @_Table @_Columns @_FromExprs @rep1 fromColumns a :*:
126− gfromColumns @_Table @_Columns @_FromExprs @rep2 fromColumns b
135+ gfromColumns @_Table @_Columns @rep1 fromColumns a :*:
136+ gfromColumns @_Table @_Columns @rep2 fromColumns b
127137 gtoColumns toColumns (a :*: b) = HProduct
128− (gtoColumns @_Table @_Columns @_FromExprs @rep1 toColumns a)
129− (gtoColumns @_Table @_Columns @_FromExprs @rep2 toColumns b)
138+ (gtoColumns @_Table @_Columns @rep1 toColumns a)
139+ (gtoColumns @_Table @_Columns @rep2 toColumns b)
140+ gtable table = HProduct
141+ (gtable @_Table @_Columns @rep1 table)
142+ (gtable @_Table @_Columns @rep2 table)
143+
144+
145+instance
146+ ( GSerialize _Serialize _Columns expr1 rep1
147+ , GSerialize _Serialize _Columns expr2 rep2
148+ )
149+ => GSerialize _Serialize _Columns (expr1 :*: expr2) (rep1 :*: rep2)
150+ where
130151 gfromResult fromResult (HProduct a b) =
131− gfromResult @_Table @_Columns @_FromExprs @rep1 fromResult a :*:
132− gfromResult @_Table @_Columns @_FromExprs @rep2 fromResult b
152+ gfromResult @_Serialize @_Columns @expr1 @rep1 fromResult a :*:
153+ gfromResult @_Serialize @_Columns @expr2 @rep2 fromResult b
133154 gtoResult toResult (a :*: b) =
134155 HProduct
135− (gtoResult @_Table @_Columns @_FromExprs @rep1 toResult a)
136− (gtoResult @_Table @_Columns @_FromExprs @rep2 toResult b)
137− gtable table = HProduct
138− (gtable @_Table @_Columns @_FromExprs @rep1 table)
139− (gtable @_Table @_Columns @_FromExprs @rep2 table)
156+ (gtoResult @_Serialize @_Columns @expr1 @rep1 toResult a)
157+ (gtoResult @_Serialize @_Columns @expr2 @rep2 toResult b)
140158
141159
142160instance
@@ -144,10 +162,20 @@ instance
144162 , meta ~ 'MetaSel ('Just label) _su _ss _ds
145163 , k1 ~ K1 i a
146164 )
147− => GTable _Table _Columns _FromExprs (M1 S meta k1)
165+ => GTable _Table _Columns (M1 S meta k1)
148166 where
149167 gfromColumns fromColumns = M1 . K1 . fromColumns . hunlabel
150168 gtoColumns toColumns (M1 (K1 a)) = hlabel (toColumns a)
151− gfromResult fromResult = M1 . K1 . fromResult (Proxy @a) . hunlabel
152− gtoResult toResult (M1 (K1 a)) = hlabel (toResult (Proxy @a) a)
153169 gtable table = hlabel (table (Proxy @a))
170+
171+
172+instance
173+ ( Eval (_Serialize expr a)
174+ , meta ~ 'MetaSel ('Just label) _su _ss _ds
175+ , k1 ~ K1 i expr
176+ , k1' ~ K1 i a
177+ )
178+ => GSerialize _Serialize _Columns (M1 S meta k1) (M1 S meta k1')
179+ where
180+ gfromResult fromResult = M1 . K1 . fromResult (Proxy @expr) . hunlabel
181+ gtoResult toResult (M1 (K1 a)) = hlabel (toResult (Proxy @expr) a)
src/Rel8/Schema/Context/Virtual.hsdeleted−70
@@ -1,70 +0,0 @@
1−{-# language EmptyCase #-}
2−{-# language DataKinds #-}
3−{-# language GADTs #-}
4−{-# language LambdaCase #-}
5−{-# language StandaloneKindSignatures #-}
6−{-# language TypeFamilies #-}
7−
8−module Rel8.Schema.Context.Virtual
9− ( Virtual, virtual
10− , Abstract(..), Concrete(..), abstractOrConcrete, absurd
11− )
12−where
13−
14−-- base
15−import Data.Kind ( Constraint, Type )
16−import Prelude
17−
18−-- rel8
19−import Rel8.Aggregate ( Aggregate )
20−import Rel8.Expr ( Expr )
21−import Rel8.Kind.Context ( SContext(..) )
22−import qualified Rel8.Schema.Kind as K
23−import Rel8.Schema.Name ( Name )
24−import Rel8.Schema.Result ( Result )
25−
26−
27−type Virtual :: K.Context -> Constraint
28−class Virtual context where
29− virtual :: Abstract context
30−
31−
32−instance Virtual Aggregate where
33− virtual = VAggregate
34−
35−
36−instance Virtual Expr where
37− virtual = VExpr
38−
39−
40−instance Virtual Name where
41− virtual = VName
42−
43−
44−type Abstract :: K.Context -> Type
45−data Abstract context where
46− VAggregate :: Abstract Aggregate
47− VExpr :: Abstract Expr
48− VName :: Abstract Name
49−
50−
51−type Concrete :: K.Context -> Type
52−data Concrete context where
53− VResult :: Concrete Result
54−
55−
56−abstractOrConcrete :: ()
57− => SContext context
58− -> Either (Concrete context) (Abstract context)
59−abstractOrConcrete = \case
60− SAggregate -> Right VAggregate
61− SExpr -> Right VExpr
62− SName -> Right VName
63− SResult -> Left VResult
64−
65−
66−absurd :: Abstract context -> Concrete context -> a
67−absurd = \case
68− VAggregate -> \case
69− VExpr -> \case
70− VName -> \case
src/Rel8/Table.hs+38−24
@@ -17,26 +17,31 @@ module Rel8.Table
1717 , Transpose
1818 )
1919 , Congruent
20− , TTable, TColumns, TContext, TFromExprs
20+ , TTable, TColumns, TContext, TFromExprs, TTranspose
21+ , TSerialize
2122 )
2223where
2324
2425-- base
26+import Data.Functor.Identity ( Identity( Identity ) )
2527import Data.Kind ( Constraint, Type )
2628import GHC.Generics ( Generic, Rep, from, to )
2729import Prelude hiding ( null )
2830
2931-- rel8
3032import Rel8.FCF ( Eval, Exp )
31−import Rel8.Generic.Map ( GMap, Map )
33+import Rel8.Generic.Map ( Map )
3234import Rel8.Generic.Table.Record
33− ( GTable, GColumns, GContext
34− , gfromColumns, gtoColumns, gfromResult, gtoResult
35+ ( GTable, GColumns, GContext, gfromColumns, gtoColumns
36+ , GSerialize, gfromResult, gtoResult
3537 )
3638import Rel8.Generic.Record ( Record(..) )
3739import Rel8.Schema.HTable ( HTable )
40+import Rel8.Schema.HTable.Identity ( HIdentity( HIdentity ) )
3841import qualified Rel8.Schema.Kind as K
42+import Rel8.Schema.Null ( Sql )
3943import Rel8.Schema.Result ( Result )
44+import Rel8.Type ( DBType )
4045
4146
4247-- | @Table@s are one of the foundational elements of Rel8, and describe data
@@ -84,69 +89,71 @@ class
8489
8590 default toColumns ::
8691 ( Generic (Record a)
87− , GTable (TTable context) TColumns TFromExprs (Rep (Record a))
92+ , GTable (TTable context) TColumns (Rep (Record a))
8893 , Columns a ~ GColumns TColumns (Rep (Record a))
8994 )
9095 => a -> Columns a context
9196 toColumns =
92− gtoColumns
93− @(TTable context)
94− @TColumns
95− @TFromExprs
96− toColumns .
97+ gtoColumns @(TTable context) @TColumns toColumns .
9798 from .
9899 Record
99100
100101 default fromColumns ::
101102 ( Generic (Record a)
102− , GTable (TTable context) TColumns TFromExprs (Rep (Record a))
103+ , GTable (TTable context) TColumns (Rep (Record a))
103104 , Columns a ~ GColumns TColumns (Rep (Record a))
104105 )
105106 => Columns a context -> a
106107 fromColumns =
107108 unrecord .
108109 to .
109− gfromColumns
110− @(TTable context)
111− @TColumns
112− @TFromExprs
113− fromColumns
110+ gfromColumns @(TTable context) @TColumns fromColumns
114111
115112 default toResult ::
116113 ( Generic (Record (FromExprs a))
117− , GTable (TTable context) TColumns TFromExprs (Rep (Record a))
114+ , GSerialize TSerialize TColumns (Rep (Record a)) (Rep (Record (FromExprs a)))
118115 , Columns a ~ GColumns TColumns (Rep (Record a))
119− , Rep (Record (FromExprs a)) ~ GMap TFromExprs (Rep (Record a))
120116 )
121117 => FromExprs a -> Columns a Result
122118 toResult =
123119 gtoResult
124− @(TTable context)
120+ @TSerialize
125121 @TColumns
126− @TFromExprs
127122 @(Rep (Record a))
123+ @(Rep (Record (FromExprs a)))
128124 (\(_ :: proxy x) -> toResult @(Context x) @x) .
129125 from .
130126 Record
131127
132128 default fromResult ::
133129 ( Generic (Record (FromExprs a))
134− , GTable (TTable context) TColumns TFromExprs (Rep (Record a))
130+ , GSerialize TSerialize TColumns (Rep (Record a)) (Rep (Record (FromExprs a)))
135131 , Columns a ~ GColumns TColumns (Rep (Record a))
136− , Rep (Record (FromExprs a)) ~ GMap TFromExprs (Rep (Record a))
137132 )
138133 => Columns a Result -> FromExprs a
139134 fromResult =
140135 unrecord .
141136 to .
142137 gfromResult
143− @(TTable context)
138+ @TSerialize
144139 @TColumns
145− @TFromExprs
146140 @(Rep (Record a))
141+ @(Rep (Record (FromExprs a)))
147142 (\(_ :: proxy x) -> fromResult @(Context x) @x)
148143
149144
145+instance Sql DBType a => Table Result (Identity a) where
146+ type Columns (Identity a) = HIdentity a
147+ type Context (Identity a) = Result
148+ type FromExprs (Identity a) = a
149+ type Transpose to (Identity a) = to a
150+
151+ toColumns = HIdentity
152+ fromColumns (HIdentity a) = a
153+ toResult a = HIdentity (Identity a)
154+ fromResult (HIdentity (Identity a)) = a
155+
156+
150157data TTable :: K.Context -> Type -> Exp Constraint
151158type instance Eval (TTable context a) = Table context a
152159
@@ -167,6 +174,13 @@ data TTranspose :: K.Context -> Type -> Exp Type
167174type instance Eval (TTranspose context a) = Transpose context a
168175
169176
177+data TSerialize :: Type -> Type -> Exp Constraint
178+type instance Eval (TSerialize expr a) =
179+ ( Table (Context expr) expr
180+ , a ~ FromExprs expr
181+ )
182+
183+
170184instance (Table context a, Table context b) => Table context (a, b)
171185
172186
src/Rel8/Table/ADT.hs+13−25
@@ -7,7 +7,6 @@
77{-# language ScopedTypeVariables #-}
88{-# language StandaloneKindSignatures #-}
99{-# language TypeApplications #-}
10−{-# language TypeFamilies #-}
1110{-# language TypeFamilyDependencies #-}
1211{-# language UndecidableInstances #-}
1312{-# language UndecidableSuperClasses #-}
@@ -28,7 +27,7 @@ where
2827
2928-- base
3029import Data.Kind ( Constraint, Type )
31−import GHC.Generics ( Generic, Rep, from, to )
30+import GHC.Generics ( Generic, from, to )
3231import GHC.TypeLits ( Symbol )
3332import Prelude
3433
@@ -45,24 +44,20 @@ import Rel8.Generic.Construction
4544 , GGName, ggname
4645 , GGAggregate, ggaggregate
4746 )
48−import Rel8.Generic.Map ( GMap )
4947import Rel8.Generic.Record ( Record( Record ), unrecord )
5048import Rel8.Generic.Rel8able
5149 ( Rel8able
5250 , GRep, GColumns, gfromColumns, gtoColumns
5351 , GFromExprs, gfromResult, gtoResult
52+ , TSerialize, deserialize, serialize
5453 )
5554import qualified Rel8.Generic.Table.ADT as G
5655import qualified Rel8.Kind.Algebra as K
57−import Rel8.Schema.Context.Virtual
5856import Rel8.Schema.HTable ( HTable )
5957import qualified Rel8.Schema.Kind as K
6058import Rel8.Schema.Name ( Name )
6159import Rel8.Schema.Result ( Result )
62−import Rel8.Table
63− ( Table, fromResult, toResult
64− , TTable, TColumns, TFromExprs
65− )
60+import Rel8.Table ( Table, TColumns )
6661
6762
6863type ADT :: K.Rel8able -> K.Rel8able
@@ -73,31 +68,26 @@ instance ADTable t => Rel8able (ADT t) where
7368 type GColumns (ADT t) = GColumnsADT t
7469 type GFromExprs (ADT t) = t Result
7570
76− gfromColumns VAggregate = ADT
77− gfromColumns VExpr = ADT
78− gfromColumns VName = ADT
79−
80− gtoColumns VAggregate (ADT a) = a
81− gtoColumns VExpr (ADT a) = a
82− gtoColumns VName (ADT a) = a
71+ gfromColumns _ = ADT
72+ gtoColumns _ (ADT a) = a
8373
8474 gfromResult =
8575 unrecord .
8676 to .
8777 G.gfromResultADT
88− @(TTable Expr)
78+ @TSerialize
8979 @TColumns
90− @TFromExprs
9180 @(Eval (ADTRep t Expr))
92− (\(_ :: proxy x) -> fromResult @_ @x)
81+ @(Eval (ADTRep t Result))
82+ (\(_ :: proxy x) -> deserialize @_ @x)
9383
9484 gtoResult =
9585 G.gtoResultADT
96− @(TTable Expr)
86+ @TSerialize
9787 @TColumns
98− @TFromExprs
9988 @(Eval (ADTRep t Expr))
100− (\(_ :: proxy x) -> toResult @_ @x) .
89+ @(Eval (ADTRep t Result))
90+ (\(_ :: proxy x) -> serialize @_ @x) .
10191 from .
10292 Record
10393
@@ -106,15 +96,13 @@ type ADTable :: K.Rel8able -> Constraint
10696class
10797 ( Generic (Record (t Result))
10898 , HTable (GColumnsADT t)
109− , G.GTableADT (TTable Expr) TColumns TFromExprs (Eval (ADTRep t Expr))
110− , GMap TFromExprs (Rep (Record (t Expr))) ~ Rep (Record (t Result))
99+ , G.GSerializeADT TSerialize TColumns (Eval (ADTRep t Expr)) (Eval (ADTRep t Result))
111100 )
112101 => ADTable t
113102instance
114103 ( Generic (Record (t Result))
115104 , HTable (GColumnsADT t)
116− , G.GTableADT (TTable Expr) TColumns TFromExprs (Eval (ADTRep t Expr))
117− , GMap TFromExprs (Rep (Record (t Expr))) ~ Rep (Record (t Result))
105+ , G.GSerializeADT TSerialize TColumns (Eval (ADTRep t Expr)) (Eval (ADTRep t Result))
118106 )
119107 => ADTable t
120108
src/Rel8/Table/Eq.hs+3−9
@@ -37,7 +37,7 @@ import Rel8.Schema.Dict ( Dict( Dict ) )
3737import Rel8.Schema.HTable ( htabulateA, hfield )
3838import Rel8.Schema.HTable.Identity ( HIdentity( HIdentity ) )
3939import Rel8.Schema.Null ( Sql )
40−import Rel8.Table ( Table, Columns, toColumns, TColumns, TFromExprs )
40+import Rel8.Table ( Table, Columns, toColumns, TColumns )
4141import Rel8.Type.Eq ( DBEq )
4242
4343
@@ -49,17 +49,11 @@ class Table Expr a => EqTable a where
4949 eqTable :: Columns a (Dict (Sql DBEq))
5050
5151 default eqTable ::
52− ( GTable TEqTable TColumns TFromExprs (Rep (Record a))
52+ ( GTable TEqTable TColumns (Rep (Record a))
5353 , Columns a ~ GColumns TColumns (Rep (Record a))
5454 )
5555 => Columns a (Dict (Sql DBEq))
56− eqTable =
57− gtable
58− @TEqTable
59− @TColumns
60− @TFromExprs
61− @(Rep (Record a))
62− table
56+ eqTable = gtable @TEqTable @TColumns @(Rep (Record a)) table
6357 where
6458 table (_ :: proxy x) = eqTable @x
6559
src/Rel8/Table/HKD.hs+13−13
@@ -57,16 +57,18 @@ import Rel8.Generic.Rel8able
5757 , GFromExprs, gfromResult, gtoResult
5858 )
5959import Rel8.Generic.Table
60− ( GGTable, GGColumns, GAlgebra, ggfromResult, ggtoResult
60+ ( GGSerialize, GGColumns, GAlgebra, ggfromResult, ggtoResult
6161 )
6262import Rel8.Generic.Table.Record ( GTable, GContext )
6363import qualified Rel8.Generic.Table.Record as G
6464import qualified Rel8.Schema.Kind as K
6565import Rel8.Schema.HTable ( HTable )
6666import Rel8.Schema.Name ( Name )
67+import Rel8.Schema.Result ( Result )
6768import Rel8.Table
6869 ( Table, fromColumns, toColumns, fromResult, toResult
69− , TTable, TColumns, TContext, TFromExprs
70+ , TTable, TColumns, TContext
71+ , TSerialize
7072 )
7173
7274
@@ -91,26 +93,26 @@ instance HKDable a => Rel8able (HKD a) where
9193 to .
9294 ggfromResult
9395 @(GAlgebra (Rep a))
94− @(TTable Expr)
96+ @TSerialize
9597 @TColumns
96− @TFromExprs
9798 @(Eval (HKDRep a Expr))
99+ @(Eval (HKDRep a Result))
98100 (\(_ :: proxy x) -> fromResult @_ @x)
99101
100102 gtoResult =
101103 ggtoResult
102104 @(GAlgebra (Rep a))
103− @(TTable Expr)
105+ @TSerialize
104106 @TColumns
105− @TFromExprs
106107 @(Eval (HKDRep a Expr))
108+ @(Eval (HKDRep a Result))
107109 (\(_ :: proxy x) -> toResult @_ @x) .
108110 from .
109111 Record
110112
111113
112114instance
113− ( GTable (TTable f) TColumns TFromExprs (GRecord (GMap (TColumn f) (Rep a)))
115+ ( GTable (TTable f) TColumns (GRecord (GMap (TColumn f) (Rep a)))
114116 , G.GColumns TColumns (GRecord (GMap (TColumn f) (Rep a))) ~ GColumnsHKD a
115117 , GContext TContext (GRecord (GMap (TColumn f) (Rep a))) ~ f
116118 , GRecordable (GMap (TColumn f) (Rep a))
@@ -124,7 +126,6 @@ instance
124126 G.gfromColumns
125127 @(TTable f)
126128 @TColumns
127− @TFromExprs
128129 fromColumns .
129130 (\(HKD a) -> a)
130131
@@ -133,7 +134,6 @@ instance
133134 G.gtoColumns
134135 @(TTable f)
135136 @TColumns
136− @TFromExprs
137137 toColumns .
138138 grecord @(GMap (TColumn f) (Rep a))
139139
@@ -143,16 +143,16 @@ class
143143 ( Generic (Record a)
144144 , HTable (GColumns (HKD a))
145145 , KnownAlgebra (GAlgebra (Rep a))
146− , Eval (GGTable (GAlgebra (Rep a)) (TTable Expr) TColumns TFromExprs (Eval (HKDRep a Expr)))
147− , GMap TFromExprs (GRecord (GMap (TColumn Expr) (Rep a))) ~ Rep (Record a)
146+ , Eval (GGSerialize (GAlgebra (Rep a)) TSerialize TColumns (Eval (HKDRep a Expr)) (Eval (HKDRep a Result)))
147+ , GRecord (GMap (TColumn Result) (Rep a)) ~ Rep (Record a)
148148 )
149149 => HKDable a
150150instance
151151 ( Generic (Record a)
152152 , HTable (GColumns (HKD a))
153153 , KnownAlgebra (GAlgebra (Rep a))
154− , Eval (GGTable (GAlgebra (Rep a)) (TTable Expr) TColumns TFromExprs (Eval (HKDRep a Expr)))
155− , GMap TFromExprs (GRecord (GMap (TColumn Expr) (Rep a))) ~ Rep (Record a)
154+ , Eval (GGSerialize (GAlgebra (Rep a)) TSerialize TColumns (Eval (HKDRep a Expr)) (Eval (HKDRep a Result)))
155+ , GRecord (GMap (TColumn Result) (Rep a)) ~ Rep (Record a)
156156 )
157157 => HKDable a
158158
src/Rel8/Table/Ord.hs+3−9
@@ -35,7 +35,7 @@ import Rel8.Schema.Dict ( Dict( Dict ) )
3535import Rel8.Schema.HTable ( htabulateA, hfield )
3636import Rel8.Schema.HTable.Identity ( HIdentity( HIdentity ) )
3737import Rel8.Schema.Null (Sql)
38−import Rel8.Table ( Columns, toColumns, TColumns, TFromExprs )
38+import Rel8.Table ( Columns, toColumns, TColumns )
3939import Rel8.Table.Bool ( bool )
4040import Rel8.Table.Eq ( EqTable )
4141import Rel8.Type.Ord ( DBOrd )
@@ -49,17 +49,11 @@ class EqTable a => OrdTable a where
4949 ordTable :: Columns a (Dict (Sql DBOrd))
5050
5151 default ordTable ::
52− ( GTable TOrdTable TColumns TFromExprs (Rep (Record a))
52+ ( GTable TOrdTable TColumns (Rep (Record a))
5353 , Columns a ~ GColumns TColumns (Rep (Record a))
5454 )
5555 => Columns a (Dict (Sql DBOrd))
56− ordTable =
57− gtable
58− @TOrdTable
59− @TColumns
60− @TFromExprs
61− @(Rep (Record a))
62− table
56+ ordTable = gtable @TOrdTable @TColumns @(Rep (Record a)) table
6357 where
6458 table (_ :: proxy x) = ordTable @x
6559
src/Rel8/Table/Rel8able.hs+4−4
@@ -20,12 +20,12 @@ import Prelude ()
2020-- rel8
2121import Rel8.Expr ( Expr )
2222import qualified Rel8.Kind.Algebra as K
23+import Rel8.Kind.Context ( Reifiable, contextSing )
2324import Rel8.Generic.Rel8able
2425 ( Rel8able, Algebra
2526 , GColumns, gfromColumns, gtoColumns
2627 , GFromExprs, gfromResult, gtoResult
2728 )
28−import Rel8.Schema.Context.Virtual ( Virtual, virtual )
2929import qualified Rel8.Schema.Kind as K
3030import Rel8.Schema.HTable ( HConstrainTable, hdicts )
3131import Rel8.Schema.Null ( Sql )
@@ -43,7 +43,7 @@ import Rel8.Type.Eq ( DBEq )
4343import Rel8.Type.Ord ( DBOrd )
4444
4545
46−instance (Rel8able t, Virtual context, context ~ context') =>
46+instance (Rel8able t, Reifiable context, context ~ context') =>
4747 Table context' (t context)
4848 where
4949 type Columns (t context) = GColumns t
@@ -51,8 +51,8 @@ instance (Rel8able t, Virtual context, context ~ context') =>
5151 type FromExprs (t context) = GFromExprs t
5252 type Transpose to (t context) = t to
5353
54− fromColumns = gfromColumns virtual
55− toColumns = gtoColumns virtual
54+ fromColumns = gfromColumns contextSing
55+ toColumns = gtoColumns contextSing
5656 fromResult = gfromResult @t
5757 toResult = gtoResult @t
5858
tests/Rel8/Generic/Rel8able/Test.hs+27−1
@@ -6,6 +6,7 @@
66{-# language FlexibleInstances #-}
77{-# language MultiParamTypeClasses #-}
88{-# language TypeFamilies #-}
9+{-# language UndecidableInstances #-}
910
1011{-# options_ghc -O0 #-}
1112
@@ -136,10 +137,35 @@ data TableSum f
136137 deriving stock Generic
137138
138139
140+data BarbieSum f
141+ = BarbieSumA (f Bool) (f Text)
142+ | BarbieSumB
143+ | BarbieSumC (f Text)
144+ deriving stock Generic
145+
146+
139147data TableProduct f = TableProduct
140− { sum :: HADT f TableSum
148+ { sum :: HADT f BarbieSum
141149 , list :: TableList f
142150 , foos :: HList f (HADT f TableSum, Lift f HKDSum, HKDTest f)
143151 }
144152 deriving stock Generic
145153 deriving anyclass Rel8able
154+
155+
156+data TableTestB f = TableTestB
157+ { foo :: f Bool
158+ , bar :: f (Maybe Bool)
159+ }
160+ deriving stock Generic
161+ deriving anyclass Rel8able
162+
163+
164+data NestedTableTestB f = NestedTableTestB
165+ { foo :: f Bool
166+ , bar :: f (Maybe Bool)
167+ , baz :: Column f Char
168+ , nest :: TableTestB f
169+ }
170+ deriving stock Generic
171+ deriving anyclass Rel8able