on e150ff4 help sign in
rel8/src/Rel8/Table/Recontextualize.hs
162 lines 4.7 kB history raw
1{-# language DataKinds #-}
2{-# language FlexibleContexts #-}
3{-# language FlexibleInstances #-}
4{-# language FunctionalDependencies #-}
5{-# language StandaloneKindSignatures #-}
6{-# language TypeFamilies #-}
7{-# language UndecidableInstances #-}
8{-# language UndecidableSuperClasses #-}
10module Rel8.Table.Recontextualize
11 ( Recontextualize
12 , Aggregates
13 , Encodes
14 , Selects
15 , Inserts
16 )
17where
19-- base
20import Data.Functor.Identity ( Identity )
21import Data.Kind ( Constraint, Type )
22import Prelude ()
24-- rel8
25import Rel8.Aggregate ( Aggregate )
26import Rel8.Expr ( Expr )
27import Rel8.Opaque ( Opaque, Opaque1 )
28import Rel8.Schema.Context ( Aggregation, DB, Insertion, Name, Result )
29import Rel8.Schema.Context.Label ( Labelable )
30import Rel8.Schema.HTable ( HTable )
31import Rel8.Schema.HTable.Context ( H )
32import Rel8.Schema.Nullability ( Nullabilizes )
33import Rel8.Schema.Spec ( KnownSpec )
34import qualified Rel8.Schema.Spec as Kind ( Context )
35import Rel8.Table ( Table, Congruent )
36import Rel8.Type ( DBType )
39type Recontextualize :: Kind.Context -> Kind.Context -> Type -> Type -> Constraint
40class
41 ( Table from a
42 , Table to b
43 , Congruent a b
44 , Recontextualize from from a a
45 , Recontextualize to to b b
46 , Recontextualize to from b a
47 ) => Recontextualize from to a b
48 | a -> from
49 , b -> to
50 , a to -> b
51 , b from -> a
54instance (DBType db, Nullabilizes db a) =>
55 Recontextualize Aggregation Aggregation (Aggregate (Expr a)) (Aggregate (Expr a))
58instance (DBType db, Nullabilizes db a) =>
59 Recontextualize Aggregation DB (Aggregate (Expr a)) (Expr a)
62instance (DBType db, Nullabilizes db a) =>
63 Recontextualize Aggregation Result (Aggregate (Expr a)) (Identity a)
66instance (DBType db, Nullabilizes db a) =>
67 Recontextualize DB Aggregation (Expr a) (Aggregate (Expr a))
70instance (DBType db, Nullabilizes db a) =>
71 Recontextualize DB DB (Expr a) (Expr a)
74instance (DBType db, Nullabilizes db a) =>
75 Recontextualize DB Result (Expr a) (Identity a)
78instance (DBType db, Nullabilizes db a) =>
79 Recontextualize Result Aggregation (Identity a) (Aggregate (Expr a))
82instance (DBType db, Nullabilizes db a) =>
83 Recontextualize Result DB (Identity a) (Expr a)
86instance (DBType db, Nullabilizes db a) =>
87 Recontextualize Result Result (Identity a) (Identity a)
90instance KnownSpec spec => Recontextualize from to (from spec) (to spec)
93instance Recontextualize from to (Opaque1 from a) (Opaque1 to a)
96instance HTable t => Recontextualize from to (t (H from)) (t (H to))
99instance
100 ( Table from (t from)
101 , Table to (t to)
102 , Congruent (t from) (t to)
103 ) => Recontextualize from to (t from) (t to)
106instance
107 ( Recontextualize from to a1 b1
108 , Recontextualize from to a2 b2
109 , Labelable from
110 , Labelable to
111 ) => Recontextualize from to (a1, a2) (b1, b2)
114instance
115 ( Recontextualize from to a1 b1
116 , Recontextualize from to a2 b2
117 , Recontextualize from to a3 b3
118 , Labelable from, Labelable to
119 ) => Recontextualize from to (a1, a2, a3) (b1, b2, b3)
122instance
123 ( Recontextualize from to a1 b1
124 , Recontextualize from to a2 b2
125 , Recontextualize from to a3 b3
126 , Recontextualize from to a4 b4
127 , Labelable from, Labelable to
128 ) => Recontextualize from to (a1, a2, a3, a4) (b1, b2, b3, b4)
131instance
132 ( Recontextualize from to a1 b1
133 , Recontextualize from to a2 b2
134 , Recontextualize from to a3 b3
135 , Recontextualize from to a4 b4
136 , Recontextualize from to a5 b5
137 , Labelable from, Labelable to
138 ) => Recontextualize from to (a1, a2, a3, a4, a5) (b1, b2, b3, b4, b5)
141type Aggregates :: Type -> Type -> Constraint
142class Recontextualize Aggregation DB aggregates exprs => Aggregates aggregates exprs
143instance Recontextualize Aggregation DB aggregates exprs => Aggregates aggregates exprs
144instance {-# OVERLAPPING #-} Aggregates (Opaque1 Aggregation Opaque) (Opaque1 DB Opaque)
147type Encodes :: Type -> Type -> Constraint
148class Recontextualize Result DB a exprs => Encodes a exprs
149instance Recontextualize Result DB a exprs => Encodes a exprs
150instance {-# OVERLAPPING #-} Encodes (Opaque1 Result Opaque) (Opaque1 DB Opaque)
153type Inserts :: Type -> Type -> Constraint
154class Recontextualize DB Insertion exprs inserts => Inserts exprs inserts
155instance Recontextualize DB Insertion exprs inserts => Inserts exprs inserts
156instance {-# OVERLAPPING #-} Inserts (Opaque1 DB Opaque) (Opaque1 Insertion Opaque)
159type Selects :: Type -> Type -> Constraint
160class Recontextualize Name DB names exprs => Selects names exprs
161instance Recontextualize Name DB names exprs => Selects names exprs
162instance {-# OVERLAPPING #-} Selects (Opaque1 Name Opaque) (Opaque1 DB Opaque)