@@ -5,8 +5,10 @@
5{-# language FlexibleInstances #-}
5{-# language FlexibleInstances #-}
6{-# language MultiParamTypeClasses #-}
6{-# language MultiParamTypeClasses #-}
7{-# language NamedFieldPuns #-}
7{-# language NamedFieldPuns #-}
8+{-# language ScopedTypeVariables #-}
8{-# language StandaloneKindSignatures #-}
9{-# language StandaloneKindSignatures #-}
9{-# language TupleSections #-}
10{-# language TupleSections #-}
11+{-# language TypeApplications #-}
10{-# language TypeFamilies #-}
12{-# language TypeFamilies #-}
11{-# language UndecidableInstances #-}
13{-# language UndecidableInstances #-}
@@ -29,28 +31,31 @@ import Prelude hiding ( undefined )
29import Rel8.Expr ( Expr )
31import Rel8.Expr ( Expr )
30import Rel8.Expr.Bool ( (&&.), not_ )
32import Rel8.Expr.Bool ( (&&.), not_ )
31import Rel8.Expr.Null ( isNonNull )
33import Rel8.Expr.Null ( isNonNull )
32−import Rel8.Schema.Context.Label ( Labelable, labeler, unlabeler )
34+import Rel8.Schema.Context.Label ( Labelable, labeler, unlabeler, hlabeler )
33import Rel8.Schema.Context.Nullify
35import Rel8.Schema.Context.Nullify
34− ( Nullifiable, NullifiableEq
36+ ( Nullifiable, ConstrainTag
35− , encodeTag, decodeTag
37+ , hencodeTag, hdecodeTag
36− , nullifier, unnullifier
38+ , hnullifier, hunnullifier
38import Rel8.Schema.HTable.Label ( HLabel, hlabel, hunlabel )
40import Rel8.Schema.HTable.Label ( HLabel, hlabel, hunlabel )
39import Rel8.Schema.HTable.Identity ( HIdentity(..) )
41import Rel8.Schema.HTable.Identity ( HIdentity(..) )
42+import Rel8.Schema.HTable.Maybe ( HMaybeNullifiable )
40import Rel8.Schema.HTable.Nullify ( hnullify, hunnullify )
43import Rel8.Schema.HTable.Nullify ( hnullify, hunnullify )
41import Rel8.Schema.HTable.These ( HTheseTable(..) )
44import Rel8.Schema.HTable.These ( HTheseTable(..) )
42import Rel8.Table ( Table, Columns, Context, fromColumns, toColumns )
45import Rel8.Table ( Table, Columns, Context, fromColumns, toColumns )
46+import Rel8.Table.Eq ( EqTable, eqTable )
43import Rel8.Table.Lifted
47import Rel8.Table.Lifted
44− ( Table1, Columns1, ConstrainContext1, fromColumns1, toColumns1
45− , Table2, Columns2, ConstrainContext2, fromColumns2, toColumns2
48+ ( Table2, Columns2, ConstrainHContext2, fromColumns2, toColumns2
47import Rel8.Table.Maybe
50import Rel8.Table.Maybe
48 ( MaybeTable(..)
51 ( MaybeTable(..)
49 , maybeTable, justTable, nothingTable
52 , maybeTable, justTable, nothingTable
50 , isJustTable
53 , isJustTable
55+import Rel8.Table.Ord ( OrdTable, ordTable )
52import Rel8.Table.Recontextualize ( Recontextualize )
56import Rel8.Table.Recontextualize ( Recontextualize )
53import Rel8.Table.Undefined ( undefined )
57import Rel8.Table.Undefined ( undefined )
58+import Rel8.Type.Tag ( MaybeTag )
55-- semigroupoids
60-- semigroupoids
56import Data.Functor.Apply ( Apply, (<.>) )
61import Data.Functor.Apply ( Apply, (<.>) )
@@ -108,37 +113,37 @@ instance (Table Expr a, Table Expr b, Semigroup a, Semigroup b) =>
109instance Table2 TheseTable where
114instance Table2 TheseTable where
110 type Columns2 TheseTable = HTheseTable
115 type Columns2 TheseTable = HTheseTable
111− type ConstrainContext2 TheseTable = Nullifiable
116+ type ConstrainHContext2 TheseTable = HMaybeNullifiable
113 toColumns2 f g TheseTable {here, there} = HTheseTable
118 toColumns2 f g TheseTable {here, there} = HTheseTable
114− { hhereTag = HIdentity $ encodeTag (tag here)
119+ { hhereTag = HIdentity $ hencodeTag (tag here)
115− , hhere = hnullify (nullifier (isNonNull (tag here))) $ f (just here)
120+ , hhere = hnullify (hnullifier (isNonNull (tag here))) $ f (just here)
116− , hthereTag = HIdentity $ encodeTag (tag there)
121+ , hthereTag = HIdentity $ hencodeTag (tag there)
117− , hthere = hnullify (nullifier (isNonNull (tag there))) $ g (just there)
122+ , hthere = hnullify (hnullifier (isNonNull (tag there))) $ g (just there)
120 fromColumns2 f g HTheseTable {hhereTag, hhere, hthereTag, hthere} =
125 fromColumns2 f g HTheseTable {hhereTag, hhere, hthereTag, hthere} =
121 TheseTable
126 TheseTable
124− tag = decodeTag $ unHIdentity hhereTag
129+ tag = hdecodeTag $ unHIdentity hhereTag
126 MaybeTable
131 MaybeTable
128 , just = f $
133 , just = f $
129 runIdentity $
134 runIdentity $
130− hunnullify (\a -> pure . unnullifier (isNonNull tag) a)
135+ hunnullify (\a -> pure . hunnullifier (isNonNull tag) a)
133 , there =
138 , there =
135− tag = decodeTag $ unHIdentity hthereTag
140+ tag = hdecodeTag $ unHIdentity hthereTag
137 MaybeTable
142 MaybeTable
139 , just = g $
144 , just = g $
140 runIdentity $
145 runIdentity $
141− hunnullify (\a -> pure . unnullifier (isNonNull tag) a)
146+ hunnullify (\a -> pure . hunnullifier (isNonNull tag) a)
@@ -147,17 +152,9 @@ instance Table2 TheseTable where
147 {-# INLINABLE toColumns2 #-}
152 {-# INLINABLE toColumns2 #-}
150−instance Table context a => Table1 (TheseTable a) where
151− type Columns1 (TheseTable a) = HTheseTable (Columns a)
152− type ConstrainContext1 (TheseTable a) = NullifiableEq (Context a)
154− toColumns1 = toColumns2 toColumns
155− fromColumns1 = fromColumns2 fromColumns
159 ( Table context a, Table context b
156 ( Table context a, Table context b
160− , Labelable context, Nullifiable context
157+ , Labelable context, Nullifiable context, ConstrainTag context MaybeTag
161 ) => Table context (TheseTable a b)
158 ) => Table context (TheseTable a b)
163 type Columns (TheseTable a b) =
160 type Columns (TheseTable a b) =
@@ -175,14 +172,26 @@ instance
178− ( Labelable from, Nullifiable from
175+ ( Labelable from, Nullifiable from, ConstrainTag from MaybeTag
179− , Labelable to, Nullifiable to
176+ , Labelable to, Nullifiable to, ConstrainTag to MaybeTag
180 , Recontextualize from to a1 b1
177 , Recontextualize from to a1 b1
181 , Recontextualize from to a2 b2
178 , Recontextualize from to a2 b2
183 Recontextualize from to (TheseTable a1 a2) (TheseTable b1 b2)
180 Recontextualize from to (TheseTable a1 a2) (TheseTable b1 b2)
183+instance (EqTable a, EqTable b) => EqTable (TheseTable a b) where
185+ toColumns2 (hlabel hlabeler) (hlabel hlabeler)
186+ (thoseTable (eqTable @a) (eqTable @b))
189+instance (OrdTable a, OrdTable b) => OrdTable (TheseTable a b) where
191+ toColumns2 (hlabel hlabeler) (hlabel hlabeler)
192+ (thoseTable (ordTable @a) (ordTable @b))
186isThisTable :: TheseTable a b -> Expr Bool
195isThisTable :: TheseTable a b -> Expr Bool
187isThisTable a = hasHereTable a &&. not_ (hasThereTable a)
196isThisTable a = hasHereTable a &&. not_ (hasThereTable a)