on fab5b4e help sign in
94 lines 2.5 kB history raw
1{-# language DataKinds #-}
2{-# language LambdaCase #-}
3{-# language MultiParamTypeClasses #-}
4{-# language StandaloneKindSignatures #-}
5{-# language TypeFamilies #-}
6{-# language UndecidableInstances #-}
8module Rel8.Column.ADT
9 ( HADT, AHADT(..)
10 )
11where
13-- base
14import Data.Kind ( Type )
15import Prelude
17-- rel8
18import Rel8.Generic.Rel8able
19 ( Rel8able
20 , GColumnsADT, gfromColumnsADT, gtoColumnsADT
21 , greify, gunreify
22 )
23import Rel8.Kind.Context ( SContext(..), Reifiable, contextSing )
24import Rel8.Schema.Context ( Col )
25import qualified Rel8.Schema.Kind as K
26import Rel8.Schema.Reify ( Reify, hreify, hunreify )
27import Rel8.Schema.Result ( Result )
28import Rel8.Table
29 ( Table, Columns, Context, fromColumns, toColumns
30 , Unreify, reify, unreify
31 )
32import Rel8.Table.ADT ( ADT( ADT ) )
33import Rel8.Table.Recontextualize ( Recontextualize )
36type HADT :: K.Context -> K.Rel8able -> Type
37type family HADT context t where
38 HADT (Reify context) t = AHADT context t
39 HADT Result t = t Result
40 HADT context t = ADT t context
43type AHADT :: K.Context -> K.Rel8able -> Type
44newtype AHADT context t = AHADT (HADT context t)
47instance (Rel8able t, Reifiable context) =>
48 Table (Reify context) (AHADT context t)
49 where
50 type Context (AHADT context t) = Reify context
51 type Columns (AHADT context t) = GColumnsADT t
52 type Unreify (AHADT context t) = HADT context t
54 fromColumns = sfromColumnsADT contextSing
55 toColumns = stoColumnsADT contextSing
56 reify _ = AHADT
57 unreify _ (AHADT a) = a
60instance
61 ( Reifiable context, Reifiable context'
62 , Rel8able t, t ~ t'
63 )
64 => Recontextualize
65 (Reify context)
66 (Reify context')
67 (AHADT context t)
68 (AHADT context' t')
71sfromColumnsADT :: Rel8able t
72 => SContext context
73 -> GColumnsADT t (Col (Reify context))
74 -> AHADT context t
75sfromColumnsADT = \case
76 SAggregate -> AHADT . ADT . hunreify
77 SExpr -> AHADT . ADT . hunreify
78 SInsert -> AHADT . ADT . hunreify
79 SName -> AHADT . ADT . hunreify
80 SResult -> AHADT . gunreify . gfromColumnsADT
81 SReify context -> AHADT . sfromColumnsADT context . hunreify
84stoColumnsADT :: Rel8able t
85 => SContext context
86 -> AHADT context t
87 -> GColumnsADT t (Col (Reify context))
88stoColumnsADT = \case
89 SAggregate -> hreify . (\(AHADT (ADT a)) -> a)
90 SExpr -> hreify . (\(AHADT (ADT a)) -> a)
91 SInsert -> hreify . (\(AHADT (ADT a)) -> a)
92 SName -> hreify . (\(AHADT (ADT a)) -> a)
93 SResult -> gtoColumnsADT . greify . (\(AHADT a) -> a)
94 SReify context -> hreify . stoColumnsADT context . (\(AHADT a) -> a)