on da76712 help sign in
rel8/src/Rel8/Table/Rel8able.hs
92 lines 2.2 kB history raw
1{-# language DataKinds #-}
2{-# language FlexibleInstances #-}
3{-# language MultiParamTypeClasses #-}
4{-# language ScopedTypeVariables #-}
5{-# language StandaloneKindSignatures #-}
6{-# language TypeApplications #-}
7{-# language TypeFamilies #-}
8{-# language UndecidableInstances #-}
10{-# options_ghc -fno-warn-orphans #-}
12module Rel8.Table.Rel8able
13 (
14 )
15where
17-- base
18import Prelude ()
20-- rel8
21import Rel8.Expr ( Expr )
22import qualified Rel8.Kind.Algebra as K
23import Rel8.Kind.Context ( Reifiable, contextSing )
24import Rel8.Generic.Rel8able
25 ( Rel8able, Algebra
26 , GColumns, gfromColumns, gtoColumns
27 , GFromExprs, gfromResult, gtoResult
28 )
29import qualified Rel8.Schema.Kind as K
30import Rel8.Schema.HTable ( HConstrainTable, hdicts )
31import Rel8.Schema.Null ( Sql )
32import Rel8.Schema.Result ( Result )
33import Rel8.Table
34 ( Table, Columns, Context, fromColumns, toColumns
35 , FromExprs, fromResult, toResult
36 , Transpose
37 )
38import Rel8.Table.ADT ( ADT )
39import Rel8.Table.Eq ( EqTable, eqTable )
40import Rel8.Table.Ord ( OrdTable, ordTable )
41import Rel8.Table.Serialize ( ToExprs )
42import Rel8.Type.Eq ( DBEq )
43import Rel8.Type.Ord ( DBOrd )
46instance (Rel8able t, Reifiable context, context ~ context') =>
47 Table context' (t context)
48 where
49 type Columns (t context) = GColumns t
50 type Context (t context) = context
51 type FromExprs (t context) = GFromExprs t
52 type Transpose to (t context) = t to
54 fromColumns = gfromColumns contextSing
55 toColumns = gtoColumns contextSing
56 fromResult = gfromResult @t
57 toResult = gtoResult @t
60instance
61 ( context ~ Expr
62 , Rel8able t
63 , HConstrainTable (Columns (t context)) (Sql DBEq)
64 )
65 => EqTable (t context)
66 where
67 eqTable = hdicts @(Columns (t context)) @(Sql DBEq)
70instance
71 ( context ~ Expr
72 , Rel8able t
73 , HConstrainTable (Columns (t context)) (Sql DBEq)
74 , HConstrainTable (Columns (t context)) (Sql DBOrd)
75 )
76 => OrdTable (t context)
77 where
78 ordTable = hdicts @(Columns (t context)) @(Sql DBOrd)
81instance
82 ( Rel8able t', t' ~ Choose (Algebra t) t
83 , x ~ t' Expr
84 , result ~ Result
85 )
86 => ToExprs x (t result)
89type Choose :: K.Algebra -> K.Rel8able -> K.Rel8able
90type family Choose algebra t where
91 Choose 'K.Sum t = ADT t
92 Choose 'K.Product t = t