@@ -1,29 +1,164 @@
1+{-# language DataKinds #-}
2+{-# language FlexibleContexts #-}
13{-# language FlexibleInstances #-}
24{-# language MultiParamTypeClasses #-}
5+{-# language ScopedTypeVariables #-}
36{-# language StandaloneKindSignatures #-}
47{-# language TypeApplications #-}
58{-# language TypeFamilies #-}
69{-# language UndecidableInstances #-}
10+{-# language UndecidableSuperClasses #-}
711
812module Rel8.Table.HKD
9− ( HKDT(..)
13+ ( HKD( HKD ), HKDT(..)
14+ , fromHKD, toHKD
15+ , GHKD
1016 )
1117where
1218
1319-- base
14−import Data.Functor.Identity ( Identity(..), runIdentity )
15−import Data.Kind ( Type )
16−import GHC.Generics ( Rep )
20+import Data.Kind ( Constraint, Type )
21+import Data.Proxy ( Proxy( Proxy ) )
22+import Data.Type.Equality ( (:~:)( Refl ) )
23+import GHC.Generics ( Generic, Rep, from, to )
1724import Prelude
1825
19−-- higgledy
20−import Data.Generic.HKD ( Construct, HKD(..), construct, deconstruct )
21−
2226-- rel8
27+import Rel8.Column ( Column )
2328import Rel8.Expr ( Expr )
24−import Rel8.Generic.HKD ( GTable )
25−import Rel8.Table ( fromColumns, toColumns )
26−import Rel8.Table.Serialize ( FromExprs, ToExprs, fromResult, toResult )
29+import Rel8.FCF ( Eval, Exp )
30+import Rel8.Kind.Algebra ( KnownAlgebra )
31+import qualified Rel8.Kind.Algebra as K
32+import Rel8.Generic.Map ( GMap, GMappable, gmap, gunmap )
33+import Rel8.Generic.Record ( GRecord, GRecordable, grecord, gunrecord )
34+import Rel8.Generic.Rel8able
35+ ( Rel8able, Algebra
36+ , GRep, GColumns, GContext, gfromColumns, gtoColumns
37+ , GColumnsADT, gfromColumnsADT, gtoColumnsADT
38+ , greify, gunreify
39+ , TUnreifyContext
40+ )
41+import Rel8.Generic.Table
42+ ( GGTable, GGColumns, GGContext, ggfromColumns, ggtoColumns
43+ , GAlgebra
44+ )
45+import qualified Rel8.Generic.Table.ADT as G
46+import Rel8.Schema.Context ( Col )
47+import qualified Rel8.Schema.Kind as K
48+import Rel8.Schema.HTable ( HTable )
49+import Rel8.Schema.Reify ( Col( Reify ), Reify, hreify, hunreify )
50+import Rel8.Schema.Result ( Result )
51+import Rel8.Table
52+ ( Table, Columns
53+ , fromColumns, toColumns, reify, unreify
54+ , TTable, TColumns, TUnreify
55+ )
56+import Rel8.Table.Serialize ( ToExprs, fromResult, toResult )
57+
58+
59+data TColumn :: K.Context -> Type -> Exp Type
60+type instance Eval (TColumn f a) = Column f a
61+
62+
63+type GColumnsHKD :: Type -> K.HTable
64+type GColumnsHKD a =
65+ Eval (GGColumns (GAlgebra (Rep a)) TColumns (GRecord (GMap (TColumn (Reify Result)) (Rep a))))
66+
67+
68+type HKD :: Type -> K.Rel8able
69+newtype HKD a f = HKD (GColumnsHKD a (Col f))
70+
71+
72+instance GHKD a => Rel8able (HKD a) where
73+ type Algebra (HKD a) = 'K.Product
74+
75+ type GRep (HKD a) f = GRecord (GMap (TColumn f) (Rep a))
76+
77+ type GColumns (HKD a) = GColumnsHKD a
78+ type GContext (HKD a) context = context
79+
80+ gfromColumns = HKD
81+ gtoColumns (HKD a) = a
82+
83+ gfromColumnsADT =
84+ HKD .
85+ ggtoColumns
86+ @(GAlgebra (Rep a))
87+ @(TTable (Reify Result))
88+ @TColumns
89+ (\(Reify a) -> a)
90+ Reify
91+ toColumns .
92+ G.gfromColumnsADT
93+ @(TTable (Reify Result))
94+ @TColumns
95+ @(Col (Reify Result))
96+ @(GRep (HKD a) (Reify Result))
97+ (\(Reify a) -> a)
98+ Reify
99+ fromColumns
100+
101+ gtoColumnsADT =
102+ G.gtoColumnsADT
103+ @(TTable (Reify Result))
104+ @TColumns
105+ @(Col (Reify Result))
106+ @(GRep (HKD a) (Reify Result))
107+ (\(Reify a) -> a)
108+ Reify
109+ toColumns .
110+ ggfromColumns
111+ @(GAlgebra (Rep a))
112+ @(TTable (Reify Result))
113+ @TColumns
114+ (\(Reify a) -> a)
115+ Reify
116+ fromColumns .
117+ (\(HKD a) -> a)
118+
119+ greify (HKD a) = HKD (hreify a)
120+ gunreify (HKD a) = HKD (hunreify a)
121+
122+
123+instance
124+ ( KnownAlgebra (GAlgebra (Rep a))
125+ , HTable (GColumnsHKD a)
126+ , Eval (GGTable (GAlgebra (Rep a)) (TTable (Reify f)) TColumns (Col (Reify f)) (GRecord (GMap (TColumn (Reify f)) (Rep a))))
127+ , Eval (GGColumns (GAlgebra (Rep a)) TColumns (GRecord (GMap (TColumn (Reify f)) (Rep a)))) ~ GColumnsHKD a
128+ , Eval (GGContext (GAlgebra (Rep a)) TUnreifyContext (GRecord (GMap (TColumn (Reify f)) (Rep a)))) ~ f
129+ , GRecordable (GMap (TColumn (Reify f)) (Rep a))
130+ , GMappable (TTable (Reify f)) (GMap (TColumn (Reify f)) (Rep a))
131+ , GMap TUnreify (GMap (TColumn (Reify f)) (Rep a)) ~ GMap (TColumn f) (Rep a)
132+ )
133+ => Generic (HKD a f)
134+ where
135+ type Rep (HKD a f) = GMap (TColumn f) (Rep a)
136+
137+ from =
138+ gmap @(TTable (Reify f)) (Proxy @TUnreify) (unreify Refl) .
139+ gunrecord @(GMap (TColumn (Reify f)) (Rep a)) .
140+ ggfromColumns
141+ @(GAlgebra (Rep a))
142+ @(TTable (Reify f))
143+ @TColumns
144+ (\(Reify a) -> a)
145+ Reify
146+ fromColumns .
147+ hreify .
148+ (\(HKD a) -> a)
149+
150+ to =
151+ HKD .
152+ hunreify .
153+ ggtoColumns
154+ @(GAlgebra (Rep a))
155+ @(TTable (Reify f))
156+ @TColumns
157+ (\(Reify a) -> a)
158+ Reify
159+ toColumns .
160+ grecord @(GMap (TColumn (Reify f)) (Rep a)) .
161+ gunmap @(TTable (Reify f)) (Proxy @TUnreify) (reify Refl)
27162
28163
29164type HKDT :: Type -> Type
@@ -32,11 +167,57 @@ newtype HKDT a = HKDT
32167 }
33168
34169
35−instance (GTable (Rep a), Construct Identity a, x ~ HKD a Expr) =>
36− ToExprs x (HKDT a)
170+instance
171+ ( Table Expr (HKD a Expr)
172+ , Columns (HKD a Expr) ~ GColumns (HKD a)
173+ , GHKD a
174+ , x ~ HKD a Expr
175+ )
176+ => ToExprs x (HKDT a)
37177 where
38− toResult = toColumns . deconstruct @Identity . unHKDT
39− fromResult = HKDT . runIdentity . construct . fromColumns
178+ toResult = (\(HKD a) -> a) . toHKD . (\(HKDT a) -> a)
179+ fromResult = HKDT . fromHKD . HKD
40180
41181
42−type instance FromExprs (HKD a Expr) = a
182+fromHKD :: GHKD a => HKD a Result -> a
183+fromHKD = to . gunmap @Top (Proxy @(TColumn Result)) id . from
184+
185+
186+toHKD :: GHKD a => a -> HKD a Result
187+toHKD = to . gmap @Top (Proxy @(TColumn Result)) id . from
188+
189+
190+data Top :: Type -> Exp Constraint
191+type instance Eval (Top _) = ()
192+
193+
194+class
195+ ( Generic a
196+ , HTable (GColumns (HKD a))
197+ , HTable (GColumnsADT (HKD a))
198+ , KnownAlgebra (GAlgebra (Rep a))
199+ , Eval (GGTable (GAlgebra (Rep a)) (TTable (Reify Result)) TColumns (Col (Reify Result)) (GRecord (GMap (TColumn (Reify Result)) (Rep a))))
200+ , Eval (GGColumns (GAlgebra (Rep a)) TColumns (GRecord (GMap (TColumn (Reify Result)) (Rep a)))) ~ GColumnsHKD a
201+ , Eval (GGContext (GAlgebra (Rep a)) TUnreifyContext (GRecord (GMap (TColumn (Reify Result)) (Rep a)))) ~ Result
202+ , G.GTableADT (TTable (Reify Result)) TColumns (Col (Reify Result)) (GRecord (GMap (TColumn (Reify Result)) (Rep a)))
203+ , GRecordable (GMap (TColumn (Reify Result)) (Rep a))
204+ , GMappable Top (Rep a)
205+ , GMappable (TTable (Reify Result)) (GMap (TColumn (Reify Result)) (Rep a))
206+ , GMap TUnreify (GMap (TColumn (Reify Result)) (Rep a)) ~ GMap (TColumn Result) (Rep a)
207+ )
208+ => GHKD a
209+instance
210+ ( Generic a
211+ , HTable (GColumns (HKD a))
212+ , HTable (GColumnsADT (HKD a))
213+ , KnownAlgebra (GAlgebra (Rep a))
214+ , Eval (GGTable (GAlgebra (Rep a)) (TTable (Reify Result)) TColumns (Col (Reify Result)) (GRecord (GMap (TColumn (Reify Result)) (Rep a))))
215+ , Eval (GGColumns (GAlgebra (Rep a)) TColumns (GRecord (GMap (TColumn (Reify Result)) (Rep a)))) ~ GColumnsHKD a
216+ , Eval (GGContext (GAlgebra (Rep a)) TUnreifyContext (GRecord (GMap (TColumn (Reify Result)) (Rep a)))) ~ Result
217+ , G.GTableADT (TTable (Reify Result)) TColumns (Col (Reify Result)) (GRecord (GMap (TColumn (Reify Result)) (Rep a)))
218+ , GRecordable (GMap (TColumn (Reify Result)) (Rep a))
219+ , GMappable Top (Rep a)
220+ , GMappable (TTable (Reify Result)) (GMap (TColumn (Reify Result)) (Rep a))
221+ , GMap TUnreify (GMap (TColumn (Reify Result)) (Rep a)) ~ GMap (TColumn Result) (Rep a)
222+ )
223+ => GHKD a