@@ -5,8 +5,10 @@
55{-# language FlexibleInstances #-}
66{-# language MultiParamTypeClasses #-}
77{-# language NamedFieldPuns #-}
8+{-# language ScopedTypeVariables #-}
89{-# language StandaloneKindSignatures #-}
910{-# language TupleSections #-}
11+{-# language TypeApplications #-}
1012{-# language TypeFamilies #-}
1113{-# language UndecidableInstances #-}
1214
@@ -29,28 +31,31 @@ import Prelude hiding ( undefined )
2931import Rel8.Expr ( Expr )
3032import Rel8.Expr.Bool ( (&&.), not_ )
3133import Rel8.Expr.Null ( isNonNull )
32−import Rel8.Schema.Context.Label ( Labelable, labeler, unlabeler )
34+import Rel8.Schema.Context.Label ( Labelable, labeler, unlabeler, hlabeler )
3335import Rel8.Schema.Context.Nullify
34− ( Nullifiable, NullifiableEq
35− , encodeTag, decodeTag
36− , nullifier, unnullifier
36+ ( Nullifiable, ConstrainTag
37+ , hencodeTag, hdecodeTag
38+ , hnullifier, hunnullifier
3739 )
3840import Rel8.Schema.HTable.Label ( HLabel, hlabel, hunlabel )
3941import Rel8.Schema.HTable.Identity ( HIdentity(..) )
42+import Rel8.Schema.HTable.Maybe ( HMaybeNullifiable )
4043import Rel8.Schema.HTable.Nullify ( hnullify, hunnullify )
4144import Rel8.Schema.HTable.These ( HTheseTable(..) )
4245import Rel8.Table ( Table, Columns, Context, fromColumns, toColumns )
46+import Rel8.Table.Eq ( EqTable, eqTable )
4347import Rel8.Table.Lifted
44− ( Table1, Columns1, ConstrainContext1, fromColumns1, toColumns1
45− , Table2, Columns2, ConstrainContext2, fromColumns2, toColumns2
48+ ( Table2, Columns2, ConstrainHContext2, fromColumns2, toColumns2
4649 )
4750import Rel8.Table.Maybe
4851 ( MaybeTable(..)
4952 , maybeTable, justTable, nothingTable
5053 , isJustTable
5154 )
55+import Rel8.Table.Ord ( OrdTable, ordTable )
5256import Rel8.Table.Recontextualize ( Recontextualize )
5357import Rel8.Table.Undefined ( undefined )
58+import Rel8.Type.Tag ( MaybeTag )
5459
5560-- semigroupoids
5661import Data.Functor.Apply ( Apply, (<.>) )
@@ -108,37 +113,37 @@ instance (Table Expr a, Table Expr b, Semigroup a, Semigroup b) =>
108113
109114instance Table2 TheseTable where
110115 type Columns2 TheseTable = HTheseTable
111− type ConstrainContext2 TheseTable = Nullifiable
116+ type ConstrainHContext2 TheseTable = HMaybeNullifiable
112117
113118 toColumns2 f g TheseTable {here, there} = HTheseTable
114− { hhereTag = HIdentity $ encodeTag (tag here)
115− , hhere = hnullify (nullifier (isNonNull (tag here))) $ f (just here)
116− , hthereTag = HIdentity $ encodeTag (tag there)
117− , hthere = hnullify (nullifier (isNonNull (tag there))) $ g (just there)
119+ { hhereTag = HIdentity $ hencodeTag (tag here)
120+ , hhere = hnullify (hnullifier (isNonNull (tag here))) $ f (just here)
121+ , hthereTag = HIdentity $ hencodeTag (tag there)
122+ , hthere = hnullify (hnullifier (isNonNull (tag there))) $ g (just there)
118123 }
119124
120125 fromColumns2 f g HTheseTable {hhereTag, hhere, hthereTag, hthere} =
121126 TheseTable
122127 { here =
123128 let
124− tag = decodeTag $ unHIdentity hhereTag
129+ tag = hdecodeTag $ unHIdentity hhereTag
125130 in
126131 MaybeTable
127132 { tag
128133 , just = f $
129134 runIdentity $
130− hunnullify (\a -> pure . unnullifier (isNonNull tag) a)
135+ hunnullify (\a -> pure . hunnullifier (isNonNull tag) a)
131136 hhere
132137 }
133138 , there =
134139 let
135− tag = decodeTag $ unHIdentity hthereTag
140+ tag = hdecodeTag $ unHIdentity hthereTag
136141 in
137142 MaybeTable
138143 { tag
139144 , just = g $
140145 runIdentity $
141− hunnullify (\a -> pure . unnullifier (isNonNull tag) a)
146+ hunnullify (\a -> pure . hunnullifier (isNonNull tag) a)
142147 hthere
143148 }
144149 }
@@ -147,17 +152,9 @@ instance Table2 TheseTable where
147152 {-# INLINABLE toColumns2 #-}
148153
149154
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)
153−
154− toColumns1 = toColumns2 toColumns
155− fromColumns1 = fromColumns2 fromColumns
156−
157−
158155instance
159156 ( Table context a, Table context b
160− , Labelable context, Nullifiable context
157+ , Labelable context, Nullifiable context, ConstrainTag context MaybeTag
161158 ) => Table context (TheseTable a b)
162159 where
163160 type Columns (TheseTable a b) =
@@ -175,14 +172,26 @@ instance
175172
176173
177174instance
178− ( Labelable from, Nullifiable from
179− , Labelable to, Nullifiable to
175+ ( Labelable from, Nullifiable from, ConstrainTag from MaybeTag
176+ , Labelable to, Nullifiable to, ConstrainTag to MaybeTag
180177 , Recontextualize from to a1 b1
181178 , Recontextualize from to a2 b2
182179 ) =>
183180 Recontextualize from to (TheseTable a1 a2) (TheseTable b1 b2)
184181
185182
183+instance (EqTable a, EqTable b) => EqTable (TheseTable a b) where
184+ eqTable =
185+ toColumns2 (hlabel hlabeler) (hlabel hlabeler)
186+ (thoseTable (eqTable @a) (eqTable @b))
187+
188+
189+instance (OrdTable a, OrdTable b) => OrdTable (TheseTable a b) where
190+ ordTable =
191+ toColumns2 (hlabel hlabeler) (hlabel hlabeler)
192+ (thoseTable (ordTable @a) (ordTable @b))
193+
194+
186195isThisTable :: TheseTable a b -> Expr Bool
187196isThisTable a = hasHereTable a &&. not_ (hasThereTable a)
188197