@@ -3,6 +3,7 @@
3{-# language DerivingStrategies #-}
3{-# language DerivingStrategies #-}
4{-# language FlexibleContexts #-}
4{-# language FlexibleContexts #-}
5{-# language FlexibleInstances #-}
5{-# language FlexibleInstances #-}
6+{-# language LambdaCase #-}
6{-# language MultiParamTypeClasses #-}
7{-# language MultiParamTypeClasses #-}
7{-# language NamedFieldPuns #-}
8{-# language NamedFieldPuns #-}
8{-# language ScopedTypeVariables #-}
9{-# language ScopedTypeVariables #-}
@@ -17,7 +18,7 @@ module Rel8.Table.Either
17 ( EitherTable(..)
18 ( EitherTable(..)
18 , eitherTable, leftTable, rightTable
19 , eitherTable, leftTable, rightTable
19 , isLeftTable, isRightTable
20 , isLeftTable, isRightTable
20− , aggregateEitherTable, nameEitherTable
21+ , aggregateEitherTable, insertEitherTable, nameEitherTable
@@ -48,6 +49,7 @@ import Rel8.Schema.HTable.Either ( HEitherTable(..) )
48import Rel8.Schema.HTable.Identity ( HIdentity(..) )
49import Rel8.Schema.HTable.Identity ( HIdentity(..) )
49import Rel8.Schema.HTable.Label ( hlabel, hunlabel )
50import Rel8.Schema.HTable.Label ( hlabel, hunlabel )
50import Rel8.Schema.HTable.Nullify ( hnullify, hunnullify )
51import Rel8.Schema.HTable.Nullify ( hnullify, hunnullify )
52+import Rel8.Schema.Insert ( Insert )
51import Rel8.Schema.Name ( Name )
53import Rel8.Schema.Name ( Name )
52import Rel8.Table
54import Rel8.Table
53 ( Table, Columns, Context, fromColumns, toColumns
55 ( Table, Columns, Context, fromColumns, toColumns
@@ -55,6 +57,7 @@ import Rel8.Table
56import Rel8.Table.Bool ( bool )
58import Rel8.Table.Bool ( bool )
57import Rel8.Table.Eq ( EqTable, eqTable )
59import Rel8.Table.Eq ( EqTable, eqTable )
60+import Rel8.Table.Insert ( toInsert )
58import Rel8.Table.Ord ( OrdTable, ordTable )
61import Rel8.Table.Ord ( OrdTable, ordTable )
59import Rel8.Table.Recontextualize ( Recontextualize )
62import Rel8.Table.Recontextualize ( Recontextualize )
60import Rel8.Table.Serialize ( FromExprs, ToExprs, fromResult, toResult )
63import Rel8.Table.Serialize ( FromExprs, ToExprs, fromResult, toResult )
@@ -188,6 +191,13 @@ aggregateEitherTable f g EitherTable {tag, left, right} =
188 aggregate = unsafeMakeAggregate toPrimExpr fromPrimExpr aggregator expr
191 aggregate = unsafeMakeAggregate toPrimExpr fromPrimExpr aggregator expr
194+insertEitherTable :: (Table Insert a, Table Insert b)
195+ => Either a b -> EitherTable a b
196+insertEitherTable = \case
197+ Left a -> EitherTable (fromExpr (litExpr IsLeft)) a (fromColumns (toInsert undefined))
198+ Right b -> EitherTable (fromExpr (litExpr IsRight)) (fromColumns (toInsert undefined)) b
191nameEitherTable :: Name EitherTag -> a -> b -> EitherTable a b
201nameEitherTable :: Name EitherTag -> a -> b -> EitherTable a b
192nameEitherTable = EitherTable . fromName
202nameEitherTable = EitherTable . fromName