1{-# language AllowAmbiguousTypes #-}
2{-# language DataKinds #-}
3{-# language FlexibleContexts #-}
4{-# language FlexibleInstances #-}
5{-# language MultiParamTypeClasses #-}
6{-# language RankNTypes #-}
7{-# language ScopedTypeVariables #-}
8{-# language StandaloneKindSignatures #-}
9{-# language TypeApplications #-}
10{-# language TypeFamilies #-}
11{-# language TypeOperators #-}
12{-# language UndecidableInstances #-}
14module Rel8.Generic.Table
15 ( GGSerialize, GGColumns, ggfromResult, ggtoResult
21import Data.Kind ( Constraint, Type )
22import GHC.Generics ( (:+:), (:*:), K1, M1, U1, V1 )
26import Rel8.FCF ( Eval, Exp )
27import Rel8.Generic.Table.ADT
28 ( GSerializeADT, GColumnsADT, gtoResultADT, gfromResultADT
30import Rel8.Generic.Table.Record ( GSerialize, GColumns, gtoResult, gfromResult )
31import Rel8.Kind.Algebra
32 ( Algebra( Product, Sum )
33 , SAlgebra( SProduct, SSum )
34 , KnownAlgebra, algebraSing
36import qualified Rel8.Schema.Kind as K
37import Rel8.Schema.Result ( Result )
42 -> (Type -> Type -> Exp Constraint)
43 -> (Type -> Exp K.HTable)
49type instance Eval (GGSerialize 'Product _Serialize _Columns exprs rep) =
50 GSerialize _Serialize _Columns exprs rep
53type instance Eval (GGSerialize 'Sum _Serialize _Columns exprs rep) =
54 GSerializeADT _Serialize _Columns exprs rep
59 -> (Type -> Exp K.HTable)
64type instance Eval (GGColumns 'Product _Columns rep) = GColumns _Columns rep
67type instance Eval (GGColumns 'Sum _Columns rep) = GColumnsADT _Columns rep
70type GAlgebra :: (Type -> Type) -> Algebra
71type family GAlgebra rep where
72 GAlgebra (M1 _ _ rep) = GAlgebra rep
74 GAlgebra (_ :+: _) = 'Sum
76 GAlgebra (_ :*: _) = 'Product
77 GAlgebra (K1 _ _) = 'Product
80ggfromResult :: forall algebra _Serialize _Columns exprs rep x.
81 ( KnownAlgebra algebra
82 , Eval (GGSerialize algebra _Serialize _Columns exprs rep)
84 => (forall expr a proxy. Eval (_Serialize expr a)
85 => proxy expr -> Eval (_Columns expr) Result -> a)
86 -> Eval (GGColumns algebra _Columns exprs) Result
88ggfromResult f x = case algebraSing @algebra of
89 SProduct -> gfromResult @_Serialize @_Columns @exprs @rep f x
90 SSum -> gfromResultADT @_Serialize @_Columns @exprs @rep f x
93ggtoResult :: forall algebra _Serialize _Columns exprs rep x.
94 ( KnownAlgebra algebra
95 , Eval (GGSerialize algebra _Serialize _Columns exprs rep)
97 => (forall expr a proxy. Eval (_Serialize expr a)
98 => proxy expr -> a -> Eval (_Columns expr) Result)
100 -> Eval (GGColumns algebra _Columns exprs) Result
101ggtoResult f x = case algebraSing @algebra of
102 SProduct -> gtoResult @_Serialize @_Columns @exprs @rep f x
103 SSum -> gtoResultADT @_Serialize @_Columns @exprs @rep f x
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