@@ -3,6 +3,7 @@
33{-# language DerivingStrategies #-}
44{-# language FlexibleContexts #-}
55{-# language FlexibleInstances #-}
6+{-# language LambdaCase #-}
67{-# language MultiParamTypeClasses #-}
78{-# language NamedFieldPuns #-}
89{-# language ScopedTypeVariables #-}
@@ -17,7 +18,7 @@ module Rel8.Table.Either
1718 ( EitherTable(..)
1819 , eitherTable, leftTable, rightTable
1920 , isLeftTable, isRightTable
20− , aggregateEitherTable, nameEitherTable
21+ , aggregateEitherTable, insertEitherTable, nameEitherTable
2122 )
2223where
2324
@@ -48,6 +49,7 @@ import Rel8.Schema.HTable.Either ( HEitherTable(..) )
4849import Rel8.Schema.HTable.Identity ( HIdentity(..) )
4950import Rel8.Schema.HTable.Label ( hlabel, hunlabel )
5051import Rel8.Schema.HTable.Nullify ( hnullify, hunnullify )
52+import Rel8.Schema.Insert ( Insert )
5153import Rel8.Schema.Name ( Name )
5254import Rel8.Table
5355 ( Table, Columns, Context, fromColumns, toColumns
@@ -55,6 +57,7 @@ import Rel8.Table
5557 )
5658import Rel8.Table.Bool ( bool )
5759import Rel8.Table.Eq ( EqTable, eqTable )
60+import Rel8.Table.Insert ( toInsert )
5861import Rel8.Table.Ord ( OrdTable, ordTable )
5962import Rel8.Table.Recontextualize ( Recontextualize )
6063import Rel8.Table.Serialize ( FromExprs, ToExprs, fromResult, toResult )
@@ -188,6 +191,13 @@ aggregateEitherTable f g EitherTable {tag, left, right} =
188191 aggregate = unsafeMakeAggregate toPrimExpr fromPrimExpr aggregator expr
189192
190193
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
199+
200+
191201nameEitherTable :: Name EitherTag -> a -> b -> EitherTable a b
192202nameEitherTable = EitherTable . fromName
193203