@@ -14,10 +14,12 @@
14{-# language ViewPatterns #-}
14{-# language ViewPatterns #-}
16module Rel8.Generic.Construction
16module Rel8.Generic.Construction
17− ( GGConstructable
20+ , GGConstructable
18 , GGConstruct, ggconstruct
21 , GGConstruct, ggconstruct
19 , GGDeconstruct, ggdeconstruct
22 , GGDeconstruct, ggdeconstruct
21 , GGName, ggname
23 , GGName, ggname
22 , GGAggregate, ggaggregate
24 , GGAggregate, ggaggregate
23 , GGAggregate', ggaggregate'
25 , GGAggregate', ggaggregate'
@@ -29,6 +31,7 @@ import Data.Bifunctor ( first )
29import Data.Kind ( Constraint, Type )
31import Data.Kind ( Constraint, Type )
30import Data.List.NonEmpty ( NonEmpty( (:|) ) )
32import Data.List.NonEmpty ( NonEmpty( (:|) ) )
31import Data.Type.Equality ( (:~:)( Refl ) )
33import Data.Type.Equality ( (:~:)( Refl ) )
34+import GHC.TypeLits ( Symbol )
32import Prelude
35import Prelude
@@ -40,14 +43,16 @@ import Rel8.Expr.Null ( nullify, snull, unsafeUnnullify )
40import Rel8.Expr.Serialize ( litExpr )
43import Rel8.Expr.Serialize ( litExpr )
41import Rel8.FCF ( Compose, Eval, Exp )
44import Rel8.FCF ( Compose, Eval, Exp )
42import Rel8.Generic.Construction.ADT
45import Rel8.Generic.Construction.ADT
46+ ( GConstructorADT, GMakeableADT, gmakeADT
43− ( GConstructableADT
47+ , GConstructableADT
44 , GBuildADT, gbuildADT, gunbuildADT
48 , GBuildADT, gbuildADT, gunbuildADT
45 , GConstructADT, gconstructADT, gdeconstructADT
49 , GConstructADT, gconstructADT, gdeconstructADT
46 , CorepConstructors, GConstructors, gcindex, gctabulate
50 , CorepConstructors, GConstructors, gcindex, gctabulate
47 , CorepFields, gfindex, gftabulate, gftraverse
51 , CorepFields, gfindex, gftabulate, gftraverse
49import Rel8.Generic.Construction.Record
53import Rel8.Generic.Construction.Record
50− ( GConstructable, GConstruct, gconstruct, gdeconstruct
55+ , GConstructable, GConstruct, gconstruct, gdeconstruct
51 , Corep, gindex, gtabulate, gtraverse
56 , Corep, gindex, gtabulate, gtraverse
53import Rel8.Generic.Table ( GGColumns )
58import Rel8.Generic.Table ( GGColumns )
@@ -78,6 +83,124 @@ import Rel8.Type.Tag ( Tag )
78import Data.Functor.Apply ( Apply, MaybeApply( MaybeApply ), liftF2 )
83import Data.Functor.Apply ( Apply, MaybeApply( MaybeApply ), liftF2 )
86+type GGBuildable :: K.Algebra -> Symbol -> (K.Context -> Exp (Type -> Type)) -> Constraint
87+type GGBuildable algebra name rep =
88+ ( KnownAlgebra algebra
89+ , Eval (GGColumns algebra TColumns (Eval (rep (Reify Aggregate)))) ~ Eval (GGColumns algebra TColumns (Eval (rep (Reify Result))))
90+ , Eval (GGColumns algebra TColumns (Eval (rep (Reify Expr)))) ~ Eval (GGColumns algebra TColumns (Eval (rep (Reify Result))))
91+ , Eval (GGColumns algebra TColumns (Eval (rep (Reify Insert)))) ~ Eval (GGColumns algebra TColumns (Eval (rep (Reify Result))))
92+ , Eval (GGColumns algebra TColumns (Eval (rep (Reify Name)))) ~ Eval (GGColumns algebra TColumns (Eval (rep (Reify Result))))
93+ , HTable (Eval (GGColumns algebra TColumns (Eval (rep (Reify Result)))))
94+ , GGBuildable' algebra name rep
98+type GGBuildable' :: K.Algebra -> Symbol -> (K.Context -> Exp (Type -> Type)) -> Constraint
99+type family GGBuildable' algebra name rep where
100+ GGBuildable' 'K.Product name rep =
101+ ( name ~ GConstructor (Eval (rep (Reify Expr)))
102+ , name ~ GConstructor (Eval (rep (Reify Insert)))
103+ , Corep TUnreify (Eval (rep (Reify Expr)))
104+ , Corep TUnreify (Eval (rep (Reify Insert)))
105+ , GConstructable (TTable (Reify Expr)) TColumns TUnreify (Col (Reify Expr)) (Eval (rep (Reify Expr)))
106+ , GConstructable (TTable (Reify Insert)) TColumns TUnreify (Col (Reify Insert)) (Eval (rep (Reify Insert)))
108+ GGBuildable' 'K.Sum name rep =
109+ ( Corep TUnreify (GConstructorADT name (Eval (rep (Reify Expr))))
110+ , Corep TUnreify (GConstructorADT name (Eval (rep (Reify Insert))))
111+ , GMakeableADT (TTable (Reify Expr)) TColumns TUnreify (Col (Reify Expr)) name (Eval (rep (Reify Expr)))
112+ , GMakeableADT (TTable (Reify Insert)) TColumns TUnreify (Col (Reify Insert)) name (Eval (rep (Reify Insert)))
116+type GGBuild :: K.Algebra -> Symbol -> (K.Context -> Exp (Type -> Type)) -> Type -> Type
117+type family GGBuild algebra name rep r where
118+ GGBuild 'K.Product _name rep r =
119+ GConstruct TUnreify (Eval (rep (Reify Expr))) r
120+ GGBuild 'K.Sum name rep r =
121+ GConstruct TUnreify (GConstructorADT name (Eval (rep (Reify Expr)))) r
124+ggbuild :: forall algebra name rep a. GGBuildable algebra name rep
125+ => (Eval (GGColumns algebra TColumns (Eval (rep (Reify Result)))) (Col Expr) -> a)
126+ -> GGBuild algebra name rep a
127+ggbuild gfromColumns = case algebraSing @algebra of
129+ gtabulate @TUnreify @(Eval (rep (Reify Expr))) @a $
133+ @(TTable (Reify Expr))
137+ @(Eval (rep (Reify Expr)))
138+ (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
140+ gtabulate @TUnreify @(GConstructorADT name (Eval (rep (Reify Expr)))) @a $
144+ @(TTable (Reify Expr))
149+ @(Eval (rep (Reify Expr)))
150+ (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
151+ (\SSpec {info} -> Reify (DB (snull info)))
152+ (\SSpec {nullity} -> case nullity of
154+ NotNull -> \(Reify (DB a)) -> Reify (DB (nullify a)))
155+ (HType . Reify . DB . litExpr)
158+type GGInsert :: K.Algebra -> Symbol -> (K.Context -> Exp (Type -> Type)) -> Type -> Type
159+type family GGInsert algebra name rep r where
160+ GGInsert 'K.Product _name rep r =
161+ GConstruct TUnreify (Eval (rep (Reify Insert))) r
162+ GGInsert 'K.Sum name rep r =
163+ GConstruct TUnreify (GConstructorADT name (Eval (rep (Reify Insert)))) r
166+gginsert :: forall algebra name rep a. GGBuildable algebra name rep
167+ => (Eval (GGColumns algebra TColumns (Eval (rep (Reify Result)))) (Col Insert) -> a)
168+ -> GGInsert algebra name rep a
169+gginsert gfromColumns = case algebraSing @algebra of
171+ gtabulate @TUnreify @(Eval (rep (Reify Insert))) @a $
175+ @(TTable (Reify Insert))
178+ @(Col (Reify Insert))
179+ @(Eval (rep (Reify Insert)))
180+ (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
182+ gtabulate @TUnreify @(GConstructorADT name (Eval (rep (Reify Insert)))) @a $
186+ @(TTable (Reify Insert))
189+ @(Col (Reify Insert))
191+ @(Eval (rep (Reify Insert)))
192+ (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
193+ (\SSpec {necessity, info} -> Reify $ case necessity of
194+ SRequired -> RequiredInsert (snull info)
195+ SOptional -> OptionalInsert (Just (snull info)))
196+ (\SSpec {nullity} -> case nullity of
199+ Reify (RequiredInsert a) -> Reify (RequiredInsert (nullify a))
200+ Reify (OptionalInsert a) -> Reify (OptionalInsert (nullify <$> a)))
201+ (HType . Reify . RequiredInsert . litExpr)
81type GGConstructable :: K.Algebra -> (K.Context -> Exp (Type -> Type)) -> Constraint
204type GGConstructable :: K.Algebra -> (K.Context -> Exp (Type -> Type)) -> Constraint
82type GGConstructable algebra rep =
205type GGConstructable algebra rep =
83 ( KnownAlgebra algebra
206 ( KnownAlgebra algebra
@@ -121,8 +244,10 @@ type family GGConstructable' algebra rep where
122type GGConstruct :: K.Algebra -> (K.Context -> Exp (Type -> Type)) -> Type -> Type
245type GGConstruct :: K.Algebra -> (K.Context -> Exp (Type -> Type)) -> Type -> Type
123type family GGConstruct algebra rep r where
246type family GGConstruct algebra rep r where
247+ GGConstruct 'K.Product rep r =
124− GGConstruct 'K.Product rep r = GConstruct TUnreify (Eval (rep (Reify Expr))) r -> r
248+ GConstruct TUnreify (Eval (rep (Reify Expr))) r -> r
249+ GGConstruct 'K.Sum rep r =
125− GGConstruct 'K.Sum rep r = GConstructADT TUnreify (Eval (rep (Reify Expr))) r r
250+ GConstructADT TUnreify (Eval (rep (Reify Expr))) r r
128ggconstruct :: forall algebra rep a. GGConstructable algebra rep
253ggconstruct :: forall algebra rep a. GGConstructable algebra rep
@@ -204,52 +329,6 @@ ggdeconstruct gtoColumns = case algebraSing @algebra of
204 case_ cases' r
329 case_ cases' r
207−type GGInsert :: K.Algebra -> (K.Context -> Exp (Type -> Type)) -> Type -> Type
208−type family GGInsert algebra rep r where
209− GGInsert 'K.Product rep r =
210− GConstruct TUnreify (Eval (rep (Reify Insert))) r -> r
211− GGInsert 'K.Sum rep r =
212− GConstructADT TUnreify (Eval (rep (Reify Insert))) r r
215−gginsert :: forall algebra rep a. GGConstructable algebra rep
216− => (Eval (GGColumns algebra TColumns (Eval (rep (Reify Result)))) (Col Insert) -> a)
217− -> GGInsert algebra rep a
219−gginsert gfromColumns f = case algebraSing @algebra of
222− gtabulate @TUnreify @(Eval (rep (Reify Insert))) @a $
226− @(TTable (Reify Insert))
229− @(Col (Reify Insert))
230− @(Eval (rep (Reify Insert)))
231− (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
233− gcindex @TUnreify @(Eval (rep (Reify Insert))) @a f $
234− fmap (gfromColumns . hunreify) $
236− @(TTable (Reify Insert))
239− @(Col (Reify Insert))
240− @(Eval (rep (Reify Insert)))
241− (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
242− (\SSpec {necessity, info} -> Reify $ case necessity of
243− SRequired -> RequiredInsert (snull info)
244− SOptional -> OptionalInsert (Just (snull info)))
245− (\SSpec {nullity} -> case nullity of
248− Reify (RequiredInsert a) -> Reify (RequiredInsert (nullify a))
249− Reify (OptionalInsert a) -> Reify (OptionalInsert (nullify <$> a)))
250− (HType . Reify . RequiredInsert . litExpr)
253type GGName :: K.Algebra -> (K.Context -> Exp (Type -> Type)) -> Type -> Type
332type GGName :: K.Algebra -> (K.Context -> Exp (Type -> Type)) -> Type -> Type
254type family GGName algebra rep a where
333type family GGName algebra rep a where
255 GGName 'K.Product rep a = GConstruct TUnreify (Eval (rep (Reify Name))) a
334 GGName 'K.Product rep a = GConstruct TUnreify (Eval (rep (Reify Name))) a