@@ -11,12 +11,13 @@
11{-# language TypeFamilies #-}
11{-# language TypeFamilies #-}
12{-# language UndecidableInstances #-}
12{-# language UndecidableInstances #-}
14−{-# options_ghc -fno-warn-orphans #-}
16module Rel8.Generic.Rel8able
14module Rel8.Generic.Rel8able
17 ( KRel8able, Rel8able
15 ( KRel8able, Rel8able
18− , GColumns, GContext, gfromColumns, gtoColumns, greify, gunreify
18+ , GColumns, GContext, gfromColumns, gtoColumns
19+ , GColumnsADT, gfromColumnsADT, gtoColumnsADT
@@ -28,11 +29,7 @@ import GHC.Generics ( Generic, Rep, from, to )
28import Prelude
29import Prelude
31−import Rel8.Kind.Context
32+import Rel8.Kind.Context ( Reifiable )
33− , Reifiable, contextSing
34− , sLabelable, sReifiable
36import Rel8.FCF ( Eval, Exp )
33import Rel8.FCF ( Eval, Exp )
37import Rel8.Generic.Map ( GMap, GMappable, gmap, gunmap )
34import Rel8.Generic.Map ( GMap, GMappable, gmap, gunmap )
38import Rel8.Generic.Record ( Record(..) )
35import Rel8.Generic.Record ( Record(..) )
@@ -40,6 +37,7 @@ import Rel8.Generic.Table
40 ( GGTable, GGColumns, GGContext, ggfromColumns, ggtoColumns
37 ( GGTable, GGColumns, GGContext, ggfromColumns, ggtoColumns
41 , GAlgebra
38 , GAlgebra
40+import qualified Rel8.Generic.Table.ADT as G
43import Rel8.Kind.Algebra
41import Rel8.Kind.Algebra
44 ( SAlgebra( SProduct, SSum )
42 ( SAlgebra( SProduct, SSum )
45 , KnownAlgebra, algebraSing
43 , KnownAlgebra, algebraSing
@@ -47,48 +45,17 @@ import Rel8.Kind.Algebra
47import qualified Rel8.Kind.Algebra as K ( Algebra(..) )
45import qualified Rel8.Kind.Algebra as K ( Algebra(..) )
48import Rel8.Schema.Context ( Col )
46import Rel8.Schema.Context ( Col )
49import Rel8.Schema.Context.Label ( Labelable )
47import Rel8.Schema.Context.Label ( Labelable )
50−import Rel8.Schema.Dict ( Dict( Dict ) )
51import Rel8.Schema.HTable ( HTable )
48import Rel8.Schema.HTable ( HTable )
52import qualified Rel8.Schema.Kind as K
49import qualified Rel8.Schema.Kind as K
53import Rel8.Schema.Name ( Name )
50import Rel8.Schema.Name ( Name )
54−import Rel8.Schema.Reify
51+import Rel8.Schema.Reify ( Col( Reify ), Reify, UnwrapReify )
55− ( Col( Reify ), Reify, hreify, hunreify
58import Rel8.Schema.Result ( Result )
52import Rel8.Schema.Result ( Result )
59import Rel8.Table
53import Rel8.Table
60− ( Table, Columns, Context, fromColumns, toColumns
54+ ( fromColumns, toColumns, reify, unreify
61− , Unreify, reify, unreify
62 , TTable, TColumns, TContext, TUnreify
55 , TTable, TColumns, TContext, TUnreify
68− , GContext t context ~ context
72− => Table context (t context)
74− type Columns (t context) = GColumns t
75− type Context (t context) = context
76− type Unreify (t context) = t (UnwrapReify context)
78− fromColumns = gunreify . gfromColumns . hreify
79− toColumns = hunreify . gtoColumns . greify
81− reify Refl = case contextSing @context of
82− SReify context -> case sLabelable context of
83− Dict -> case sReifiable context of
86− unreify Refl = case contextSing @context of
87− SReify context -> case sLabelable context of
88− Dict -> case sReifiable context of
92type KRel8able :: Type
59type KRel8able :: Type
93type KRel8able = K.Rel8able
60type KRel8able = K.Rel8able
@@ -136,9 +103,19 @@ type KRel8able = K.Rel8able
136-- deriving ( GHC.Generics.Generic, Rel8able )
103-- deriving ( GHC.Generics.Generic, Rel8able )
138type Rel8able :: K.Rel8able -> Constraint
105type Rel8able :: K.Rel8able -> Constraint
139−class HTable (GColumns t) => Rel8able t where
107+ ( HTable (GColumns t)
108+ , HTable (GColumnsADT t)
109+ , GContext t Result ~ Result
140 type Algebra t :: K.Algebra
113 type Algebra t :: K.Algebra
115+ type GRep t (context :: K.Context) :: Type -> Type
141 type GColumns t :: K.HTable
117 type GColumns t :: K.HTable
142 type GContext t (context :: K.Context) :: K.Context
119 type GContext t (context :: K.Context) :: K.Context
144 gfromColumns :: (Labelable context, Reifiable context, GContext t context ~ context)
121 gfromColumns :: (Labelable context, Reifiable context, GContext t context ~ context)
@@ -147,21 +124,31 @@ class HTable (GColumns t) => Rel8able t where
147 gtoColumns :: (Labelable context, Reifiable context, GContext t context ~ context)
124 gtoColumns :: (Labelable context, Reifiable context, GContext t context ~ context)
148 => t (Reify context) -> GColumns t (Col (Reify context))
125 => t (Reify context) -> GColumns t (Col (Reify context))
127+ gfromColumnsADT :: GColumnsADT t (Col (Reify Result)) -> t (Reify Result)
129+ gtoColumnsADT :: t (Reify Result) -> GColumnsADT t (Col (Reify Result))
150 greify :: (Labelable context, Reifiable context)
131 greify :: (Labelable context, Reifiable context)
151 => t context -> t (Reify context)
132 => t context -> t (Reify context)
153 gunreify :: (Labelable context, Reifiable context)
134 gunreify :: (Labelable context, Reifiable context)
154 => t (Reify context) -> t context
135 => t (Reify context) -> t context
156− type Algebra t = GAlgebra (Rep (Record (t (Reify Name))))
137+ type Algebra t = GAlgebra (GRep t (Reify Name))
139+ type GRep t context = Rep (Record (t context))
157− type GColumns t = Eval (GGColumns (Algebra t) TColumns (Rep (Record (t (Reify Name)))))
141+ type GColumns t = Eval (GGColumns (Algebra t) TColumns (GRep t (Reify Name)))
143+ type GContext t context =
158− type GContext t context = Eval (GGContext (Algebra t) TUnreifyContext (Rep (Record (t (Reify context)))))
144+ Eval (GGContext (Algebra t) TUnreifyContext (GRep t (Reify context)))
160 default gfromColumns :: forall context.
146 default gfromColumns :: forall context.
161 ( Generic (Record (t (Reify context)))
147 ( Generic (Record (t (Reify context)))
148+ , GRep t (Reify context) ~ Rep (Record (t (Reify context)))
162 , KnownAlgebra (Algebra t)
149 , KnownAlgebra (Algebra t)
163− , Eval (GGTable (Algebra t) (TTable (Reify context)) TColumns (Col (Reify context)) (Rep (Record (t (Reify context)))))
150+ , Eval (GGTable (Algebra t) (TTable (Reify context)) TColumns (Col (Reify context)) (GRep t (Reify context)))
164− , Eval (GGColumns (Algebra t) TColumns (Rep (Record (t (Reify context))))) ~ GColumns t
151+ , Eval (GGColumns (Algebra t) TColumns (GRep t (Reify context))) ~ GColumns t
165 , Constraints t context
152 , Constraints t context
167 => GColumns t (Col (Reify context)) -> t (Reify context)
154 => GColumns t (Col (Reify context)) -> t (Reify context)
@@ -179,9 +166,10 @@ class HTable (GColumns t) => Rel8able t where
180 default gtoColumns :: forall context.
167 default gtoColumns :: forall context.
181 ( Generic (Record (t (Reify context)))
168 ( Generic (Record (t (Reify context)))
169+ , GRep t (Reify context) ~ Rep (Record (t (Reify context)))
182 , KnownAlgebra (Algebra t)
170 , KnownAlgebra (Algebra t)
183− , Eval (GGTable (Algebra t) (TTable (Reify context)) TColumns (Col (Reify context)) (Rep (Record (t (Reify context)))))
171+ , Eval (GGTable (Algebra t) (TTable (Reify context)) TColumns (Col (Reify context)) (GRep t (Reify context)))
184− , Eval (GGColumns (Algebra t) TColumns (Rep (Record (t (Reify context))))) ~ GColumns t
172+ , Eval (GGColumns (Algebra t) TColumns (GRep t (Reify context))) ~ GColumns t
185 , Constraints t context
173 , Constraints t context
187 => t (Reify context) -> GColumns t (Col (Reify context))
175 => t (Reify context) -> GColumns t (Col (Reify context))
@@ -197,11 +185,47 @@ class HTable (GColumns t) => Rel8able t where
188+ default gfromColumnsADT ::
189+ ( Generic (Record (t (Reify Result)))
190+ , GRep t (Reify Result) ~ Rep (Record (t (Reify Result)))
191+ , G.GTableADT (TTable (Reify Result)) TColumns (Col (Reify Result)) (GRep t (Reify Result))
192+ , G.GColumnsADT TColumns (GRep t (Reify Result)) ~ GColumnsADT t
194+ => GColumnsADT t (Col (Reify Result)) -> t (Reify Result)
199+ @(TTable (Reify Result))
205+ default gtoColumnsADT ::
206+ ( Generic (Record (t (Reify Result)))
207+ , GRep t (Reify Result) ~ Rep (Record (t (Reify Result)))
208+ , G.GTableADT (TTable (Reify Result)) TColumns (Col (Reify Result)) (GRep t (Reify Result))
209+ , G.GColumnsADT TColumns (GRep t (Reify Result)) ~ GColumnsADT t
211+ => t (Reify Result) -> GColumnsADT t (Col (Reify Result))
214+ @(TTable (Reify Result))
200 default greify :: forall context.
222 default greify :: forall context.
201 ( Generic (Record (t context))
223 ( Generic (Record (t context))
224+ , GRep t context ~ Rep (Record (t context))
202 , Generic (Record (t (Reify context)))
225 , Generic (Record (t (Reify context)))
226+ , GRep t (Reify context) ~ Rep (Record (t (Reify context)))
203− , GMappable (TTable (Reify context)) (Rep (Record (t (Reify context))))
227+ , GMappable (TTable (Reify context)) (GRep t (Reify context))
204− , Rep (Record (t context)) ~ GMap TUnreify (Rep (Record (t (Reify context))))
228+ , GRep t context ~ GMap TUnreify (GRep t (Reify context))
206 => t context -> t (Reify context)
230 => t context -> t (Reify context)
@@ -213,9 +237,11 @@ class HTable (GColumns t) => Rel8able t where
214 default gunreify :: forall context.
238 default gunreify :: forall context.
215 ( Generic (Record (t context))
239 ( Generic (Record (t context))
240+ , GRep t context ~ Rep (Record (t context))
216 , Generic (Record (t (Reify context)))
241 , Generic (Record (t (Reify context)))
242+ , GRep t (Reify context) ~ Rep (Record (t (Reify context)))
217− , GMappable (TTable (Reify context)) (Rep (Record (t (Reify context))))
243+ , GMappable (TTable (Reify context)) (GRep t (Reify context))
218− , Rep (Record (t context)) ~ GMap TUnreify (Rep (Record (t (Reify context))))
244+ , GRep t context ~ GMap TUnreify (GRep t (Reify context))
220 => t (Reify context) -> t context
246 => t (Reify context) -> t context
221 gunreify =
247 gunreify =
@@ -226,6 +252,9 @@ class HTable (GColumns t) => Rel8able t where
255+type GColumnsADT t = G.GColumnsADT TColumns (GRep t (Reify Name))
229data TUnreifyContext :: Type -> Exp K.Context
258data TUnreifyContext :: Type -> Exp K.Context
230type instance Eval (TUnreifyContext a) = UnwrapReify (Eval (TContext a))
259type instance Eval (TUnreifyContext a) = UnwrapReify (Eval (TContext a))
@@ -237,9 +266,8 @@ type Constraints t context = Constraints' (Algebra t) t context
237type Constraints' :: K.Algebra -> K.Rel8able -> K.Context -> Constraint
266type Constraints' :: K.Algebra -> K.Rel8able -> K.Context -> Constraint
238type family Constraints' algebra t context where
267type family Constraints' algebra t context where
239 Constraints' 'K.Product t context =
268 Constraints' 'K.Product t context =
240− ( Eval (GGContext 'K.Product TContext (Rep (Record (t (Reify context))))) ~
269+ Eval (GGContext 'K.Product TContext (GRep t (Reify context))) ~
241− Reify context
270+ Reify context
243 Constraints' 'K.Sum _ context = context ~ Result
271 Constraints' 'K.Sum _ context = context ~ Result
@@ -248,7 +276,7 @@ fromContext :: forall t context spec.
248 , Constraints t context
276 , Constraints t context
250 => Col (Reify context) spec
278 => Col (Reify context) spec
251− -> Col (Eval (GGContext (Algebra t) TContext (Rep (Record (t (Reify context)))))) spec
279+ -> Col (Eval (GGContext (Algebra t) TContext (GRep t (Reify context)))) spec
252fromContext = case algebraSing @(Algebra t) of
280fromContext = case algebraSing @(Algebra t) of
253 SProduct -> id
281 SProduct -> id
254 SSum -> \(Reify a) -> a
282 SSum -> \(Reify a) -> a
@@ -258,7 +286,7 @@ toContext :: forall t context spec.
258 ( KnownAlgebra (Algebra t)
286 ( KnownAlgebra (Algebra t)
259 , Constraints t context
287 , Constraints t context
261− => Col (Eval (GGContext (Algebra t) TContext (Rep (Record (t (Reify context)))))) spec
289+ => Col (Eval (GGContext (Algebra t) TContext (GRep t (Reify context)))) spec
262 -> Col (Reify context) spec
290 -> Col (Reify context) spec
263toContext = case algebraSing @(Algebra t) of
291toContext = case algebraSing @(Algebra t) of
264 SProduct -> id
292 SProduct -> id