1{-# language AllowAmbiguousTypes #-}
2{-# language ConstraintKinds #-}
3{-# language DataKinds #-}
4{-# language FlexibleContexts #-}
5{-# language FlexibleInstances #-}
6{-# language LambdaCase #-}
7{-# language MultiParamTypeClasses #-}
8{-# language NamedFieldPuns #-}
9{-# language ScopedTypeVariables #-}
10{-# language StandaloneKindSignatures #-}
11{-# language TypeApplications #-}
12{-# language TypeFamilies #-}
13{-# language UndecidableInstances #-}
14{-# language ViewPatterns #-}
16module Rel8.Generic.Construction
20 , GGConstruct, ggconstruct
21 , GGDeconstruct, ggdeconstruct
23 , GGAggregate, ggaggregate
28import Data.Bifunctor ( first )
29import Data.Kind ( Constraint, Type )
30import Data.List.NonEmpty ( NonEmpty( (:|) ) )
31import Data.Type.Equality ( (:~:)( Refl ) )
32import GHC.TypeLits ( Symbol )
36import Rel8.Aggregate ( Col( A ), Aggregate( Aggregate ) )
37import Rel8.Expr ( Col( E ), Expr )
38import Rel8.Expr.Aggregate ( groupByExpr )
39import Rel8.Expr.Eq ( (==.) )
40import Rel8.Expr.Null ( nullify, snull, unsafeUnnullify )
41import Rel8.Expr.Serialize ( litExpr )
42import Rel8.FCF ( Eval, Exp )
43import Rel8.Generic.Construction.ADT
44 ( GConstructorADT, GMakeableADT, gmakeADT
46 , GBuildADT, gbuildADT, gunbuildADT
47 , GConstructADT, gconstructADT, gdeconstructADT
48 , RepresentableConstructors, GConstructors, gcindex, gctabulate
49 , RepresentableFields, gfindex, gftabulate
51import Rel8.Generic.Construction.Record
53 , GConstructable, GConstruct, gconstruct, gdeconstruct
54 , Representable, gindex, gtabulate
56import Rel8.Generic.Table ( GGColumns )
57import Rel8.Kind.Algebra
58 ( SAlgebra( SProduct, SSum )
59 , KnownAlgebra, algebraSing
61import qualified Rel8.Kind.Algebra as K
62import Rel8.Schema.Context.Nullify ( runTag )
63import Rel8.Schema.HTable ( HTable )
64import Rel8.Schema.HTable.Identity ( HIdentity( HType ) )
65import qualified Rel8.Schema.Kind as K
66import Rel8.Schema.Name ( Col( N ), Name( Name ) )
67import Rel8.Schema.Null ( Nullity( Null, NotNull ) )
68import Rel8.Schema.Spec ( SSpec( SSpec, nullity, info ) )
69import Rel8.Schema.Reify ( Col( Reify ), Reify, hreify, hunreify )
70import Rel8.Schema.Result ( Result )
72 ( TTable, TColumns, TUnreify
73 , Table, fromColumns, toColumns, reify, unreify
75import Rel8.Table.Bool ( case_ )
76import Rel8.Type.Tag ( Tag )
79type GGBuildable :: K.Algebra -> Symbol -> (K.Context -> Exp (Type -> Type)) -> Constraint
80type GGBuildable algebra name rep =
81 ( KnownAlgebra algebra
82 , Eval (GGColumns algebra TColumns (Eval (rep (Reify Aggregate)))) ~ Eval (GGColumns algebra TColumns (Eval (rep (Reify Result))))
83 , Eval (GGColumns algebra TColumns (Eval (rep (Reify Expr)))) ~ Eval (GGColumns algebra TColumns (Eval (rep (Reify Result))))
84 , Eval (GGColumns algebra TColumns (Eval (rep (Reify Name)))) ~ Eval (GGColumns algebra TColumns (Eval (rep (Reify Result))))
85 , HTable (Eval (GGColumns algebra TColumns (Eval (rep (Reify Result)))))
86 , GGBuildable' algebra name rep
90type GGBuildable' :: K.Algebra -> Symbol -> (K.Context -> Exp (Type -> Type)) -> Constraint
91type family GGBuildable' algebra name rep where
92 GGBuildable' 'K.Product name rep =
93 ( name ~ GConstructor (Eval (rep (Reify Expr)))
94 , Representable TUnreify (Eval (rep (Reify Expr)))
95 , GConstructable (TTable (Reify Expr)) TColumns TUnreify (Col (Reify Expr)) (Eval (rep (Reify Expr)))
97 GGBuildable' 'K.Sum name rep =
98 ( Representable TUnreify (GConstructorADT name (Eval (rep (Reify Expr))))
99 , GMakeableADT (TTable (Reify Expr)) TColumns TUnreify (Col (Reify Expr)) name (Eval (rep (Reify Expr)))
103type GGBuild :: K.Algebra -> Symbol -> (K.Context -> Exp (Type -> Type)) -> Type -> Type
104type family GGBuild algebra name rep r where
105 GGBuild 'K.Product _name rep r =
106 GConstruct TUnreify (Eval (rep (Reify Expr))) r
107 GGBuild 'K.Sum name rep r =
108 GConstruct TUnreify (GConstructorADT name (Eval (rep (Reify Expr)))) r
111ggbuild :: forall algebra name rep a. GGBuildable algebra name rep
112 => (Eval (GGColumns algebra TColumns (Eval (rep (Reify Result)))) (Col Expr) -> a)
113 -> GGBuild algebra name rep a
114ggbuild gfromColumns = case algebraSing @algebra of
116 gtabulate @TUnreify @(Eval (rep (Reify Expr))) @a $
120 @(TTable (Reify Expr))
124 @(Eval (rep (Reify Expr)))
125 (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
127 gtabulate @TUnreify @(GConstructorADT name (Eval (rep (Reify Expr)))) @a $
131 @(TTable (Reify Expr))
136 @(Eval (rep (Reify Expr)))
137 (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
138 (\SSpec {info} -> Reify (E (snull info)))
139 (\SSpec {nullity} -> case nullity of
141 NotNull -> \(Reify (E a)) -> Reify (E (nullify a)))
142 (HType . Reify . E . litExpr)
145type GGConstructable :: K.Algebra -> (K.Context -> Exp (Type -> Type)) -> Constraint
146type GGConstructable algebra rep =
147 ( KnownAlgebra algebra
148 , Eval (GGColumns algebra TColumns (Eval (rep (Reify Aggregate)))) ~ Eval (GGColumns algebra TColumns (Eval (rep (Reify Result))))
149 , Eval (GGColumns algebra TColumns (Eval (rep (Reify Expr)))) ~ Eval (GGColumns algebra TColumns (Eval (rep (Reify Result))))
150 , Eval (GGColumns algebra TColumns (Eval (rep (Reify Name)))) ~ Eval (GGColumns algebra TColumns (Eval (rep (Reify Result))))
151 , HTable (Eval (GGColumns algebra TColumns (Eval (rep (Reify Result)))))
152 , GGConstructable' algebra rep
156type GGConstructable' :: K.Algebra -> (K.Context -> Exp (Type -> Type)) -> Constraint
157type family GGConstructable' algebra rep where
158 GGConstructable' 'K.Product rep =
159 ( Representable TUnreify (Eval (rep (Reify Aggregate)))
160 , Representable TUnreify (Eval (rep (Reify Expr)))
161 , Representable TUnreify (Eval (rep (Reify Name)))
162 , GConstructable (TTable (Reify Aggregate)) TColumns TUnreify (Col (Reify Aggregate)) (Eval (rep (Reify Aggregate)))
163 , GConstructable (TTable (Reify Expr)) TColumns TUnreify (Col (Reify Expr)) (Eval (rep (Reify Expr)))
164 , GConstructable (TTable (Reify Name)) TColumns TUnreify (Col (Reify Name)) (Eval (rep (Reify Name)))
166 GGConstructable' 'K.Sum rep =
167 ( RepresentableConstructors TUnreify (Eval (rep (Reify Expr)))
168 , RepresentableFields TUnreify (Eval (rep (Reify Aggregate)))
169 , RepresentableFields TUnreify (Eval (rep (Reify Expr)))
170 , RepresentableFields TUnreify (Eval (rep (Reify Name)))
171 , Functor (GConstructors TUnreify (Eval (rep (Reify Expr))))
172 , GConstructableADT (TTable (Reify Aggregate)) TColumns TUnreify (Col (Reify Aggregate)) (Eval (rep (Reify Aggregate)))
173 , GConstructableADT (TTable (Reify Expr)) TColumns TUnreify (Col (Reify Expr)) (Eval (rep (Reify Expr)))
174 , GConstructableADT (TTable (Reify Name)) TColumns TUnreify (Col (Reify Name)) (Eval (rep (Reify Name)))
178type GGConstruct :: K.Algebra -> (K.Context -> Exp (Type -> Type)) -> Type -> Type
179type family GGConstruct algebra rep r where
180 GGConstruct 'K.Product rep r =
181 GConstruct TUnreify (Eval (rep (Reify Expr))) r -> r
182 GGConstruct 'K.Sum rep r =
183 GConstructADT TUnreify (Eval (rep (Reify Expr))) r r
186ggconstruct :: forall algebra rep a. GGConstructable algebra rep
187 => (Eval (GGColumns algebra TColumns (Eval (rep (Reify Result)))) (Col Expr) -> a)
188 -> GGConstruct algebra rep a -> a
189ggconstruct gfromColumns f = case algebraSing @algebra of
192 gtabulate @TUnreify @(Eval (rep (Reify Expr))) @a $
196 @(TTable (Reify Expr))
200 @(Eval (rep (Reify Expr)))
201 (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
203 gcindex @TUnreify @(Eval (rep (Reify Expr))) @a f $
204 fmap (gfromColumns . hunreify) $
206 @(TTable (Reify Expr))
210 @(Eval (rep (Reify Expr)))
211 (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
212 (\SSpec {info} -> Reify (E (snull info)))
213 (\SSpec {nullity} -> case nullity of
215 NotNull -> \(Reify (E a)) -> Reify (E (nullify a)))
216 (HType . Reify . E . litExpr)
219type GGDeconstruct :: K.Algebra -> (K.Context -> Exp (Type -> Type)) -> Type -> Type -> Type
220type family GGDeconstruct algebra rep a r where
221 GGDeconstruct 'K.Product rep a r =
222 GConstruct TUnreify (Eval (rep (Reify Expr))) r -> a -> r
223 GGDeconstruct 'K.Sum rep a r =
224 GConstructADT TUnreify (Eval (rep (Reify Expr))) r (a -> r)
227ggdeconstruct :: forall algebra rep a r. (GGConstructable algebra rep, Table Expr r)
228 => (a -> Eval (GGColumns algebra TColumns (Eval (rep (Reify Result)))) (Col Expr))
229 -> GGDeconstruct algebra rep a r
230ggdeconstruct gtoColumns = case algebraSing @algebra of
231 SProduct -> \build ->
232 gindex @TUnreify @(Eval (rep (Reify Expr))) @r build .
234 @(TTable (Reify Expr))
238 @(Eval (rep (Reify Expr)))
239 (\(_ :: proxy x) -> unreify @_ @x Refl . fromColumns) .
243 gctabulate @TUnreify @(Eval (rep (Reify Expr))) @r @(a -> r) $ \constructors as ->
245 (HType (Reify (E tag)), cases) =
247 @(TTable (Reify Expr))
251 @(Eval (rep (Reify Expr)))
252 (\(_ :: proxy x) -> unreify @_ @x Refl . fromColumns)
253 (\SSpec {nullity} -> case nullity of
255 NotNull -> \(Reify (E a)) -> Reify (E (unsafeUnnullify a)))
261 ((_, r) :| (map (first ((tag ==.) . litExpr)) -> cases')) ->
265type GGName :: K.Algebra -> (K.Context -> Exp (Type -> Type)) -> Type -> Type
266type family GGName algebra rep a where
267 GGName 'K.Product rep a = GConstruct TUnreify (Eval (rep (Reify Name))) a
268 GGName 'K.Sum rep a = Name Tag -> GBuildADT TUnreify (Eval (rep (Reify Name))) a
271ggname :: forall algebra rep a. GGConstructable algebra rep
272 => (Eval (GGColumns algebra TColumns (Eval (rep (Reify Result)))) (Col Name) -> a)
273 -> GGName algebra rep a
274ggname gfromColumns = case algebraSing @algebra of
276 gtabulate @TUnreify @(Eval (rep (Reify Name))) @a $
280 @(TTable (Reify Name))
284 @(Eval (rep (Reify Name)))
285 (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
287 gftabulate @TUnreify @(Eval (rep (Reify Name))) @a $
291 @(TTable (Reify Name))
295 @(Eval (rep (Reify Name)))
296 (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
297 (\_ _ (Reify (N (Name a))) -> Reify (N (Name a)))
298 (HType (Reify (N tag)))
301type GGAggregate :: K.Algebra -> (K.Context -> Exp (Type -> Type)) -> Type -> Type
302type family GGAggregate algebra rep r where
303 GGAggregate 'K.Product rep r =
304 GConstruct TUnreify (Eval (rep (Reify Aggregate))) r ->
305 GConstruct TUnreify (Eval (rep (Reify Expr))) r
306 GGAggregate 'K.Sum rep r =
307 GBuildADT TUnreify (Eval (rep (Reify Aggregate))) r ->
308 GBuildADT TUnreify (Eval (rep (Reify Expr))) r
311ggaggregate :: forall algebra rep exprs agg. GGConstructable algebra rep
312 => (Eval (GGColumns algebra TColumns (Eval (rep (Reify Result)))) (Col Aggregate) -> agg)
313 -> (exprs -> Eval (GGColumns algebra TColumns (Eval (rep (Reify Result)))) (Col Expr))
314 -> GGAggregate algebra rep agg -> exprs -> agg
315ggaggregate gfromColumns gtoColumns agg es = case algebraSing @algebra of
316 SProduct -> flip f exprs $
320 @(TTable (Reify Aggregate))
323 @(Col (Reify Aggregate))
324 @(Eval (rep (Reify Aggregate)))
325 (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
328 gindex @TUnreify @(Eval (rep (Reify Expr))) @agg .
330 gtabulate @TUnreify @(Eval (rep (Reify Aggregate))) @agg
333 @(TTable (Reify Expr))
337 @(Eval (rep (Reify Expr)))
338 (\(_ :: proxy x) -> unreify @_ @x Refl . fromColumns) $
341 SSum -> flip f exprs $
345 @(TTable (Reify Aggregate))
348 @(Col (Reify Aggregate))
349 @(Eval (rep (Reify Aggregate)))
350 (\(_ :: proxy x) -> toColumns . reify @_ @x Refl)
351 (\tag' SSpec {nullity} (Reify (A (Aggregate a))) ->
352 Reify $ A $ Aggregate $ runTag nullity (tag ==. litExpr tag') <$> a)
353 (HType (Reify (A (groupByExpr tag))))
356 gfindex @TUnreify @(Eval (rep (Reify Expr))) @agg .
358 gftabulate @TUnreify @(Eval (rep (Reify Aggregate))) @agg
359 (HType (Reify (E tag)), exprs) =
361 @(TTable (Reify Expr))
365 @(Eval (rep (Reify Expr)))
366 (\(_ :: proxy x) -> unreify @_ @x Refl . fromColumns)
367 (\SSpec {nullity} -> case nullity of
369 NotNull -> \(Reify (E a)) -> Reify (E (unsafeUnnullify a))) $
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list