on master help sign in
Better unreification; allow more nesting inside HLists
commitf8b1a5514e797add26995108a5204352e6c6cb59 authorShane O'Brien <shane.obrien@circuithub.com> dateWed 5 May 2021, 23:57 (6 years ago) parent2615b89
6 files changed+151−49
src/Rel8/Column/List.hs+31−17 src/Rel8/Column/NonEmpty.hs+31−17 src/Rel8/Generic/Rel8able/Test.hs+8 src/Rel8/Table/List.hs+3−3 src/Rel8/Table/NonEmpty.hs+3−3 src/Rel8/Table/Unreify.hs+75−9
src/Rel8/Column/List.hs+31−17
@@ -1,6 +1,5 @@
11{-# language DataKinds #-}
22{-# language FlexibleContexts #-}
3−{-# language GADTs #-}
43{-# language LambdaCase #-}
54{-# language MultiParamTypeClasses #-}
65{-# language StandaloneKindSignatures #-}
@@ -14,6 +13,7 @@ where
1413
1514-- base
1615import Data.Kind ( Type )
16+import Data.Type.Equality ( (:~:)( Refl ) )
1717import Prelude
1818
1919-- rel8
@@ -33,7 +33,10 @@ import Rel8.Table
3333 )
3434import Rel8.Table.List ( ListTable( ListTable ) )
3535import Rel8.Table.Recontextualize ( Recontextualize )
36−import Rel8.Table.Unreify ( Unreifiable )
36+import Rel8.Table.Unreify
37+ ( Unreifiability( Unreifiability )
38+ , Unreifiable, unreifiability
39+ )
3740
3841
3942type HList :: K.Context -> Type -> Type
@@ -50,12 +53,8 @@ type AHList :: K.Context -> Type -> Type
5053newtype AHList context a = AHList (HList context a)
5154
5255
53−instance
54− ( Reifiable context
55− , Table (Reify context) a
56− , Unreifiable (Reify context) a
57− )
58− => Table (Reify context) (AHList context a)
56+instance (Reifiable context, Unreifiable a, Table (Reify context) a) =>
57+ Table (Reify context) (AHList context a)
5958 where
6059 type Context (AHList context a) = Reify context
6160 type Columns (AHList context a) = HListTable (Columns a)
@@ -63,20 +62,17 @@ instance
6362
6463 fromColumns = sfromColumnsList contextSing
6564 toColumns = stoColumnsList contextSing
66− reify proof =
67− smapList contextSing (reify proof) hreify .
68− AHList
69− unreify proof =
70− (\(AHList a) -> a) .
71− smapList contextSing (unreify proof) hunreify
65+
66+ reify _ = sreifyList (unreifiability contextSing)
67+ unreify _ = sunreifyList (unreifiability contextSing)
7268
7369
7470instance
7571 ( Reifiable context, Reifiable context'
76− , Unreifiable (Reify context) a, Unreifiable (Reify context') a'
72+ , Unreifiable a, Unreifiable a'
7773 , Recontextualize (Reify context) (Reify context') a a'
78− ) =>
79− Recontextualize
74+ )
75+ => Recontextualize
8076 (Reify context)
8177 (Reify context')
8278 (AHList context a)
@@ -131,3 +127,21 @@ stoColumnsList = \case
131127 stoColumnsList context .
132128 smapList context (hunreify . toColumns) hunreify .
133129 (\(AHList a) -> a)
130+
131+
132+sreifyList :: ()
133+ => Unreifiability context a
134+ -> HList context (Unreify a)
135+ -> AHList context a
136+sreifyList (Unreifiability context) =
137+ smapList context (reify Refl) hreify .
138+ AHList
139+
140+
141+sunreifyList :: ()
142+ => Unreifiability context a
143+ -> AHList context a
144+ -> HList context (Unreify a)
145+sunreifyList (Unreifiability context) =
146+ (\(AHList a) -> a) .
147+ smapList context (unreify Refl) hunreify
src/Rel8/Column/NonEmpty.hs+31−17
@@ -1,6 +1,5 @@
11{-# language DataKinds #-}
22{-# language FlexibleContexts #-}
3−{-# language GADTs #-}
43{-# language LambdaCase #-}
54{-# language MultiParamTypeClasses #-}
65{-# language StandaloneKindSignatures #-}
@@ -15,6 +14,7 @@ where
1514-- base
1615import Data.Kind ( Type )
1716import Data.List.NonEmpty ( NonEmpty )
17+import Data.Type.Equality ( (:~:)( Refl ) )
1818import Prelude
1919
2020-- rel8
@@ -34,7 +34,10 @@ import Rel8.Table
3434 )
3535import Rel8.Table.NonEmpty ( NonEmptyTable( NonEmptyTable ) )
3636import Rel8.Table.Recontextualize ( Recontextualize )
37−import Rel8.Table.Unreify ( Unreifiable )
37+import Rel8.Table.Unreify
38+ ( Unreifiability( Unreifiability )
39+ , Unreifiable, unreifiability
40+ )
3841
3942
4043type HNonEmpty :: K.Context -> Type -> Type
@@ -51,12 +54,8 @@ type AHNonEmpty :: K.Context -> Type -> Type
5154newtype AHNonEmpty context a = AHNonEmpty (HNonEmpty context a)
5255
5356
54−instance
55− ( Reifiable context
56− , Table (Reify context) a
57− , Unreifiable (Reify context) a
58− )
59− => Table (Reify context) (AHNonEmpty context a)
57+instance (Reifiable context, Unreifiable a, Table (Reify context) a) =>
58+ Table (Reify context) (AHNonEmpty context a)
6059 where
6160 type Context (AHNonEmpty context a) = Reify context
6261 type Columns (AHNonEmpty context a) = HNonEmptyTable (Columns a)
@@ -64,20 +63,17 @@ instance
6463
6564 fromColumns = sfromColumnsNonEmpty contextSing
6665 toColumns = stoColumnsNonEmpty contextSing
67− reify proof =
68− smapNonEmpty contextSing (reify proof) hreify .
69− AHNonEmpty
70− unreify proof =
71− (\(AHNonEmpty a) -> a) .
72− smapNonEmpty contextSing (unreify proof) hunreify
66+
67+ reify _ = sreifyNonEmpty (unreifiability contextSing)
68+ unreify _ = sunreifyNonEmpty (unreifiability contextSing)
7369
7470
7571instance
7672 ( Reifiable context, Reifiable context'
77− , Unreifiable (Reify context) a, Unreifiable (Reify context') a'
73+ , Unreifiable a, Unreifiable a'
7874 , Recontextualize (Reify context) (Reify context') a a'
79− ) =>
80− Recontextualize
75+ )
76+ => Recontextualize
8177 (Reify context)
8278 (Reify context')
8379 (AHNonEmpty context a)
@@ -133,3 +129,21 @@ stoColumnsNonEmpty = \case
133129 stoColumnsNonEmpty context .
134130 smapNonEmpty context (hunreify . toColumns) hunreify .
135131 (\(AHNonEmpty a) -> a)
132+
133+
134+sreifyNonEmpty :: ()
135+ => Unreifiability context a
136+ -> HNonEmpty context (Unreify a)
137+ -> AHNonEmpty context a
138+sreifyNonEmpty (Unreifiability context) =
139+ smapNonEmpty context (reify Refl) hreify .
140+ AHNonEmpty
141+
142+
143+sunreifyNonEmpty :: ()
144+ => Unreifiability context a
145+ -> AHNonEmpty context a
146+ -> HNonEmpty context (Unreify a)
147+sunreifyNonEmpty (Unreifiability context) =
148+ (\(AHNonEmpty a) -> a) .
149+ smapNonEmpty context (unreify Refl) hunreify
src/Rel8/Generic/Rel8able/Test.hs+8
@@ -82,6 +82,14 @@ data TableNonEmpty f = TableNonEmpty
8282 deriving anyclass Rel8able
8383
8484
85+data TableNest f = TableNest
86+ { foo :: Column f Bool
87+ , bars :: HList f (HMaybe f (TablePair f))
88+ }
89+ deriving stock Generic
90+ deriving anyclass Rel8able
91+
92+
8593data S3Object = S3Object
8694 { bucketName :: Text
8795 , objectKey :: Text
src/Rel8/Table/List.hs+3−3
@@ -45,7 +45,7 @@ import Rel8.Table.Eq ( EqTable, eqTable )
4545import Rel8.Table.Ord ( OrdTable, ordTable )
4646import Rel8.Table.Recontextualize ( Recontextualize )
4747import Rel8.Table.Serialize ( FromExprs, ToExprs, fromResult, toResult )
48−import Rel8.Table.Unreify ( Unreifiable )
48+import Rel8.Table.Unreify ( Unreifies )
4949
5050
5151-- | A @ListTable@ value contains zero or more instances of @a@. You construct
@@ -54,7 +54,7 @@ type ListTable :: Type -> Type
5454newtype ListTable a = ListTable (HListTable (Columns a) (Col (Context a)))
5555
5656
57−instance (Table context a, Unreifiable context a) =>
57+instance (Table context a, Unreifies context a) =>
5858 Table context (ListTable a)
5959 where
6060 type Columns (ListTable a) = HListTable (Columns a)
@@ -68,7 +68,7 @@ instance (Table context a, Unreifiable context a) =>
6868
6969
7070instance
71− ( Unreifiable from a, Unreifiable to b
71+ ( Unreifies from a, Unreifies to b
7272 , Recontextualize from to a b
7373 )
7474 => Recontextualize from to (ListTable a) (ListTable b)
src/Rel8/Table/NonEmpty.hs+3−3
@@ -43,7 +43,7 @@ import Rel8.Table.Eq ( EqTable, eqTable )
4343import Rel8.Table.Ord ( OrdTable, ordTable )
4444import Rel8.Table.Recontextualize ( Recontextualize )
4545import Rel8.Table.Serialize ( FromExprs, ToExprs, fromResult, toResult )
46−import Rel8.Table.Unreify ( Unreifiable )
46+import Rel8.Table.Unreify ( Unreifies )
4747
4848
4949-- | A @NonEmptyTable@ value contains one or more instances of @a@. You
@@ -53,7 +53,7 @@ newtype NonEmptyTable a =
5353 NonEmptyTable (HNonEmptyTable (Columns a) (Col (Context a)))
5454
5555
56−instance (Table context a, Unreifiable context a) =>
56+instance (Table context a, Unreifies context a) =>
5757 Table context (NonEmptyTable a)
5858 where
5959 type Columns (NonEmptyTable a) = HNonEmptyTable (Columns a)
@@ -67,7 +67,7 @@ instance (Table context a, Unreifiable context a) =>
6767
6868
6969instance
70− ( Unreifiable from a, Unreifiable to b
70+ ( Unreifies from a, Unreifies to b
7171 , Recontextualize from to a b
7272 )
7373 => Recontextualize from to (NonEmptyTable a) (NonEmptyTable b)
src/Rel8/Table/Unreify.hs+75−9
@@ -1,4 +1,11 @@
11{-# language DataKinds #-}
2+{-# language FlexibleContexts #-}
3+{-# language FlexibleInstances #-}
4+{-# language GADTs #-}
5+{-# language LambdaCase #-}
6+{-# language MultiParamTypeClasses #-}
7+{-# language QuantifiedConstraints #-}
8+{-# language RankNTypes #-}
29{-# language StandaloneKindSignatures #-}
310{-# language TypeFamilies #-}
411{-# language UndecidableInstances #-}
@@ -20,7 +27,8 @@
2027-- @Table@)
2128
2229module Rel8.Table.Unreify
23− ( Unreifiable
30+ ( Unreifiable, Unreifiability( Unreifiability ), unreifiability
31+ , Unreifies
2432 )
2533where
2634
@@ -29,15 +37,73 @@ import Data.Kind ( Constraint, Type )
2937import Prelude ()
3038
3139-- rel8
40+import Rel8.Aggregate ( Aggregate )
41+import Rel8.Expr ( Expr )
42+import Rel8.Kind.Context ( SContext(..), Reifiable, sReifiable )
43+import Rel8.Schema.Dict ( Dict( Dict ) )
44+import Rel8.Schema.Insert ( Insert )
3245import qualified Rel8.Schema.Kind as K
46+import Rel8.Schema.Name ( Name )
3347import Rel8.Schema.Reify ( Reify )
34−import Rel8.Table ( Table, Columns, Unreify )
48+import Rel8.Schema.Result ( Result )
49+import Rel8.Table ( Table, Context, Congruent, Unreify )
3550
3651
37−type Unreifiable :: K.Context -> Type -> Constraint
38−type family Unreifiable context a where
39− Unreifiable (Reify context) a =
40− ( Table context (Unreify a)
41− , Columns a ~ Columns (Unreify a)
42− )
43− Unreifiable _ _ = ()
52+type Unreifies :: K.Context -> Type -> Constraint
53+type family Unreifies context a where
54+ Unreifies (Reify context) a = Unreifier context a
55+ Unreifies _ _ = ()
56+
57+
58+type Unreifiable :: Type -> Constraint
59+class
60+ ( Context a ~ Reify Aggregate => Unreifier Aggregate a
61+ , Context a ~ Reify Expr => Unreifier Expr a
62+ , Context a ~ Reify Insert => Unreifier Insert a
63+ , Context a ~ Reify Name => Unreifier Name a
64+ , Context a ~ Reify Result => Unreifier Result a
65+ , (forall ctx. (Context a ~ Reify (Reify ctx), Reifiable ctx) => Unreifier (Reify ctx) a)
66+ )
67+ => Unreifiable a
68+instance
69+ ( Context a ~ Reify Aggregate => Unreifier Aggregate a
70+ , Context a ~ Reify Expr => Unreifier Expr a
71+ , Context a ~ Reify Insert => Unreifier Insert a
72+ , Context a ~ Reify Name => Unreifier Name a
73+ , Context a ~ Reify Result => Unreifier Result a
74+ , (forall ctx. (Context a ~ Reify (Reify ctx), Reifiable ctx) => Unreifier (Reify ctx) a)
75+ )
76+ => Unreifiable a
77+
78+
79+type Unreifier :: K.Context -> Type -> Constraint
80+class
81+ ( Table (Reify context) a
82+ , Table context (Unreify a)
83+ , Congruent a (Unreify a)
84+ )
85+ => Unreifier context a
86+instance
87+ ( Table (Reify context) a
88+ , Table context (Unreify a)
89+ , Congruent a (Unreify a)
90+ )
91+ => Unreifier context a
92+
93+
94+type Unreifiability :: K.Context -> Type -> Type
95+data Unreifiability context a where
96+ Unreifiability :: Unreifier context a
97+ => SContext context -> Unreifiability context a
98+
99+
100+unreifiability :: (Context a ~ Reify context, Unreifiable a)
101+ => SContext context -> Unreifiability context a
102+unreifiability = \case
103+ SAggregate -> Unreifiability SAggregate
104+ SExpr -> Unreifiability SExpr
105+ SInsert -> Unreifiability SInsert
106+ SName -> Unreifiability SName
107+ SResult -> Unreifiability SResult
108+ SReify context -> case sReifiable context of
109+ Dict -> Unreifiability (SReify context)