1{-# language AllowAmbiguousTypes #-}
2{-# language DataKinds #-}
3{-# language FlexibleContexts #-}
4{-# language FlexibleInstances #-}
5{-# language MultiParamTypeClasses #-}
6{-# language PolyKinds #-}
7{-# language RankNTypes #-}
8{-# language ScopedTypeVariables #-}
9{-# language StandaloneKindSignatures #-}
10{-# language TypeApplications #-}
11{-# language TypeFamilies #-}
12{-# language TypeOperators #-}
13{-# language UndecidableInstances #-}
15module Rel8.Generic.Table.Record
16 ( GTable, GColumns, GContext, gfromColumns, gtoColumns, gtable
17 , GSerialize, gfromResult, gtoResult
22import Data.Kind ( Constraint, Type )
23import Data.Proxy ( Proxy( Proxy ) )
25 ( (:*:)( (:*:) ), K1( K1 ), M1( M1 )
29import Prelude hiding ( null )
32import Rel8.FCF ( Eval, Exp )
33import Rel8.Schema.HTable.Label ( HLabel, hlabel, hunlabel )
34import Rel8.Schema.HTable.Product ( HProduct(..) )
35import qualified Rel8.Schema.Kind as K
38type GColumns :: (Type -> Exp K.HTable) -> (Type -> Type) -> K.HTable
39type family GColumns _Columns rep where
40 GColumns _Columns (M1 D _ rep) = GColumns _Columns rep
41 GColumns _Columns (M1 C _ rep) = GColumns _Columns rep
42 GColumns _Columns (rep1 :*: rep2) =
43 HProduct (GColumns _Columns rep1) (GColumns _Columns rep2)
44 GColumns _Columns (M1 S ('MetaSel ('Just label) _ _ _) (K1 _ a)) =
45 HLabel label (Eval (_Columns a))
48type GContext :: (Type -> Exp K.Context) -> (Type -> Type) -> K.Context
49type family GContext _Context rep where
50 GContext _Context (M1 _ _ rep) = GContext _Context rep
51 GContext _Context (rep1 :*: _rep2) = GContext _Context rep1
52 GContext _Context (K1 _ a) = Eval (_Context a)
56 :: (Type -> Exp Constraint)
57 -> (Type -> Exp K.HTable)
58 -> (Type -> Type) -> Constraint
59class GTable _Table _Columns rep
62 => (forall a. Eval (_Table a) => Eval (_Columns a) context -> a)
63 -> GColumns _Columns rep context
67 => (forall a. Eval (_Table a) => a -> Eval (_Columns a) context)
69 -> GColumns _Columns rep context
72 => (forall a proxy. Eval (_Table a) => proxy a -> Eval (_Columns a) context)
73 -> GColumns _Columns rep context
77 :: (Type -> Type -> Exp Constraint)
78 -> (Type -> Exp K.HTable)
79 -> (Type -> Type) -> (Type -> Type) -> Constraint
80class GSerialize _Serialize _Columns exprs rep
83 => (forall expr a proxy. Eval (_Serialize expr a)
84 => proxy expr -> Eval (_Columns expr) context -> a)
85 -> GColumns _Columns exprs context
89 => (forall expr a proxy. Eval (_Serialize expr a)
90 => proxy expr -> a -> Eval (_Columns expr) context)
92 -> GColumns _Columns exprs context
95instance GTable _Table _Columns rep => GTable _Table _Columns (M1 D c rep)
97 gfromColumns fromColumns =
98 M1 . gfromColumns @_Table @_Columns @rep fromColumns
99 gtoColumns toColumns (M1 a) =
100 gtoColumns @_Table @_Columns @rep toColumns a
101 gtable = gtable @_Table @_Columns @rep
104instance GSerialize _Serialize _Columns exprs rep =>
105 GSerialize _Serialize _Columns (M1 D c exprs) (M1 D c rep)
107 gfromResult fromResult =
108 M1 . gfromResult @_Serialize @_Columns @exprs @rep fromResult
109 gtoResult toResult (M1 a) =
110 gtoResult @_Serialize @_Columns @exprs @rep toResult a
113instance GTable _Table _Columns rep => GTable _Table _Columns (M1 C c rep)
115 gfromColumns fromColumns =
116 M1 . gfromColumns @_Table @_Columns @rep fromColumns
117 gtoColumns toColumns (M1 a) =
118 gtoColumns @_Table @_Columns @rep toColumns a
119 gtable = gtable @_Table @_Columns @rep
122instance GSerialize _Serialize _Columns exprs rep =>
123 GSerialize _Serialize _Columns (M1 C c exprs) (M1 C c rep)
125 gfromResult fromResult =
126 M1 . gfromResult @_Serialize @_Columns @exprs @rep fromResult
127 gtoResult toResult (M1 a) =
128 gtoResult @_Serialize @_Columns @exprs @rep toResult a
131instance (GTable _Table _Columns rep1, GTable _Table _Columns rep2) =>
132 GTable _Table _Columns (rep1 :*: rep2)
134 gfromColumns fromColumns (HProduct a b) =
135 gfromColumns @_Table @_Columns @rep1 fromColumns a :*:
136 gfromColumns @_Table @_Columns @rep2 fromColumns b
137 gtoColumns toColumns (a :*: b) = HProduct
138 (gtoColumns @_Table @_Columns @rep1 toColumns a)
139 (gtoColumns @_Table @_Columns @rep2 toColumns b)
140 gtable table = HProduct
141 (gtable @_Table @_Columns @rep1 table)
142 (gtable @_Table @_Columns @rep2 table)
146 ( GSerialize _Serialize _Columns expr1 rep1
147 , GSerialize _Serialize _Columns expr2 rep2
149 => GSerialize _Serialize _Columns (expr1 :*: expr2) (rep1 :*: rep2)
151 gfromResult fromResult (HProduct a b) =
152 gfromResult @_Serialize @_Columns @expr1 @rep1 fromResult a :*:
153 gfromResult @_Serialize @_Columns @expr2 @rep2 fromResult b
154 gtoResult toResult (a :*: b) =
156 (gtoResult @_Serialize @_Columns @expr1 @rep1 toResult a)
157 (gtoResult @_Serialize @_Columns @expr2 @rep2 toResult b)
162 , meta ~ 'MetaSel ('Just label) _su _ss _ds
165 => GTable _Table _Columns (M1 S meta k1)
167 gfromColumns fromColumns = M1 . K1 . fromColumns . hunlabel
168 gtoColumns toColumns (M1 (K1 a)) = hlabel (toColumns a)
169 gtable table = hlabel (table (Proxy @a))
173 ( Eval (_Serialize expr a)
174 , meta ~ 'MetaSel ('Just label) _su _ss _ds
178 => GSerialize _Serialize _Columns (M1 S meta k1) (M1 S meta k1')
180 gfromResult fromResult = M1 . K1 . fromResult (Proxy @expr) . hunlabel
181 gtoResult toResult (M1 (K1 a)) = hlabel (toResult (Proxy @expr) 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