@@ -39,12 +39,14 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
39
39
40
40
module Language.CQL.Schema where
41
41
import Control.DeepSeq
42
+ import Data.Bifunctor (second )
42
43
import Data.List (nub )
43
44
import Data.Map.Strict as Map
44
45
import Data.Maybe
45
46
import Data.Set as Set
46
47
import Data.Typeable
47
48
import Data.Void
49
+ import Control.Arrow ((***) )
48
50
import Language.CQL.Collage (Collage (.. ), typeOfCol )
49
51
import Language.CQL.Common
50
52
import Language.CQL.Options
@@ -98,26 +100,29 @@ typecheckSchema
98
100
:: (MultiTyMap '[Show , Ord , NFData ] '[var , ty , sym , en , fk , att ])
99
101
=> Schema var ty sym en fk att
100
102
-> Err ()
101
- typecheckSchema t = typeOfCol $ schToCol t
103
+ typecheckSchema = typeOfCol . toCollage
102
104
103
105
-- | Converts a schema to a collage.
104
- schToCol
106
+ toCollage
105
107
:: (MultiTyMap '[Show , Ord , NFData ] '[var , ty , sym , en , fk , att ])
106
- => Schema var ty sym en fk att
108
+ => Schema var ty sym en fk att
107
109
-> Collage (() + var ) ty sym en fk att Void Void
108
- schToCol (Schema ts ens' fks' atts' path_eqs' obs_eqs' _) =
109
- Collage (Set. union e3 $ Set. union e1 e2) (ctys tscol)
110
- ens' (csyms tscol) fks' atts' Map. empty Map. empty
110
+ toCollage (Schema ts ens' fks' atts' path_eqs' obs_eqs' _) =
111
+ Collage (eqs1 <> eqs2 <> eqs3) (ctys tscol) ens' (csyms tscol) fks' atts' Map. empty Map. empty
111
112
where
112
113
tscol = tsToCol ts
113
- e1 = Set. map (\ (en, EQ (l,r))-> (Map. fromList [(Left () ,Right en)], EQ (upp l, upp r))) path_eqs'
114
- e2 = Set. map (\ (en, EQ (l,r))-> (Map. fromList [(Left () ,Right en)], EQ (upp l, upp r))) obs_eqs'
115
- e3 = Set. map (\ (g,EQ (l,r))-> (up1Ctx g, EQ (upp l, upp r))) $ ceqs tscol
116
114
117
- up1Ctx :: (Ord var ) => Ctx var (ty + Void ) -> Ctx (() + var ) (ty + x )
118
- up1Ctx g = Map. map (\ x -> case x of
119
- Left ty -> Left ty
120
- Right v -> absurd v) $ Map. mapKeys Right g
115
+ eqs1 = Set. map (unitCtx *** uppEQ) path_eqs'
116
+ eqs2 = Set. map (unitCtx *** uppEQ) obs_eqs'
117
+ eqs3 = Set. map (up1Ctx *** uppEQ) (ceqs tscol)
118
+
119
+ unitCtx en = Map. singleton (Left () ) (Right en)
120
+
121
+ up1Ctx
122
+ :: (Ord var )
123
+ => Ctx var (ty + Void )
124
+ -> Ctx (() + var ) (ty + x )
125
+ up1Ctx ctx = second absurd <$> Map. mapKeys Right ctx
121
126
122
127
typesideToSchema :: Typeside var ty sym -> Schema var ty sym Void Void Void
123
128
typesideToSchema ts'' = Schema ts'' Set. empty Map. empty Map. empty Set. empty Set. empty $ \ x _ -> absurd x
@@ -306,7 +311,7 @@ evalSchemaRaw ops ty t a' = do
306
311
(a :: [Schema var ty sym En Fk Att ]) <- doImports a'
307
312
r <- evalSchemaRaw' ty t a
308
313
o <- toOptions ops $ schraw_options t
309
- p <- createProver (schToCol r) o
314
+ p <- createProver (toCollage r) o
310
315
pure $ SchemaEx $ Schema ty (ens r) (fks r) (atts r) (path_eqs r) (obs_eqs r) (mkProver p)
311
316
where
312
317
mkProver p en (EQ (l,r)) = prove p (Map. fromList [(Left () ,Right en)]) (EQ (upp l, upp r))
0 commit comments