@@ -22,7 +22,6 @@ module Rel8.Generic.Construction
22 , GGDeconstruct, ggdeconstruct
22 , GGDeconstruct, ggdeconstruct
23 , GGName, ggname
23 , GGName, ggname
24 , GGAggregate, ggaggregate
24 , GGAggregate, ggaggregate
25− , GGAggregate', ggaggregate'
@@ -35,25 +34,25 @@ import GHC.TypeLits ( Symbol )
35import Prelude
34import Prelude
38−import Rel8.Aggregate ( Col( A ), Aggregate )
37+import Rel8.Aggregate ( Col( A ), Aggregate( Aggregate ) )
39import Rel8.Expr ( Col( E ), Expr )
38import Rel8.Expr ( Col( E ), Expr )
40import Rel8.Expr.Aggregate ( groupByExpr )
39import Rel8.Expr.Aggregate ( groupByExpr )
41import Rel8.Expr.Eq ( (==.) )
40import Rel8.Expr.Eq ( (==.) )
42import Rel8.Expr.Null ( nullify, snull, unsafeUnnullify )
41import Rel8.Expr.Null ( nullify, snull, unsafeUnnullify )
43import Rel8.Expr.Serialize ( litExpr )
42import Rel8.Expr.Serialize ( litExpr )
44−import Rel8.FCF ( Compose, Eval, Exp )
43+import Rel8.FCF ( Eval, Exp )
45import Rel8.Generic.Construction.ADT
44import Rel8.Generic.Construction.ADT
46 ( GConstructorADT, GMakeableADT, gmakeADT
45 ( GConstructorADT, GMakeableADT, gmakeADT
47 , GConstructableADT
46 , GConstructableADT
48 , GBuildADT, gbuildADT, gunbuildADT
47 , GBuildADT, gbuildADT, gunbuildADT
49 , GConstructADT, gconstructADT, gdeconstructADT
48 , GConstructADT, gconstructADT, gdeconstructADT
50 , RepresentableConstructors, GConstructors, gcindex, gctabulate
49 , RepresentableConstructors, GConstructors, gcindex, gctabulate
51− , RepresentableFields, gfindex, gftabulate, gftraverse
50+ , RepresentableFields, gfindex, gftabulate
53import Rel8.Generic.Construction.Record
52import Rel8.Generic.Construction.Record
54 ( GConstructor
53 ( GConstructor
55 , GConstructable, GConstruct, gconstruct, gdeconstruct
54 , GConstructable, GConstruct, gconstruct, gdeconstruct
56− , Representable, gindex, gtabulate, gtraverse
55+ , Representable, gindex, gtabulate
58import Rel8.Generic.Table ( GGColumns )
57import Rel8.Generic.Table ( GGColumns )
59import Rel8.Kind.Algebra
58import Rel8.Kind.Algebra
@@ -78,9 +77,6 @@ import Rel8.Table
78import Rel8.Table.Bool ( case_ )
77import Rel8.Table.Bool ( case_ )
79import Rel8.Type.Tag ( Tag )
78import Rel8.Type.Tag ( Tag )
82−import Data.Functor.Apply ( Apply, MaybeApply( MaybeApply ), liftF2 )
85type GGBuildable :: K.Algebra -> Symbol -> (K.Context -> Exp (Type -> Type)) -> Constraint
81type GGBuildable :: K.Algebra -> Symbol -> (K.Context -> Exp (Type -> Type)) -> Constraint
86type GGBuildable algebra name rep =
82type GGBuildable algebra name rep =
@@ -213,8 +209,7 @@ type GGConstructable algebra rep =
213type GGConstructable' :: K.Algebra -> (K.Context -> Exp (Type -> Type)) -> Constraint
209type GGConstructable' :: K.Algebra -> (K.Context -> Exp (Type -> Type)) -> Constraint
214type family GGConstructable' algebra rep where
210type family GGConstructable' algebra rep where
215 GGConstructable' 'K.Product rep =
211 GGConstructable' 'K.Product rep =
216− ( Representable (Compose Aggregate TUnreify) (Eval (rep (Reify Expr)))
217− , Representable TUnreify (Eval (rep (Reify Aggregate)))
212+ ( Representable TUnreify (Eval (rep (Reify Aggregate)))
218 , Representable TUnreify (Eval (rep (Reify Expr)))
213 , Representable TUnreify (Eval (rep (Reify Expr)))
219 , Representable TUnreify (Eval (rep (Reify Insert)))
214 , Representable TUnreify (Eval (rep (Reify Insert)))
220 , Representable TUnreify (Eval (rep (Reify Name)))
215 , Representable TUnreify (Eval (rep (Reify Name)))
@@ -226,7 +221,6 @@ type family GGConstructable' algebra rep where
226 GGConstructable' 'K.Sum rep =
221 GGConstructable' 'K.Sum rep =
227 ( RepresentableConstructors TUnreify (Eval (rep (Reify Expr)))
222 ( RepresentableConstructors TUnreify (Eval (rep (Reify Expr)))
228 , RepresentableConstructors TUnreify (Eval (rep (Reify Insert)))
223 , RepresentableConstructors TUnreify (Eval (rep (Reify Insert)))
229− , RepresentableFields (Compose Aggregate TUnreify) (Eval (rep (Reify Expr)))
230 , RepresentableFields TUnreify (Eval (rep (Reify Aggregate)))
224 , RepresentableFields TUnreify (Eval (rep (Reify Aggregate)))
231 , RepresentableFields TUnreify (Eval (rep (Reify Expr)))
225 , RepresentableFields TUnreify (Eval (rep (Reify Expr)))
232 , RepresentableFields TUnreify (Eval (rep (Reify Name)))
226 , RepresentableFields TUnreify (Eval (rep (Reify Name)))
@@ -365,99 +359,18 @@ ggname gfromColumns = case algebraSing @algebra of
365type GGAggregate :: K.Algebra -> (K.Context -> Exp (Type -> Type)) -> Type -> Type
359type GGAggregate :: K.Algebra -> (K.Context -> Exp (Type -> Type)) -> Type -> Type
366type family GGAggregate algebra rep r where
360type family GGAggregate algebra rep r where
367 GGAggregate 'K.Product rep r =
361 GGAggregate 'K.Product rep r =
368− GConstruct (Compose Aggregate TUnreify) (Eval (rep (Reify Expr))) r ->
369− GConstruct TUnreify (Eval (rep (Reify Expr))) r
370− GGAggregate 'K.Sum rep r =
371− GBuildADT (Compose Aggregate TUnreify) (Eval (rep (Reify Expr))) r ->
372− GBuildADT TUnreify (Eval (rep (Reify Expr))) r
375−ggaggregate :: forall algebra rep a. GGConstructable algebra rep
376− => (Eval (GGColumns algebra TColumns (Eval (rep (Reify Result)))) (Col Expr) -> a)
377− -> (a -> Eval (GGColumns algebra TColumns (Eval (rep (Reify Result)))) (Col Expr))
378− -> GGAggregate algebra rep (Aggregate a) -> a -> Aggregate a
379−ggaggregate gfromColumns gtoColumns agg es = case algebraSing @algebra of
380− SProduct -> flip f exprs $
385− @(TTable (Reify Expr))
389− @(Eval (rep (Reify Expr)))
390− (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
393− gtraverse @TUnreify @(Eval (rep (Reify Expr))) @_ @Aggregate (MaybeApply . Left)
396− gindex @TUnreify @(Eval (rep (Reify Expr))) @(Aggregate a) .
398− gtabulate @(Compose Aggregate TUnreify) @(Eval (rep (Reify Expr))) @(Aggregate a)
401− @(TTable (Reify Expr))
405− @(Eval (rep (Reify Expr)))
406− (\(_ :: proxy x) -> unreify @_ @x Refl . fromColumns) $
409− SSum -> flip f exprs $
415− @(TTable (Reify Expr))
419− @(Eval (rep (Reify Expr)))
420− (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
421− (\tag'' SSpec {nullity} (Reify (E a)) ->
422− Reify $ E $ runTag nullity (tag ==. litExpr tag'') a)
423− (HType (Reify (E tag'))))
425− gftraverse @TUnreify @(Eval (rep (Reify Expr))) @_ @Aggregate (MaybeApply . Left)
428− gfindex @TUnreify @(Eval (rep (Reify Expr))) @(Aggregate a) .
430− gftabulate @(Compose Aggregate TUnreify) @(Eval (rep (Reify Expr))) @(Aggregate a)
431− (HType (Reify (E tag)), exprs) =
433− @(TTable (Reify Expr))
437− @(Eval (rep (Reify Expr)))
438− (\(_ :: proxy x) -> unreify @_ @x Refl . fromColumns)
439− (\SSpec {nullity} -> case nullity of
441− NotNull -> \(Reify (E a)) -> Reify (E (unsafeUnnullify a))) $
446−type GGAggregate' :: K.Algebra -> (K.Context -> Exp (Type -> Type)) -> Type -> Type
447−type family GGAggregate' algebra rep r where
448− GGAggregate' 'K.Product rep r =
449 GConstruct TUnreify (Eval (rep (Reify Aggregate))) r ->
362 GConstruct TUnreify (Eval (rep (Reify Aggregate))) r ->
450 GConstruct TUnreify (Eval (rep (Reify Expr))) r
363 GConstruct TUnreify (Eval (rep (Reify Expr))) r
451− GGAggregate' 'K.Sum rep r =
364+ GGAggregate 'K.Sum rep r =
452 GBuildADT TUnreify (Eval (rep (Reify Aggregate))) r ->
365 GBuildADT TUnreify (Eval (rep (Reify Aggregate))) r ->
453 GBuildADT TUnreify (Eval (rep (Reify Expr))) r
366 GBuildADT TUnreify (Eval (rep (Reify Expr))) r
456−ggaggregate' :: forall algebra rep exprs agg. GGConstructable algebra rep
369+ggaggregate :: forall algebra rep exprs agg. GGConstructable algebra rep
457 => (Eval (GGColumns algebra TColumns (Eval (rep (Reify Result)))) (Col Aggregate) -> agg)
370 => (Eval (GGColumns algebra TColumns (Eval (rep (Reify Result)))) (Col Aggregate) -> agg)
458 -> (exprs -> Eval (GGColumns algebra TColumns (Eval (rep (Reify Result)))) (Col Expr))
371 -> (exprs -> Eval (GGColumns algebra TColumns (Eval (rep (Reify Result)))) (Col Expr))
459− -> GGAggregate' algebra rep agg -> exprs -> agg
372+ -> GGAggregate algebra rep agg -> exprs -> agg
460−ggaggregate' gfromColumns gtoColumns agg es = case algebraSing @algebra of
373+ggaggregate gfromColumns gtoColumns agg es = case algebraSing @algebra of
461 SProduct -> flip f exprs $
374 SProduct -> flip f exprs $
462 gfromColumns .
375 gfromColumns .
463 hunreify .
376 hunreify .
@@ -493,8 +406,8 @@ ggaggregate' gfromColumns gtoColumns agg es = case algebraSing @algebra of
493 @(Col (Reify Aggregate))
406 @(Col (Reify Aggregate))
494 @(Eval (rep (Reify Aggregate)))
407 @(Eval (rep (Reify Aggregate)))
495 (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
408 (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
496− (\tag' SSpec {nullity} (Reify (A a)) ->
409+ (\tag' SSpec {nullity} (Reify (A (Aggregate a))) ->
497− Reify $ A $ runTag nullity (tag ==. litExpr tag') <$> a)
410+ Reify $ A $ Aggregate $ runTag nullity (tag ==. litExpr tag') <$> a)
498 (HType (Reify (A (groupByExpr tag))))
411 (HType (Reify (A (groupByExpr tag))))
@@ -514,15 +427,3 @@ ggaggregate' gfromColumns gtoColumns agg es = case algebraSing @algebra of
514 NotNull -> \(Reify (E a)) -> Reify (E (unsafeUnnullify a))) $
427 NotNull -> \(Reify (E a)) -> Reify (E (unsafeUnnullify a))) $
516 gtoColumns es
429 gtoColumns es
519−liftF½ :: MaybeApply Aggregate a -> Aggregate a
520−liftF½ (MaybeApply ma) = case ma of
522− Right a -> a <$ groupByExpr (litExpr False)
525−liftF1½ :: Apply v => (a -> b -> c) -> v a -> MaybeApply v b -> v c
526−liftF1½ f a (MaybeApply eb) = case eb of
527− Left b -> liftF2 f a b
528− Right b -> fmap (`f` b) a