Skip to content

Commit 067b382

Browse files
committed
WIP Atomable List instance and built-in List type
-problem identified- instead of returning ambiguous AnyAtomType, it should be a type variable so that types can be resolved
1 parent aeda582 commit 067b382

File tree

8 files changed

+72
-7
lines changed

8 files changed

+72
-7
lines changed

posts/2015-12-07-tu-quoque.html

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8">
5+
<meta http-equiv="x-ua-compatible" content="ie=edge">
6+
<meta name="viewport" content="width=device-width, initial-scale=1">
7+
<title>Project:M36 Blog - Tu Quoque</title>
8+
<link rel="stylesheet" href="../css/brooklyn.css" />
9+
</head>
10+
<body>
11+
<div id="header">
12+
<div id="logo">
13+
<a href="../">Project:M36 Blog</a>
14+
</div>
15+
<div id="navigation">
16+
<a href="../">Home</a>
17+
<a href="../about.html">About</a>
18+
<a href="../contact.html">Contact</a>
19+
<a href="../archive.html">Archive</a>
20+
</div>
21+
</div>
22+
23+
<div id="content">
24+
<div class="info">
25+
Posted on December 7, 2015
26+
27+
by Julius
28+
29+
</div>
30+
31+
<p>Vestibulum leo turpis, dignissim quis ultrices sit amet, iaculis ac ligula. Pellentesque tristique, velit eget scelerisque scelerisque, est dolor ultrices arcu, quis ullamcorper justo arcu luctus mauris. Integer congue molestie nisi id posuere. Fusce pellentesque gravida tempus. Integer viverra tortor nec eros mollis quis convallis sem laoreet. Nulla id libero ac erat varius laoreet. Proin sed est est. Curabitur lacinia fermentum lorem, elementum malesuada ipsum malesuada ut. Donec suscipit elit id leo vehicula mattis non sed leo. Morbi varius eleifend varius. Nulla vestibulum, neque vitae aliquam eleifend, nisi tellus placerat nunc, quis suscipit elit turpis eu tortor. Etiam euismod convallis lectus quis venenatis. Phasellus laoreet magna in nibh cursus eu egestas nulla convallis. Aliquam vel ullamcorper risus. Fusce dictum, massa id consequat viverra, nulla ante tristique est, a faucibus nisi enim nec dui. Donec metus ligula, condimentum at porttitor eget, lobortis at quam.</p>
32+
<p>Aenean vel libero in magna ultricies congue in a odio. Donec faucibus rutrum ornare. Fusce dictum eleifend fermentum. Vestibulum vel nibh a metus porttitor rhoncus. Pellentesque id quam neque, eget molestie arcu. Integer in elit vel neque viverra ultricies in eget massa. Nam ut convallis est. Pellentesque eros eros, sodales non vehicula et, tincidunt ut odio. Cras suscipit ultrices metus sit amet molestie. Fusce enim leo, vehicula sed sodales quis, adipiscing at ipsum.</p>
33+
<p>Nunc tempor dignissim enim, sed tincidunt eros bibendum quis. Curabitur et dolor augue, id laoreet mi. Nulla cursus felis id dui vehicula vitae ornare lorem blandit. Cras eget dui nec odio volutpat pharetra. Fusce hendrerit justo justo, vel imperdiet enim. Vivamus elit risus, interdum ultrices accumsan eleifend, vestibulum vitae sapien. Integer bibendum ullamcorper tristique. Nulla quis odio lectus, quis eleifend augue. Integer a ligula mauris. Aenean et tempus tortor. Quisque at tortor mi. Vivamus accumsan feugiat est a blandit. Sed vitae enim ut dolor semper sodales. Duis tristique, ante et placerat elementum, nulla tellus pellentesque sapien, quis posuere velit mi eget nulla. Sed vestibulum nunc non est porttitor ut rutrum nibh semper. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.</p>
34+
<p>Nulla adipiscing ultricies lobortis. Vivamus iaculis nisl vitae tellus laoreet vitae aliquet lacus mollis. Phasellus ut lacus urna, sed sagittis ante. Etiam consectetur pretium nisl sed dignissim. Pellentesque convallis, nisl eget commodo mollis, sem magna consequat arcu, sed pretium ipsum arcu sit amet neque. Aliquam erat volutpat. Morbi sed mi sed urna vestibulum placerat vitae vel metus. Fusce ac ante at justo pharetra vehicula. Vivamus vel tortor eget augue aliquet aliquet at vel odio. Nunc venenatis, magna quis facilisis fringilla, augue tellus varius neque, in vulputate est eros ut tortor. Duis lorem neque, aliquam congue posuere id, condimentum non dui. Phasellus ut dui massa, porttitor suscipit augue. Praesent quis tellus quam, vel volutpat metus. Vivamus enim est, aliquam in imperdiet et, sagittis eu ligula. Vestibulum hendrerit placerat orci et aliquet. Cras pharetra, dolor placerat lobortis tempor, metus odio cursus ligula, et posuere lacus ligula quis dui.</p>
35+
<p>Donec a lectus eu nibh malesuada aliquam. Proin at metus quam, et tincidunt leo. Quisque lacus justo, scelerisque sodales pulvinar sed, dignissim ut sapien. Vivamus diam felis, adipiscing sollicitudin ultricies id, accumsan ac felis. In eu posuere ligula. Suspendisse potenti. Donec porttitor dictum dui id vehicula. Integer ante velit, congue id dictum et, adipiscing a tortor.</p>
36+
37+
</div>
38+
39+
<div id="footer">
40+
Site proudly generated by
41+
<a href="http://jaspervdj.be/hakyll">Hakyll</a>
42+
</div>
43+
</body>
44+
</html>

project-m36.cabal

+1
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ Library
110110
ProjectM36.DataTypes.Day,
111111
ProjectM36.DataTypes.Either,
112112
ProjectM36.DataTypes.Maybe,
113+
ProjectM36.DataTypes.List,
113114
ProjectM36.DataTypes.Primitive,
114115
ProjectM36.MiscUtils,
115116
ProjectM36.Notifications,
+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
--convenience functions useful from with AtomFunctions
2+
module ProjectM36.AtomFunctionUtils where
3+
import ProjectM36.Base
4+

src/lib/ProjectM36/AtomFunctions/Basic.hs

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import ProjectM36.DataTypes.Either
66
import ProjectM36.DataTypes.Maybe
77
import ProjectM36.AtomFunctions.Primitive
88
import ProjectM36.AtomFunction
9+
import ProjectM36.DataTypes.List
910
import qualified Data.HashSet as HS
1011

1112
basicAtomFunctions :: AtomFunctions
1213
basicAtomFunctions = HS.unions [primitiveAtomFunctions,
1314
dayAtomFunctions,
1415
eitherAtomFunctions,
15-
maybeAtomFunctions]
16+
maybeAtomFunctions,
17+
listAtomFunctions]
1618

1719
--these special atom functions aren't scripted so they can't be serialized normally. Instead, the body remains in the binary and the serialization/deserialization happens by name only.
1820
precompiledAtomFunctions :: AtomFunctions

src/lib/ProjectM36/Atomable.hs

+13
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module ProjectM36.Atomable where
55
import ProjectM36.Base
66
import ProjectM36.Relation
77
import ProjectM36.DataTypes.Primitive
8+
import ProjectM36.DataTypes.List
89
import GHC.Generics
910
import qualified Data.Map as M
1011
import qualified Data.Text as T
@@ -107,6 +108,18 @@ instance Atomable Relation where
107108
--warning: cannot be used with undefined "Relation"
108109
toAtomType rel = RelationAtomType (attributes rel)
109110
toDatabaseContextExpr _ = NoOperation
111+
112+
--convert to ADT list
113+
instance Atomable a => Atomable [a] where
114+
toAtom [] = ConstructedAtom "Empty" (listAtomType (toAtomType (undefined :: a))) []
115+
toAtom (x:xs) = ConstructedAtom "Cons" (listAtomType (toAtomType x)) (map toAtom xs)
116+
117+
fromAtom (ConstructedAtom "Empty" _ _) = []
118+
fromAtom (ConstructedAtom "Cons" _ (x:xs)) = fromAtom x:map fromAtom xs
119+
fromAtom _ = error "improper fromAtom [a]"
120+
121+
toAtomType _ = ConstructedAtomType "List" (M.singleton "a" (toAtomType (undefined :: a)))
122+
toDatabaseContextExpr _ = NoOperation
110123

111124
-- Generics
112125
class AtomableG g where

src/lib/ProjectM36/DataTypes/Basic.hs

+2
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,13 @@ import ProjectM36.DataTypes.Primitive
44
import ProjectM36.DataTypes.Day
55
import ProjectM36.DataTypes.Either
66
import ProjectM36.DataTypes.Maybe
7+
import ProjectM36.DataTypes.List
78
import ProjectM36.Base
89

910
basicTypeConstructorMapping :: TypeConstructorMapping
1011
basicTypeConstructorMapping = (primitiveTypeConstructorMapping ++
1112
maybeTypeConstructorMapping ++
1213
eitherTypeConstructorMapping ++
14+
listTypeConstructorMapping ++
1315
dayTypeConstructorMapping)
1416

src/lib/ProjectM36/Relation.hs

+1-1
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,7 @@ relMap mapper (Relation attrs tupleSet) = do
246246
remappedTuple <- mapper tupleIn
247247
if tupleAttributes remappedTuple == tupleAttributes tupleIn
248248
then Right remappedTuple
249-
else Left $ TupleAttributeTypeMismatchError (A.attributesDifference (tupleAttributes tupleIn) attrs)
249+
else Left (TupleAttributeTypeMismatchError (A.attributesDifference (tupleAttributes tupleIn) attrs))
250250

251251
relMogrify :: (RelationTuple -> Either RelationalError RelationTuple) -> Attributes -> Relation -> Either RelationalError Relation
252252
relMogrify mapper newAttributes (Relation _ tupSet) = do

src/lib/ProjectM36/Tuple.hs

+4-5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import ProjectM36.Base
33
import ProjectM36.Error
44
import ProjectM36.Attribute
55
import ProjectM36.Atom
6+
import ProjectM36.AtomType
67
import ProjectM36.DataTypes.Primitive
78

89
import qualified Data.Map as M
@@ -191,11 +192,9 @@ verifyTuple attrs tuple = let attrsTypes = V.map atomType attrs
191192
tupleTypes = V.map atomTypeForAtom (tupleAtoms tuple) in
192193
if V.length attrs /= V.length tupleTypes then
193194
Left $ TupleAttributeCountMismatchError 0
194-
else if attrsTypes /= tupleTypes then
195-
--Left $ traceShow (show attrsTypes ++ " " ++ show tupleTypes ++ " " ++ show tuple) $ TupleAttributeTypeMismatchError (attributesDifference attrs (tupleAttributes tuple))
196-
Left $ TupleAttributeTypeMismatchError (attributesDifference attrs (tupleAttributes tuple))
197-
else
198-
Right $ tuple
195+
else do
196+
mapM_ (uncurry atomTypeVerify) (V.zip attrsTypes tupleTypes)
197+
Right tuple
199198

200199
--two tuples can be equal but the vectors of attributes could be out-of-order
201200
--reorder if necessary- this is useful during relMogrify so that all the relation's tuples have identical atom/attribute ordering

0 commit comments

Comments
 (0)