@@ -0,0 +1,1020 @@
1+{-# language AllowAmbiguousTypes #-}
2+{-# language DataKinds #-}
3+{-# language DisambiguateRecordFields #-}
4+{-# language DefaultSignatures #-}
5+{-# language FlexibleContexts #-}
6+{-# language FlexibleInstances #-}
7+{-# language GADTs #-}
8+{-# language MultiParamTypeClasses #-}
9+{-# language ScopedTypeVariables #-}
10+{-# language StandaloneKindSignatures #-}
11+{-# language TypeApplications #-}
12+{-# language TypeFamilies #-}
13+{-# language TypeOperators #-}
14+{-# language UndecidableInstances #-}
15+{-# language ViewPatterns #-}
16+
17+{-# options_ghc -fno-warn-orphans #-}
18+
19+module Rel8.Schema.Generic
20+ ( Rel8able
21+ )
22+where
23+
24+-- base
25+import Data.Bifunctor ( bimap )
26+import Data.Functor.Identity ( Identity )
27+import Data.Kind ( Constraint, Type )
28+import Data.List.NonEmpty ( NonEmpty )
29+import GHC.Generics
30+ ( Generic, Rep, from, to
31+ , (:*:)( (:*:) ), K1( K1 ), M1( M1 )
32+ , D, C, S
33+ , Meta( MetaSel )
34+ )
35+import GHC.TypeLits ( Symbol )
36+import Prelude
37+
38+-- rel8
39+import Rel8.Aggregate ( Aggregate )
40+import Rel8.Expr ( Expr )
41+import Rel8.Kind.Necessity
42+ ( SNecessity( SRequired, SOptional )
43+ , KnownNecessity, necessitySing
44+ )
45+import Rel8.Schema.Context
46+import Rel8.Schema.Context.Identity
47+ ( fromHEitherTable, toHEitherTable
48+ , fromHListTable, toHListTable
49+ , fromHMaybeTable, toHMaybeTable
50+ , fromHNonEmptyTable, toHNonEmptyTable
51+ , fromHTheseTable, toHTheseTable
52+ )
53+import Rel8.Schema.Context.Label
54+ ( Labelable, labeler, unlabeler
55+ , hlabeler, hunlabeler
56+ )
57+import Rel8.Schema.Context.Nullify ( Nullifiable )
58+import Rel8.Schema.Field ( Field )
59+import Rel8.Schema.HTable ( HTable )
60+import Rel8.Schema.HTable.Either ( HEitherTable )
61+import Rel8.Schema.HTable.Identity ( HIdentity(..) )
62+import Rel8.Schema.HTable.Label ( HLabel, hlabel, hunlabel )
63+import Rel8.Schema.HTable.List ( HListTable )
64+import Rel8.Schema.HTable.Maybe ( HMaybeTable )
65+import Rel8.Schema.HTable.NonEmpty ( HNonEmptyTable )
66+import Rel8.Schema.HTable.Pair ( HPair(..) )
67+import Rel8.Schema.HTable.Quartet ( HQuartet(..) )
68+import Rel8.Schema.HTable.Quintet ( HQuintet(..) )
69+import Rel8.Schema.HTable.These ( HTheseTable )
70+import Rel8.Schema.HTable.Trio ( HTrio(..) )
71+import Rel8.Schema.HTable.Vectorize ( hrelabel )
72+import qualified Rel8.Schema.Kind as K
73+import Rel8.Schema.Spec ( Spec( Spec ), KTable )
74+import Rel8.Schema.Structure
75+ ( IsStructure, Shape(..), Shape1, Shape2
76+ , Structure
77+ )
78+import Rel8.Table
79+ ( Table, Columns, Context, fromColumns, toColumns
80+ )
81+import Rel8.Table.Either ( EitherTable )
82+import Rel8.Table.Lifted
83+ ( fromColumns1, toColumns1
84+ , fromColumns2, toColumns2
85+ )
86+import Rel8.Table.List ( ListTable )
87+import Rel8.Table.Maybe ( MaybeTable(..) )
88+import Rel8.Table.NonEmpty ( NonEmptyTable )
89+import Rel8.Table.These ( TheseTable )
90+
91+-- these
92+import Data.These ( These )
93+
94+
95+instance (Rel8able t, TableHelper (IsSpecialContext context) context) =>
96+ Table context (t context)
97+ where
98+ type Columns (t context) = GRep t
99+ type Context (t context) = context
100+ fromColumns = gfromColumns
101+ toColumns = gtoColumns
102+
103+
104+type TableHelper :: Bool -> K.Context -> Constraint
105+class IsSpecialContext context ~ isSpecialContext =>
106+ TableHelper isSpecialContext context
107+ where
108+ gfromColumns :: Rel8able t => GRep t (Col context) -> t context
109+ gtoColumns :: Rel8able t => t context -> GRep t (Col context)
110+
111+
112+instance TableHelper 'True Aggregate where
113+ gfromColumns = fromAggregateColumns
114+ gtoColumns = toAggregateColumns
115+
116+
117+instance TableHelper 'True Expr where
118+ gfromColumns = fromExprColumns
119+ gtoColumns = toExprColumns
120+
121+
122+instance TableHelper 'True Insertion where
123+ gfromColumns = fromInsertionColumns
124+ gtoColumns = toInsertionColumns
125+
126+
127+instance TableHelper 'True Identity where
128+ gfromColumns = fromIdentityColumns
129+ gtoColumns = toIdentityColumns
130+
131+
132+instance (IsSpecialContext context ~ 'False, Labelable context, Nullifiable context) =>
133+ TableHelper 'False context
134+ where
135+ gfromColumns = fromUnspecialColumns
136+ gtoColumns = toUnspecialColumns
137+
138+
139+type Rel8able :: KTable -> Constraint
140+class HTable (GRep t) => Rel8able t where
141+ type GRep t :: K.HTable
142+
143+ fromAggregateColumns :: GRep t (Col Aggregate) -> t Aggregate
144+ toAggregateColumns :: t Aggregate -> GRep t (Col Aggregate)
145+
146+ fromExprColumns :: GRep t (Col Expr) -> t Expr
147+ toExprColumns :: t Expr -> GRep t (Col Expr)
148+
149+ fromInsertionColumns :: GRep t (Col Insertion) -> t Insertion
150+ toInsertionColumns :: t Insertion -> GRep t (Col Insertion)
151+
152+ fromIdentityColumns :: GRep t (Col Identity) -> t Identity
153+ toIdentityColumns :: t Identity -> GRep t (Col Identity)
154+
155+ fromUnspecialColumns ::
156+ ( IsSpecialContext context ~ 'False
157+ , Labelable context, Nullifiable context
158+ )
159+ => GRep t (Col context) -> t context
160+ toUnspecialColumns ::
161+ ( IsSpecialContext context ~ 'False
162+ , Labelable context, Nullifiable context
163+ )
164+ => t context -> GRep t (Col context)
165+
166+ type GRep t = GColumns (Rep (t Structure))
167+
168+ default fromAggregateColumns ::
169+ ( Generic (t Aggregate)
170+ , GColumns (Rep (t Structure)) ~ GRep t
171+ , GRel8able Aggregate (Rep (t Structure)) (Rep (t Aggregate))
172+ ) => GRep t (Col Aggregate) -> t Aggregate
173+ fromAggregateColumns = to . fromGColumns @_ @(Rep (t Structure))
174+
175+ default toAggregateColumns ::
176+ ( Generic (t Aggregate)
177+ , GColumns (Rep (t Structure)) ~ GRep t
178+ , GRel8able Aggregate (Rep (t Structure)) (Rep (t Aggregate))
179+ ) => t Aggregate -> GRep t (Col Aggregate)
180+ toAggregateColumns = toGColumns @_ @(Rep (t Structure)) . from
181+
182+ default fromExprColumns ::
183+ ( Generic (t Expr)
184+ , GColumns (Rep (t Structure)) ~ GRep t
185+ , GRel8able Expr (Rep (t Structure)) (Rep (t Expr))
186+ ) => GRep t (Col Expr) -> t Expr
187+ fromExprColumns = to . fromGColumns @_ @(Rep (t Structure))
188+
189+ default toExprColumns ::
190+ ( Generic (t Expr)
191+ , GColumns (Rep (t Structure)) ~ GRep t
192+ , GRel8able Expr (Rep (t Structure)) (Rep (t Expr))
193+ ) => t Expr -> GRep t (Col Expr)
194+ toExprColumns = toGColumns @_ @(Rep (t Structure)) . from
195+
196+ default fromInsertionColumns ::
197+ ( Generic (t Insertion)
198+ , GColumns (Rep (t Structure)) ~ GRep t
199+ , GRel8able Insertion (Rep (t Structure)) (Rep (t Insertion))
200+ ) => GRep t (Col Insertion) -> t Insertion
201+ fromInsertionColumns = to . fromGColumns @_ @(Rep (t Structure))
202+
203+ default toInsertionColumns ::
204+ ( Generic (t Insertion)
205+ , GColumns (Rep (t Structure)) ~ GRep t
206+ , GRel8able Insertion (Rep (t Structure)) (Rep (t Insertion))
207+ ) => t Insertion -> GRep t (Col Insertion)
208+ toInsertionColumns = toGColumns @_ @(Rep (t Structure)) . from
209+
210+ default fromIdentityColumns ::
211+ ( Generic (t Identity)
212+ , GColumns (Rep (t Structure)) ~ GRep t
213+ , GRel8able Identity (Rep (t Structure)) (Rep (t Identity))
214+ ) => GRep t (Col Identity) -> t Identity
215+ fromIdentityColumns = to . fromGColumns @_ @(Rep (t Structure))
216+
217+ default toIdentityColumns ::
218+ ( Generic (t Identity)
219+ , GColumns (Rep (t Structure)) ~ GRep t
220+ , GRel8able Identity (Rep (t Structure)) (Rep (t Identity))
221+ ) => t Identity -> GRep t (Col Identity)
222+ toIdentityColumns = toGColumns @_ @(Rep (t Structure)) . from
223+
224+ default fromUnspecialColumns ::
225+ ( Generic (t context)
226+ , GColumns (Rep (t Structure)) ~ GRep t
227+ , GRel8able context (Rep (t Structure)) (Rep (t context))
228+ ) => GRep t (Col context) -> t context
229+ fromUnspecialColumns = to . fromGColumns @_ @(Rep (t Structure))
230+
231+ default toUnspecialColumns ::
232+ ( Generic (t context)
233+ , GColumns (Rep (t Structure)) ~ GRep t
234+ , GRel8able context (Rep (t Structure)) (Rep (t context))
235+ ) => t context -> GRep t (Col context)
236+ toUnspecialColumns = toGColumns @_ @(Rep (t Structure)) . from
237+
238+
239+type GColumns :: (Type -> Type) -> K.HTable
240+type family GColumns structure where
241+ GColumns (M1 D _ structure) = GColumns structure
242+ GColumns (M1 C _ structure) = GColumns structure
243+ GColumns (a :*: b) = HPair (GColumns a) (GColumns b)
244+ GColumns (M1 S ('MetaSel ('Just label) _ _ _) (K1 _ structure)) =
245+ K1Columns label structure
246+
247+
248+type GRel8able :: K.Context -> (Type -> Type) -> (Type -> Type) -> Constraint
249+class GRel8able context structure rep where
250+ fromGColumns :: GColumns structure (Col context) -> rep x
251+ toGColumns :: rep x -> GColumns structure (Col context)
252+
253+
254+instance GRel8able context structure rep => GRel8able context (M1 D c structure) (M1 D c rep) where
255+ fromGColumns = M1 . fromGColumns @context @structure @rep
256+ toGColumns (M1 a) = toGColumns @context @structure @rep a
257+
258+
259+instance GRel8able context structure rep => GRel8able context (M1 C c structure) (M1 C c rep) where
260+ fromGColumns = M1 . fromGColumns @context @structure @rep
261+ toGColumns (M1 a) = toGColumns @context @structure @rep a
262+
263+
264+instance (GRel8able context structure1 rep1, GRel8able context structure2 rep2) =>
265+ GRel8able context (structure1 :*: structure2) (rep1 :*: rep2)
266+ where
267+ fromGColumns (HPair a b) =
268+ fromGColumns @context @structure1 @rep1 a :*:
269+ fromGColumns @context @structure2 @rep2 b
270+ toGColumns (a :*: b) =
271+ HPair
272+ (toGColumns @context @structure1 @rep1 a)
273+ (toGColumns @context @structure2 @rep2 b)
274+
275+
276+instance
277+ ( K1Table label isSpecialContext context isStructure structure a
278+ , meta ~ 'MetaSel ('Just label) _su _ss _ds
279+ , structureK1 ~ K1 i structure
280+ , k1 ~ K1 i a
281+ ) => GRel8able context (M1 S meta structureK1) (M1 S meta k1)
282+ where
283+ fromGColumns = M1 . K1 . fromK1Columns @label @_ @_ @_ @structure
284+ toGColumns (M1 (K1 a)) = toK1Columns @label @_ @_ @_ @structure a
285+
286+
287+type K1Columns :: Symbol -> Type -> K.HTable
288+type family K1Columns label structure where
289+ K1Columns label (Shape1 'Column ('Spec '[] necessity nullability blueprint)) =
290+ HIdentity ('Spec '[label] necessity nullability blueprint)
291+ K1Columns _label (Shape1 'Column ('Spec (label ': labels) necessity nullability blueprint)) =
292+ HIdentity ('Spec (label ': labels) necessity nullability blueprint)
293+ K1Columns label (Shape2 'Either a b) =
294+ HLabel label (HEitherTable (K1Columns "Left" a) (K1Columns "Right" b))
295+ K1Columns label (Shape1 'List a) = HListTable (K1Columns label a)
296+ K1Columns label (Shape1 'Maybe a) = HLabel label (HMaybeTable (K1Columns "Just" a))
297+ K1Columns label (Shape1 'NonEmpty a) = HNonEmptyTable (K1Columns label a)
298+ K1Columns label (Shape2 'These a b) =
299+ HLabel label (HTheseTable (K1Columns "Here" a) (K1Columns "There" b))
300+ K1Columns label (a, b) =
301+ HLabel label
302+ (HPair
303+ (K1Columns "fst" a)
304+ (K1Columns "snd" b))
305+ K1Columns label (a, b, c) =
306+ HLabel label
307+ (HTrio
308+ (K1Columns "fst" a)
309+ (K1Columns "snd" b)
310+ (K1Columns "trd" c))
311+ K1Columns label (a, b, c, d) =
312+ HLabel label
313+ (HQuartet
314+ (K1Columns "fst" a)
315+ (K1Columns "snd" b)
316+ (K1Columns "trd" c)
317+ (K1Columns "frt" d))
318+ K1Columns label (a, b, c, d, e) =
319+ HLabel label
320+ (HQuintet
321+ (K1Columns "fst" a)
322+ (K1Columns "snd" b)
323+ (K1Columns "trd" c)
324+ (K1Columns "frt" d)
325+ (K1Columns "fft" e))
326+ K1Columns label a = HLabel label (Columns a)
327+
328+
329+type K1Table :: Symbol -> Bool -> K.Context -> Bool -> Type -> Type -> Constraint
330+class
331+ ( isSpecialContext ~ IsSpecialContext context
332+ , isStructure ~ IsStructure structure
333+ ) => K1Table label isSpecialContext context isStructure structure a
334+ where
335+ fromK1Columns :: K1Columns label structure (Col context) -> a
336+ toK1Columns :: a -> K1Columns label structure (Col context)
337+
338+
339+instance
340+ ( x ~ Field Aggregate '[] necessity db a
341+ ) => K1Table label 'True Aggregate 'True (Shape1 'Column ('Spec '[] necessity db a)) x
342+ where
343+ fromK1Columns (HIdentity (Aggregation a)) = a
344+ toK1Columns = HIdentity . Aggregation
345+ {-# INLINABLE fromK1Columns #-}
346+ {-# INLINABLE toK1Columns #-}
347+
348+
349+instance
350+ ( x ~ Field Aggregate (label ': labels) necessity db a
351+ ) => K1Table _label 'True Aggregate 'True (Shape1 'Column ('Spec (label ': labels) necessity db a)) x
352+ where
353+ fromK1Columns (HIdentity (Aggregation a)) = a
354+ toK1Columns = HIdentity . Aggregation
355+ {-# INLINABLE fromK1Columns #-}
356+ {-# INLINABLE toK1Columns #-}
357+
358+
359+instance
360+ ( x ~ Field Expr '[] necessity db a
361+ ) => K1Table label 'True Expr 'True (Shape1 'Column ('Spec '[] necessity db a)) x
362+ where
363+ fromK1Columns (HIdentity (DB a)) = a
364+ toK1Columns = HIdentity . DB
365+ {-# INLINABLE fromK1Columns #-}
366+ {-# INLINABLE toK1Columns #-}
367+
368+
369+instance
370+ ( x ~ Field Expr (label ': labels) necessity db a
371+ ) => K1Table _label 'True Expr 'True (Shape1 'Column ('Spec (label ': labels) necessity db a)) x
372+ where
373+ fromK1Columns (HIdentity (DB a)) = a
374+ toK1Columns = HIdentity . DB
375+ {-# INLINABLE fromK1Columns #-}
376+ {-# INLINABLE toK1Columns #-}
377+
378+
379+instance
380+ ( x ~ Field Insertion '[] necessity db a
381+ , KnownNecessity necessity
382+ ) => K1Table label 'True Insertion 'True (Shape1 'Column ('Spec '[] necessity db a)) x
383+ where
384+ fromK1Columns (HIdentity insert) = case insert of
385+ RequiredInsert a -> a
386+ OptionalInsert ma -> ma
387+ toK1Columns a = HIdentity $ case necessitySing @necessity of
388+ SRequired -> RequiredInsert a
389+ SOptional -> OptionalInsert a
390+ {-# INLINABLE fromK1Columns #-}
391+ {-# INLINABLE toK1Columns #-}
392+
393+
394+instance
395+ ( x ~ Field Insertion (label ': labels) necessity db a
396+ , KnownNecessity necessity
397+ ) => K1Table _label 'True Insertion 'True (Shape1 'Column ('Spec (label ': labels) necessity db a)) x
398+ where
399+ fromK1Columns (HIdentity insert) = case insert of
400+ RequiredInsert a -> a
401+ OptionalInsert ma -> ma
402+ toK1Columns a = HIdentity $ case necessitySing @necessity of
403+ SRequired -> RequiredInsert a
404+ SOptional -> OptionalInsert a
405+ {-# INLINABLE fromK1Columns #-}
406+ {-# INLINABLE toK1Columns #-}
407+
408+
409+instance
410+ ( x ~ Field Identity '[] necessity db a
411+ ) => K1Table label 'True Identity 'True (Shape1 'Column ('Spec '[] necessity db a)) x
412+ where
413+ fromK1Columns (HIdentity (Result a)) = a
414+ toK1Columns = HIdentity . Result
415+ {-# INLINABLE fromK1Columns #-}
416+ {-# INLINABLE toK1Columns #-}
417+
418+
419+instance
420+ ( x ~ Field Identity (label ': labels) necessity db a
421+ ) => K1Table _label 'True Identity 'True (Shape1 'Column ('Spec (label ': labels) necessity db a)) x
422+ where
423+ fromK1Columns (HIdentity (Result a)) = a
424+ toK1Columns = HIdentity . Result
425+ {-# INLINABLE fromK1Columns #-}
426+ {-# INLINABLE toK1Columns #-}
427+
428+
429+instance
430+ ( IsSpecialContext context ~ 'False
431+ , x ~ context a
432+ ) => K1Table _label 'False context 'True (Shape1 'Column ('Spec (label ': labels) necessity db a)) x
433+ where
434+ fromK1Columns (HIdentity (Col a)) = a
435+ toK1Columns = HIdentity . Col
436+ {-# INLINABLE fromK1Columns #-}
437+ {-# INLINABLE toK1Columns #-}
438+
439+
440+instance
441+ ( IsSpecialContext context ~ 'False
442+ , x ~ context a
443+ , Labelable context
444+ ) => K1Table label 'False context 'True (Shape1 'Column ('Spec '[] necessity db a)) x
445+ where
446+ fromK1Columns = (\(Col a) -> a) . unlabeler . unHIdentity
447+ toK1Columns = HIdentity . labeler . Col
448+ {-# INLINABLE fromK1Columns #-}
449+ {-# INLINABLE toK1Columns #-}
450+
451+
452+instance
453+ ( HTable (K1Columns "Left" structure1)
454+ , HTable (K1Columns "Right" structure2)
455+ , K1Table "Left" 'True Aggregate (IsStructure structure1) structure1 a
456+ , K1Table "Right" 'True Aggregate (IsStructure structure2) structure2 b
457+ , e ~ EitherTable a b
458+ ) => K1Table label 'True Aggregate 'True (Shape2 'Either structure1 structure2) e
459+ where
460+ fromK1Columns =
461+ fromColumns2
462+ (fromK1Columns @"Left" @_ @_ @_ @structure1)
463+ (fromK1Columns @"Right" @_ @_ @_ @structure2) .
464+ hunlabel unlabeler
465+ toK1Columns =
466+ hlabel labeler .
467+ toColumns2
468+ (toK1Columns @"Left" @_ @_ @_ @structure1)
469+ (toK1Columns @"Right" @_ @_ @_ @structure2)
470+ {-# INLINABLE fromK1Columns #-}
471+ {-# INLINABLE toK1Columns #-}
472+
473+
474+instance
475+ ( HTable (K1Columns "Left" structure1)
476+ , HTable (K1Columns "Right" structure2)
477+ , K1Table "Left" 'True Expr (IsStructure structure1) structure1 a
478+ , K1Table "Right" 'True Expr (IsStructure structure2) structure2 b
479+ , e ~ EitherTable a b
480+ ) => K1Table label 'True Expr 'True (Shape2 'Either structure1 structure2) e
481+ where
482+ fromK1Columns =
483+ fromColumns2
484+ (fromK1Columns @"Left" @_ @_ @_ @structure1)
485+ (fromK1Columns @"Right" @_ @_ @_ @structure2) .
486+ hunlabel unlabeler
487+ toK1Columns =
488+ hlabel labeler .
489+ toColumns2
490+ (toK1Columns @"Left" @_ @_ @_ @structure1)
491+ (toK1Columns @"Right" @_ @_ @_ @structure2)
492+ {-# INLINABLE fromK1Columns #-}
493+ {-# INLINABLE toK1Columns #-}
494+
495+
496+instance
497+ ( HTable (K1Columns "Left" structure1)
498+ , HTable (K1Columns "Right" structure2)
499+ , K1Table "Left" 'True Insertion (IsStructure structure1) structure1 a
500+ , K1Table "Right" 'True Insertion (IsStructure structure2) structure2 b
501+ , e ~ EitherTable a b
502+ ) => K1Table label 'True Insertion 'True (Shape2 'Either structure1 structure2) e
503+ where
504+ fromK1Columns =
505+ fromColumns2
506+ (fromK1Columns @"Left" @_ @_ @_ @structure1)
507+ (fromK1Columns @"Right" @_ @_ @_ @structure2) .
508+ hunlabel unlabeler
509+ toK1Columns =
510+ hlabel labeler .
511+ toColumns2
512+ (toK1Columns @"Left" @_ @_ @_ @structure1)
513+ (toK1Columns @"Right" @_ @_ @_ @structure2)
514+ {-# INLINABLE fromK1Columns #-}
515+ {-# INLINABLE toK1Columns #-}
516+
517+
518+instance
519+ ( HTable (K1Columns "Left" structure1)
520+ , HTable (K1Columns "Right" structure2)
521+ , K1Table "Left" 'True Identity (IsStructure structure1) structure1 a
522+ , K1Table "Right" 'True Identity (IsStructure structure2) structure2 b
523+ , e ~ Either a b
524+ ) => K1Table label 'True Identity 'True (Shape2 'Either structure1 structure2) e
525+ where
526+ fromK1Columns
527+ = bimap
528+ (fromK1Columns @"Left" @_ @_ @_ @structure1)
529+ (fromK1Columns @"Right" @_ @_ @_ @structure2)
530+ . fromHEitherTable
531+ . hunlabel unlabeler
532+ toK1Columns
533+ = hlabel labeler
534+ . toHEitherTable
535+ . bimap
536+ (toK1Columns @"Left" @_ @_ @_ @structure1)
537+ (toK1Columns @"Right" @_ @_ @_ @structure2)
538+ {-# INLINABLE fromK1Columns #-}
539+ {-# INLINABLE toK1Columns #-}
540+
541+
542+instance
543+ ( HTable (K1Columns "Left" structure1)
544+ , HTable (K1Columns "Right" structure2)
545+ , K1Table "Left" 'False context (IsStructure structure1) structure1 a
546+ , K1Table "Right" 'False context (IsStructure structure2) structure2 b
547+ , IsSpecialContext context ~ 'False
548+ , Labelable context
549+ , Nullifiable context
550+ , e ~ EitherTable a b
551+ ) => K1Table label 'False context 'True (Shape2 'Either structure1 structure2) e
552+ where
553+ fromK1Columns =
554+ fromColumns2
555+ (fromK1Columns @"Left" @_ @_ @_ @structure1)
556+ (fromK1Columns @"Right" @_ @_ @_ @structure2) .
557+ hunlabel unlabeler
558+ toK1Columns =
559+ hlabel labeler .
560+ toColumns2
561+ (toK1Columns @"Left" @_ @_ @_ @structure1)
562+ (toK1Columns @"Right" @_ @_ @_ @structure2)
563+ {-# INLINABLE fromK1Columns #-}
564+ {-# INLINABLE toK1Columns #-}
565+
566+
567+instance
568+ ( K1Table label 'True Aggregate (IsStructure structure) structure a
569+ , Table Aggregate a
570+ , K1Columns label structure ~ HLabel label (Columns a)
571+ , as ~ ListTable a
572+ ) => K1Table label 'True Aggregate 'True (Shape1 'List structure) as
573+ where
574+ fromK1Columns = fromColumns . hrelabel (hunlabel hunlabeler)
575+ toK1Columns = hrelabel (hlabel hlabeler) . toColumns
576+ {-# INLINABLE fromK1Columns #-}
577+ {-# INLINABLE toK1Columns #-}
578+
579+
580+instance
581+ ( K1Table label 'True Expr (IsStructure structure) structure a
582+ , Table Expr a
583+ , K1Columns label structure ~ HLabel label (Columns a)
584+ , as ~ ListTable a
585+ ) => K1Table label 'True Expr 'True (Shape1 'List structure) as
586+ where
587+ fromK1Columns = fromColumns . hrelabel (hunlabel hunlabeler)
588+ toK1Columns = hrelabel (hlabel hlabeler) . toColumns
589+ {-# INLINABLE fromK1Columns #-}
590+ {-# INLINABLE toK1Columns #-}
591+
592+
593+instance
594+ ( K1Table label 'True Insertion (IsStructure structure) structure a
595+ , Table Insertion a
596+ , K1Columns label structure ~ HLabel label (Columns a)
597+ , as ~ ListTable a
598+ ) => K1Table label 'True Insertion 'True (Shape1 'List structure) as
599+ where
600+ fromK1Columns = fromColumns . hrelabel (hunlabel hunlabeler)
601+ toK1Columns = hrelabel (hlabel hlabeler) . toColumns
602+ {-# INLINABLE fromK1Columns #-}
603+ {-# INLINABLE toK1Columns #-}
604+
605+
606+instance
607+ ( K1Table label 'True Identity (IsStructure structure) structure a
608+ , HTable (K1Columns label structure)
609+ , as ~ [a]
610+ ) => K1Table label 'True Identity 'True (Shape1 'List structure) as
611+ where
612+ fromK1Columns = fmap (fromK1Columns @label @'True @Identity @_ @structure) . fromHListTable
613+ toK1Columns = toHListTable . fmap (toK1Columns @label @'True @Identity @_ @structure)
614+ {-# INLINABLE fromK1Columns #-}
615+ {-# INLINABLE toK1Columns #-}
616+
617+
618+instance
619+ ( K1Table label 'False context (IsStructure structure) structure a
620+ , IsSpecialContext context ~ 'False
621+ , Table context a
622+ , K1Columns label structure ~ HLabel label (Columns a)
623+ , Labelable context
624+ , as ~ ListTable a
625+ ) => K1Table label 'False context 'True (Shape1 'List structure) as
626+ where
627+ fromK1Columns = fromColumns . hrelabel (hunlabel hunlabeler)
628+ toK1Columns = hrelabel (hlabel hlabeler) . toColumns
629+ {-# INLINABLE fromK1Columns #-}
630+ {-# INLINABLE toK1Columns #-}
631+
632+
633+instance
634+ ( HTable (K1Columns "Just" structure)
635+ , K1Table "Just" 'True Aggregate (IsStructure structure) structure a
636+ , ma ~ MaybeTable a
637+ ) => K1Table label 'True Aggregate 'True (Shape1 'Maybe structure) ma
638+ where
639+ fromK1Columns =
640+ fromColumns1 (fromK1Columns @"Just" @_ @_ @_ @structure) .
641+ hunlabel unlabeler
642+ toK1Columns =
643+ hlabel labeler .
644+ toColumns1 (toK1Columns @"Just" @_ @_ @_ @structure)
645+ {-# INLINABLE fromK1Columns #-}
646+ {-# INLINABLE toK1Columns #-}
647+
648+
649+instance
650+ ( HTable (K1Columns "Just" structure)
651+ , K1Table "Just" 'True Expr (IsStructure structure) structure a
652+ , ma ~ MaybeTable a
653+ ) => K1Table label 'True Expr 'True (Shape1 'Maybe structure) ma
654+ where
655+ fromK1Columns =
656+ fromColumns1 (fromK1Columns @"Just" @_ @_ @_ @structure) .
657+ hunlabel unlabeler
658+ toK1Columns =
659+ hlabel labeler .
660+ toColumns1 (toK1Columns @"Just" @_ @_ @_ @structure)
661+ {-# INLINABLE fromK1Columns #-}
662+ {-# INLINABLE toK1Columns #-}
663+
664+
665+instance
666+ ( HTable (K1Columns "Just" structure)
667+ , K1Table "Just" 'True Insertion (IsStructure structure) structure a
668+ , ma ~ MaybeTable a
669+ ) => K1Table label 'True Insertion 'True (Shape1 'Maybe structure) ma
670+ where
671+ fromK1Columns =
672+ fromColumns1 (fromK1Columns @"Just" @_ @_ @_ @structure) .
673+ hunlabel unlabeler
674+ toK1Columns =
675+ hlabel labeler .
676+ toColumns1 (toK1Columns @"Just" @_ @_ @_ @structure)
677+ {-# INLINABLE fromK1Columns #-}
678+ {-# INLINABLE toK1Columns #-}
679+
680+
681+instance
682+ ( HTable (K1Columns "Just" structure)
683+ , K1Table "Just" 'True Identity (IsStructure structure) structure a
684+ , ma ~ Maybe a
685+ ) => K1Table label 'True Identity 'True (Shape1 'Maybe structure) ma
686+ where
687+ fromK1Columns
688+ = fmap (fromK1Columns @"Just" @_ @_ @_ @structure)
689+ . fromHMaybeTable
690+ . hunlabel unlabeler
691+ toK1Columns
692+ = hlabel labeler
693+ . toHMaybeTable
694+ . fmap (toK1Columns @"Just" @_ @_ @_ @structure)
695+ {-# INLINABLE fromK1Columns #-}
696+ {-# INLINABLE toK1Columns #-}
697+
698+
699+instance
700+ ( HTable (K1Columns "Just" structure)
701+ , K1Table "Just" 'False context (IsStructure structure) structure a
702+ , IsSpecialContext context ~ 'False
703+ , Labelable context
704+ , Nullifiable context
705+ , ma ~ MaybeTable a
706+ ) => K1Table label 'False context 'True (Shape1 'Maybe structure) ma
707+ where
708+ fromK1Columns =
709+ fromColumns1 (fromK1Columns @"Just" @_ @_ @_ @structure) .
710+ hunlabel unlabeler
711+ toK1Columns =
712+ hlabel labeler .
713+ toColumns1 (toK1Columns @"Just" @_ @_ @_ @structure)
714+ {-# INLINABLE fromK1Columns #-}
715+ {-# INLINABLE toK1Columns #-}
716+
717+
718+instance
719+ ( K1Table label 'True Aggregate (IsStructure structure) structure a
720+ , Table Aggregate a
721+ , K1Columns label structure ~ HLabel label (Columns a)
722+ , as ~ NonEmptyTable a
723+ ) => K1Table label 'True Aggregate 'True (Shape1 'NonEmpty structure) as
724+ where
725+ fromK1Columns = fromColumns . hrelabel (hunlabel hunlabeler)
726+ toK1Columns = hrelabel (hlabel hlabeler) . toColumns
727+ {-# INLINABLE fromK1Columns #-}
728+ {-# INLINABLE toK1Columns #-}
729+
730+
731+instance
732+ ( K1Table label 'True Expr (IsStructure structure) structure a
733+ , Table Expr a
734+ , K1Columns label structure ~ HLabel label (Columns a)
735+ , as ~ NonEmptyTable a
736+ ) => K1Table label 'True Expr 'True (Shape1 'NonEmpty structure) as
737+ where
738+ fromK1Columns = fromColumns . hrelabel (hunlabel hunlabeler)
739+ toK1Columns = hrelabel (hlabel hlabeler) . toColumns
740+ {-# INLINABLE fromK1Columns #-}
741+ {-# INLINABLE toK1Columns #-}
742+
743+
744+instance
745+ ( K1Table label 'True Insertion (IsStructure structure) structure a
746+ , Table Insertion a
747+ , K1Columns label structure ~ HLabel label (Columns a)
748+ , as ~ NonEmptyTable a
749+ ) => K1Table label 'True Insertion 'True (Shape1 'NonEmpty structure) as
750+ where
751+ fromK1Columns = fromColumns . hrelabel (hunlabel hunlabeler)
752+ toK1Columns = hrelabel (hlabel hlabeler) . toColumns
753+ {-# INLINABLE fromK1Columns #-}
754+ {-# INLINABLE toK1Columns #-}
755+
756+
757+instance
758+ ( K1Table label 'True Identity (IsStructure structure) structure a
759+ , HTable (K1Columns label structure)
760+ , as ~ NonEmpty a
761+ ) => K1Table label 'True Identity 'True (Shape1 'NonEmpty structure) as
762+ where
763+ fromK1Columns = fmap (fromK1Columns @label @'True @Identity @_ @structure) . fromHNonEmptyTable
764+ toK1Columns = toHNonEmptyTable . fmap (toK1Columns @label @'True @Identity @_ @structure)
765+ {-# INLINABLE fromK1Columns #-}
766+ {-# INLINABLE toK1Columns #-}
767+
768+
769+instance
770+ ( K1Table label 'False context (IsStructure structure) structure a
771+ , IsSpecialContext context ~ 'False
772+ , Table context a
773+ , K1Columns label structure ~ HLabel label (Columns a)
774+ , Labelable context
775+ , as ~ NonEmptyTable a
776+ ) => K1Table label 'False context 'True (Shape1 'NonEmpty structure) as
777+ where
778+ fromK1Columns = fromColumns . hrelabel (hunlabel hunlabeler)
779+ toK1Columns = hrelabel (hlabel hlabeler) . toColumns
780+ {-# INLINABLE fromK1Columns #-}
781+ {-# INLINABLE toK1Columns #-}
782+
783+
784+instance
785+ ( HTable (K1Columns "Here" structure1)
786+ , HTable (K1Columns "There" structure2)
787+ , K1Table "Here" 'True Aggregate (IsStructure structure1) structure1 a
788+ , K1Table "There" 'True Aggregate (IsStructure structure2) structure2 b
789+ , e ~ TheseTable a b
790+ ) => K1Table label 'True Aggregate 'True (Shape2 'These structure1 structure2) e
791+ where
792+ fromK1Columns =
793+ fromColumns2
794+ (fromK1Columns @"Here" @_ @_ @_ @structure1)
795+ (fromK1Columns @"There" @_ @_ @_ @structure2) .
796+ hunlabel unlabeler
797+ toK1Columns =
798+ hlabel labeler .
799+ toColumns2
800+ (toK1Columns @"Here" @_ @_ @_ @structure1)
801+ (toK1Columns @"There" @_ @_ @_ @structure2)
802+ {-# INLINABLE fromK1Columns #-}
803+ {-# INLINABLE toK1Columns #-}
804+
805+
806+instance
807+ ( HTable (K1Columns "Here" structure1)
808+ , HTable (K1Columns "There" structure2)
809+ , K1Table "Here" 'True Expr (IsStructure structure1) structure1 a
810+ , K1Table "There" 'True Expr (IsStructure structure2) structure2 b
811+ , e ~ TheseTable a b
812+ ) => K1Table label 'True Expr 'True (Shape2 'These structure1 structure2) e
813+ where
814+ fromK1Columns =
815+ fromColumns2
816+ (fromK1Columns @"Here" @_ @_ @_ @structure1)
817+ (fromK1Columns @"There" @_ @_ @_ @structure2) .
818+ hunlabel unlabeler
819+ toK1Columns =
820+ hlabel labeler .
821+ toColumns2
822+ (toK1Columns @"Here" @_ @_ @_ @structure1)
823+ (toK1Columns @"There" @_ @_ @_ @structure2)
824+ {-# INLINABLE fromK1Columns #-}
825+ {-# INLINABLE toK1Columns #-}
826+
827+
828+instance
829+ ( HTable (K1Columns "Here" structure1)
830+ , HTable (K1Columns "There" structure2)
831+ , K1Table "Here" 'True Insertion (IsStructure structure1) structure1 a
832+ , K1Table "There" 'True Insertion (IsStructure structure2) structure2 b
833+ , e ~ TheseTable a b
834+ ) => K1Table label 'True Insertion 'True (Shape2 'These structure1 structure2) e
835+ where
836+ fromK1Columns =
837+ fromColumns2
838+ (fromK1Columns @"Here" @_ @_ @_ @structure1)
839+ (fromK1Columns @"There" @_ @_ @_ @structure2) .
840+ hunlabel unlabeler
841+ toK1Columns =
842+ hlabel labeler .
843+ toColumns2
844+ (toK1Columns @"Here" @_ @_ @_ @structure1)
845+ (toK1Columns @"There" @_ @_ @_ @structure2)
846+ {-# INLINABLE fromK1Columns #-}
847+ {-# INLINABLE toK1Columns #-}
848+
849+
850+instance
851+ ( HTable (K1Columns "Here" structure1)
852+ , HTable (K1Columns "There" structure2)
853+ , K1Table "Here" 'True Identity (IsStructure structure1) structure1 a
854+ , K1Table "There" 'True Identity (IsStructure structure2) structure2 b
855+ , e ~ These a b
856+ ) => K1Table label 'True Identity 'True (Shape2 'These structure1 structure2) e
857+ where
858+ fromK1Columns
859+ = bimap
860+ (fromK1Columns @"Here" @_ @_ @_ @structure1)
861+ (fromK1Columns @"There" @_ @_ @_ @structure2)
862+ . fromHTheseTable
863+ . hunlabel unlabeler
864+ toK1Columns
865+ = hlabel labeler
866+ . toHTheseTable
867+ . bimap
868+ (toK1Columns @"Here" @_ @_ @_ @structure1)
869+ (toK1Columns @"There" @_ @_ @_ @structure2)
870+ {-# INLINABLE fromK1Columns #-}
871+ {-# INLINABLE toK1Columns #-}
872+
873+
874+instance
875+ ( HTable (K1Columns "Here" structure1)
876+ , HTable (K1Columns "There" structure2)
877+ , K1Table "Here" 'False context (IsStructure structure1) structure1 a
878+ , K1Table "There" 'False context (IsStructure structure2) structure2 b
879+ , IsSpecialContext context ~ 'False
880+ , Labelable context
881+ , Nullifiable context
882+ , e ~ TheseTable a b
883+ ) => K1Table label 'False context 'True (Shape2 'These structure1 structure2) e
884+ where
885+ fromK1Columns =
886+ fromColumns2
887+ (fromK1Columns @"Here" @_ @_ @_ @structure1)
888+ (fromK1Columns @"There" @_ @_ @_ @structure2) .
889+ hunlabel unlabeler
890+ toK1Columns =
891+ hlabel labeler .
892+ toColumns2
893+ (toK1Columns @"Here" @_ @_ @_ @structure1)
894+ (toK1Columns @"There" @_ @_ @_ @structure2)
895+ {-# INLINABLE fromK1Columns #-}
896+ {-# INLINABLE toK1Columns #-}
897+
898+
899+
900+instance
901+ ( K1Table "fst" isSpecialContext context (IsStructure structure1) structure1 a1
902+ , K1Table "snd" isSpecialContext context (IsStructure structure2) structure2 a2
903+ , HTable (K1Columns "fst" structure1)
904+ , HTable (K1Columns "snd" structure2)
905+ , Labelable context
906+ , a ~ (a1, a2)
907+ ) => K1Table label isSpecialContext context 'True (structure1, structure2) a
908+ where
909+ fromK1Columns (hunlabel unlabeler -> (HPair a b)) =
910+ ( fromK1Columns @"fst" @_ @_ @_ @structure1 a
911+ , fromK1Columns @"snd" @_ @_ @_ @structure2 b
912+ )
913+ toK1Columns (a, b) = hlabel labeler $ HPair
914+ { hfst = toK1Columns @"fst" @_ @_ @_ @structure1 a
915+ , hsnd = toK1Columns @"snd" @_ @_ @_ @structure2 b
916+ }
917+ {-# INLINABLE fromK1Columns #-}
918+ {-# INLINABLE toK1Columns #-}
919+
920+
921+instance
922+ ( K1Table "fst" isSpecialContext context (IsStructure structure1) structure1 a1
923+ , K1Table "snd" isSpecialContext context (IsStructure structure2) structure2 a2
924+ , K1Table "trd" isSpecialContext context (IsStructure structure3) structure3 a3
925+ , HTable (K1Columns "fst" structure1)
926+ , HTable (K1Columns "snd" structure2)
927+ , HTable (K1Columns "trd" structure3)
928+ , Labelable context
929+ , a ~ (a1, a2, a3)
930+ ) => K1Table label isSpecialContext context 'True (structure1, structure2, structure3) a
931+ where
932+ fromK1Columns (hunlabel unlabeler -> (HTrio a b c)) =
933+ ( fromK1Columns @"fst" @_ @_ @_ @structure1 a
934+ , fromK1Columns @"snd" @_ @_ @_ @structure2 b
935+ , fromK1Columns @"trd" @_ @_ @_ @structure3 c
936+ )
937+ toK1Columns (a, b, c) = hlabel labeler $ HTrio
938+ { hfst = toK1Columns @"fst" @_ @_ @_ @structure1 a
939+ , hsnd = toK1Columns @"snd" @_ @_ @_ @structure2 b
940+ , htrd = toK1Columns @"trd" @_ @_ @_ @structure3 c
941+ }
942+ {-# INLINABLE fromK1Columns #-}
943+ {-# INLINABLE toK1Columns #-}
944+
945+
946+instance
947+ ( K1Table "fst" isSpecialContext context (IsStructure structure1) structure1 a1
948+ , K1Table "snd" isSpecialContext context (IsStructure structure2) structure2 a2
949+ , K1Table "trd" isSpecialContext context (IsStructure structure3) structure3 a3
950+ , K1Table "frt" isSpecialContext context (IsStructure structure3) structure4 a4
951+ , HTable (K1Columns "fst" structure1)
952+ , HTable (K1Columns "snd" structure2)
953+ , HTable (K1Columns "trd" structure3)
954+ , HTable (K1Columns "frt" structure4)
955+ , Labelable context
956+ , a ~ (a1, a2, a3, a4)
957+ ) => K1Table label isSpecialContext context 'True (structure1, structure2, structure3, structure4) a
958+ where
959+ fromK1Columns (hunlabel unlabeler -> (HQuartet a b c d)) =
960+ ( fromK1Columns @"fst" @_ @_ @_ @structure1 a
961+ , fromK1Columns @"snd" @_ @_ @_ @structure2 b
962+ , fromK1Columns @"trd" @_ @_ @_ @structure3 c
963+ , fromK1Columns @"frt" @_ @_ @_ @structure4 d
964+ )
965+ toK1Columns (a, b, c, d) = hlabel labeler $ HQuartet
966+ { hfst = toK1Columns @"fst" @_ @_ @_ @structure1 a
967+ , hsnd = toK1Columns @"snd" @_ @_ @_ @structure2 b
968+ , htrd = toK1Columns @"trd" @_ @_ @_ @structure3 c
969+ , hfrt = toK1Columns @"frt" @_ @_ @_ @structure4 d
970+ }
971+ {-# INLINABLE fromK1Columns #-}
972+ {-# INLINABLE toK1Columns #-}
973+
974+
975+instance
976+ ( K1Table "fst" isSpecialContext context (IsStructure structure1) structure1 a1
977+ , K1Table "snd" isSpecialContext context (IsStructure structure2) structure2 a2
978+ , K1Table "trd" isSpecialContext context (IsStructure structure3) structure3 a3
979+ , K1Table "frt" isSpecialContext context (IsStructure structure3) structure4 a4
980+ , K1Table "fft" isSpecialContext context (IsStructure structure3) structure5 a5
981+ , HTable (K1Columns "fst" structure1)
982+ , HTable (K1Columns "snd" structure2)
983+ , HTable (K1Columns "trd" structure3)
984+ , HTable (K1Columns "frt" structure4)
985+ , HTable (K1Columns "fft" structure5)
986+ , Labelable context
987+ , a ~ (a1, a2, a3, a4, a5)
988+ ) => K1Table label isSpecialContext context 'True (structure1, structure2, structure3, structure4, structure5) a
989+ where
990+ fromK1Columns (hunlabel unlabeler -> (HQuintet a b c d e)) =
991+ ( fromK1Columns @"fst" @_ @_ @_ @structure1 a
992+ , fromK1Columns @"snd" @_ @_ @_ @structure2 b
993+ , fromK1Columns @"trd" @_ @_ @_ @structure3 c
994+ , fromK1Columns @"frt" @_ @_ @_ @structure4 d
995+ , fromK1Columns @"fft" @_ @_ @_ @structure5 e
996+ )
997+ toK1Columns (a, b, c, d, e) = hlabel labeler $ HQuintet
998+ { hfst = toK1Columns @"fst" @_ @_ @_ @structure1 a
999+ , hsnd = toK1Columns @"snd" @_ @_ @_ @structure2 b
1000+ , htrd = toK1Columns @"trd" @_ @_ @_ @structure3 c
1001+ , hfrt = toK1Columns @"frt" @_ @_ @_ @structure4 d
1002+ , hfft = toK1Columns @"fft" @_ @_ @_ @structure5 e
1003+ }
1004+ {-# INLINABLE fromK1Columns #-}
1005+ {-# INLINABLE toK1Columns #-}
1006+
1007+
1008+instance
1009+ ( IsSpecialContext context ~ isSpecialContext
1010+ , IsStructure structure ~ 'False
1011+ , K1Columns label structure ~ HLabel label (Columns structure)
1012+ , Columns structure ~ Columns a
1013+ , Labelable context
1014+ , Table context a
1015+ ) => K1Table label isSpecialContext context 'False structure a
1016+ where
1017+ fromK1Columns = fromColumns . hunlabel unlabeler
1018+ toK1Columns = hlabel labeler . toColumns
1019+ {-# INLINABLE fromK1Columns #-}
1020+ {-# INLINABLE toK1Columns #-}