on master help sign in
more javascript refactoring

sub relation display working

commitda3182de4f419dde2c86af25544656fb76ffc336 authorAgentM <agentm@themactionfaction.com> dateFri 29 Jul 2016, 09:23 (10 years ago) parent54d8db8
5 files changed+223−175
ProjectM36/Atom.hs+9 ProjectM36/DataTypes/Day.hs+4 ProjectM36/Server/RemoteCallTypes/Json.hs+42−15 ProjectM36/Server/project-m36.js+167 ProjectM36/Server/websocket-test.html+1−160
ProjectM36/Atom.hs+9
@@ -43,6 +43,15 @@ textAtom t = Atom t
4343intAtom :: Int -> Atom
4444intAtom i = Atom i
4545
46+doubleAtom :: Double -> Atom
47+doubleAtom d = Atom d
48+
49+byteStringAtom :: ByteString -> Atom
50+byteStringAtom b = Atom b
51+
52+boolAtom :: Bool -> Atom
53+boolAtom b = Atom b
54+
4655--not safe to use without upfront type-checking
4756castRelation :: Atom -> Relation
4857castRelation (ConstructedAtom _ _ _) = error "castRelation attempt on ConstructedAtom"
ProjectM36/DataTypes/Day.hs+4
@@ -7,6 +7,10 @@ import qualified Data.HashSet as HS
77import Data.Time.Calendar
88import qualified Data.Map as M
99
10+
11+dayAtom :: Day -> Atom
12+dayAtom d = Atom d
13+
1014dayAtomType :: AtomType
1115dayAtomType = ConstructedAtomType "Day" M.empty
1216
ProjectM36/Server/RemoteCallTypes/Json.hs+42−15
@@ -1,5 +1,4 @@
11--create a bunch of orphan instances for use with the websocket server
2−{-# LANGUAGE OverloadedStrings #-}
32{-# OPTIONS_GHC -fno-warn-orphans #-}
43module ProjectM36.Server.RemoteCallTypes.Json where
54import ProjectM36.Server.RemoteCallTypes
@@ -14,6 +13,9 @@ import Data.Typeable
1413import Data.Text
1514import Data.Time.Calendar
1615import ProjectM36.Atom
16+import ProjectM36.DataTypes.Primitive
17+import ProjectM36.AtomFunctions.Primitive
18+import ProjectM36.DataTypes.Day
1719import Data.ByteString
1820
1921instance ToJSON RelationalExpr
@@ -75,19 +77,41 @@ instance ToJSON ConcreteTypeRep where
7577 ]
7678
7779instance ToJSON Atom where
78− toJSON atom@(Atom val) = let atype = atomTypeForAtom atom
79− val = case atype of
80− intAtomType -> unsafeCast atom
81− _ -> "smiley" :: Text
80+ toJSON atom@(Atom _) = let atype = atomTypeForAtom atom
8281 in
83− object [
84− "type" .= atype
85− "val" .= val]
86−
82+ if atype == intAtomType then
83+ object [
84+ "type" .= atype,
85+ "val" .= ((unsafeCast atom) :: Int)]
86+ else if atype == textAtomType then
87+ object [
88+ "type" .= atype,
89+ "val" .= ((unsafeCast atom) :: Text)]
90+ else if atype == doubleAtomType then
91+ object [
92+ "type" .= atype,
93+ "val" .= ((unsafeCast atom) :: Double)]
94+ else if atype == dayAtomType then
95+ object [
96+ "type" .= atype,
97+ "val" .= ((unsafeCast atom) :: Day)]
98+ else if atype == byteStringAtomType then
99+ object [
100+ "type" .= atype,
101+ "val" .= toText ((unsafeCast atom) :: ByteString)]
102+ else if atype == boolAtomType then
103+ object [
104+ "type" .= atype,
105+ "val" .= ((unsafeCast atom) :: Bool)]
106+ else if isRelationAtomType atype then
107+ object [
108+ "type" .= atype,
109+ "val" .= castRelation atom ]
110+ else error "invalid primitive in ToJSON implementation"
87111
88112 toJSON (ConstructedAtom dConsName atomtype atomlist) = object [
89113 "dataconstructorname" .= dConsName,
90− "atomtype" .= toJSON atomtype,
114+ "type" .= toJSON atomtype,
91115 "atomlist" .= toJSON atomlist
92116 ]
93117
@@ -103,13 +127,16 @@ instance FromJSON Atom where
103127 else if unCTR cTypeRep == typeRep (Proxy :: Proxy Text) then
104128 textAtom <$> o .: "val"
105129 else if unCTR cTypeRep == typeRep (Proxy :: Proxy Double) then
106− textAtom <$> o .: "val"
130+ doubleAtom <$> o .: "val"
107131 else if unCTR cTypeRep == typeRep (Proxy :: Proxy Day) then
108− undefined
109− else if unCTR cTypeRep == typeRep (Proxy :: Proxy ByteString) then
110− undefined
132+ dayAtom <$> o .: "val"
133+ else if unCTR cTypeRep == typeRep (Proxy :: Proxy ByteString) then do
134+ txt <- (o .: "val")
135+ case (fromText txt) :: Either String ByteString of
136+ Left err -> fail $ "bytestring parse failure: " ++ show err
137+ Right bs -> pure $ byteStringAtom bs
111138 else if unCTR cTypeRep == typeRep (Proxy :: Proxy Bool) then
112− undefined
139+ boolAtom <$> o .: "val"
113140 else
114141 error "unsupported typerep serialization"
115142
ProjectM36/Server/project-m36.jsnew file+167
@@ -0,0 +1,167 @@
1+//refactor this into a client library
2+var socket = new WebSocket("ws://localhost:8888");
3+socket.onopen = function(event) {
4+ console.log("connected");
5+ setStatus("connected");
6+}
7+socket.onerror = function(event) {
8+ console.log("error: " + event);
9+}
10+socket.onmessage = function (event) {
11+ console.log("message received: " + event.data);
12+ var msg = JSON.parse(event.data);
13+ handleResponse(msg);
14+}
15+socket.onclose = function(event) {
16+ console.log("conn closed: " + event);
17+ setStatus("disconnected");
18+}
19+
20+function setStatus(text)
21+{
22+ var newtext = document.createTextNode(text);
23+ var statusnode = document.getElementById("status");
24+ while( statusnode.firstChild ) {
25+ statusnode.removeChild( statusnode.firstChild );
26+ }
27+ statusnode.appendChild(newtext);
28+}
29+
30+function execTutorialD()
31+{
32+ var tutd = document.getElementById("tutd").value;
33+ socket.send("executetutd:" + tutd);
34+ return false;
35+}
36+
37+function handleResponse(message)
38+{
39+ var relation = message["displayrelation"];
40+ var acknowledged = message["acknowledged"];
41+ var error = message["displayerror"];
42+ if(relation)
43+ {
44+ var reltable = generateRelation(relation);
45+ var existingtable = document.getElementById("relationresult");
46+ while(existingtable.firstChild)
47+ {
48+ existingtable.removeChild(existingtable.firstChild);
49+ }
50+ reltable.id = "relationresult";
51+ existingtable.parentNode.replaceChild(reltable, existingtable);
52+ }
53+ else
54+ {
55+ }
56+
57+ var message = "";
58+ if(acknowledged)
59+ {
60+ message="acknowledged";
61+ }
62+ if(error)
63+ {
64+ message=error;
65+ }
66+ document.getElementById("resultstatus").innerHTML = message;
67+}
68+
69+function generateRelation(relation)
70+{
71+ var table = document.createElement("table");
72+
73+ var headers = generateRelationHeader(relation[0]);
74+ var body = generateRelationBody(relation[1]);
75+
76+ table.appendChild(headers);
77+ table.appendChild(body);
78+
79+ return table;
80+}
81+
82+function generateRelationHeader(header)
83+{
84+ var thead = document.createElement("thead");
85+ var headerrow = document.createElement("tr");
86+ for(var hindex=0; hindex < header.length; hindex++)
87+ {
88+ var th = document.createElement("th");
89+ var attrtype = generateAtomType(header[hindex]);
90+ th.appendChild(attrtype);
91+ headerrow.appendChild(th);
92+ }
93+ thead.appendChild(headerrow);
94+ return thead;
95+}
96+
97+function generateAtomType(attr)
98+{
99+ var atomType = attr[1]["tag"];
100+ var attrName = attr[0];
101+ var element = document.createElement("span");
102+ element.textContent = attrName + "::";
103+ if(atomType == "AtomType")
104+ {
105+ element.textContent += attr[1]["contents"]["serialrep"][0][2];
106+ }
107+ else if (atomType == "RelationAtomType")
108+ {
109+ var table = document.createElement("table");
110+ element.appendChild(table);
111+ var thead = document.createElement("thead");
112+ element.appendChild(thead);
113+ var tr = document.createElement("tr");
114+ thead.appendChild(tr);
115+ var relattrs = attr[1]["contents"];
116+ for(var attrindex = 0; attrindex < relattrs.length; attrindex++)
117+ {
118+ var th = document.createElement("th");
119+ var relattrNode = generateAtomType(relattrs[attrindex]);
120+ th.appendChild(relattrNode);
121+ tr.appendChild(th);
122+ }
123+ }
124+ else
125+ {
126+ element.textContent = "unknown";
127+ }
128+ return element
129+}
130+
131+function generateRelationBody(body)
132+{
133+ var bodyrows = body["asList"]
134+ var tbody = document.createElement("tbody");
135+ for(var rindex=0; rindex < bodyrows.length; rindex++)
136+ {
137+ var tablerow = document.createElement("tr");
138+ var bodyrow = bodyrows[rindex];
139+ for(var atomindex=0; atomindex < bodyrow[1].length; atomindex++)
140+ {
141+ var td = document.createElement("td");
142+ var atomNode = generateAtom(bodyrow[1][atomindex]);
143+ td.appendChild(atomNode);
144+ tablerow.appendChild(td);
145+ }
146+ tbody.appendChild(tablerow);
147+ }
148+ return tbody;
149+}
150+
151+function generateAtom(atom)
152+{
153+ var element = document.createElement("span");
154+ var atomType = atom["type"]["tag"];
155+
156+ if(atomType == "RelationAtomType")
157+ {
158+ var rel = generateRelation(atom["val"]);
159+ element.appendChild(rel);
160+ }
161+ else
162+ {
163+ element.textContent = atom["val"];
164+ }
165+ return element;
166+}
167+
ProjectM36/Server/websocket-test.html+1−160
@@ -1,166 +1,7 @@
11<html>
22<head>
33<title>Project:M36 WebSocket Client</title>
4−<script>
5− var socket = new WebSocket("ws://localhost:8888");
6− socket.onopen = function(event) {
7− console.log("connected");
8− setStatus("connected");
9− }
10− socket.onerror = function(event) {
11− console.log("error: " + event);
12− }
13− socket.onmessage = function (event) {
14− console.log("message received: " + event.data);
15− var msg = JSON.parse(event.data);
16− handleResponse(msg);
17− }
18− socket.onclose = function(event) {
19− console.log("conn closed: " + event);
20− setStatus("disconnected");
21− }
22−
23−function setStatus(text)
24−{
25− var newtext = document.createTextNode(text);
26− var statusnode = document.getElementById("status");
27− while( statusnode.firstChild ) {
28− statusnode.removeChild( statusnode.firstChild );
29− }
30− statusnode.appendChild(newtext);
31−}
32−
33−function execTutorialD()
34−{
35− var tutd = document.getElementById("tutd").value;
36− socket.send("executetutd:" + tutd);
37− return false;
38−}
39−
40−function handleResponse(message)
41−{
42− var relation = message["displayrelation"];
43− var acknowledged = message["acknowledged"];
44− var error = message["displayerror"];
45− if(relation)
46− {
47− showRelation(relation);
48− }
49− else
50− {
51− }
52−
53− var message = "";
54− if(acknowledged)
55− {
56− message="acknowledged";
57− }
58− if(error)
59− {
60− message=error;
61− }
62− document.getElementById("resultstatus").innerHTML = message;
63−}
64−
65−function showRelation(relation)
66−{
67− var relid = document.getElementById("relationresult");
68− var relidheaders = relid.getElementsByTagName("thead")[0];
69− var relidbody = relid.getElementsByTagName("tbody")[0];
70− var headers = generateRelationHeader(relation[0]);
71− var body = generateRelationBody(relation[1]);
72−
73− relid.replaceChild(headers, relidheaders);
74− relid.replaceChild(body, relidbody);
75−}
76−
77−function generateRelationHeader(header)
78−{
79− var thead = document.createElement("thead");
80− var headerrow = document.createElement("tr");
81− for(var hindex=0; hindex < header.length; hindex++)
82− {
83− var th = document.createElement("th");
84− var attrtype = generateAtomType(header[hindex]);
85− th.appendChild(attrtype);
86− headerrow.appendChild(th);
87− }
88− thead.appendChild(headerrow);
89− return thead;
90−}
91−
92−function generateAtomType(attr)
93−{
94− var atomType = attr[1]["tag"];
95− var attrName = attr[0];
96− var element = document.createElement("span");
97− element.textContent = attrName + "::";
98− if(atomType == "AtomType")
99− {
100− element.textContent += attr[1]["contents"]["serialrep"][0][2];
101− }
102− else if (atomType == "RelationAtomType")
103− {
104− var table = document.createElement("table");
105− element.appendChild(table);
106− var thead = document.createElement("thead");
107− element.appendChild(thead);
108− var tr = document.createElement("tr");
109− thead.appendChild(tr);
110− var relattrs = attr[1]["contents"];
111− for(var attrindex = 0; attrindex < relattrs.length; attrindex++)
112− {
113− var th = document.createElement("th");
114− var relattrNode = generateAtomType(relattrs[attrindex]);
115− th.appendChild(relattrNode);
116− tr.appendChild(th);
117− }
118− }
119− else
120− {
121− element.textContent = "unknown";
122− }
123− return element
124−}
125−
126−function generateRelationBody(body)
127−{
128− var bodyrows = body["asList"]
129− var tbody = document.createElement("tbody");
130− for(var rindex=0; rindex < bodyrows.length; rindex++)
131− {
132− var tablerow = document.createElement("tr");
133− var bodyrow = bodyrows[rindex];
134− for(var atomindex=0; atomindex < bodyrow[1].length; atomindex++)
135− {
136− var td = document.createElement("td");
137− var atomNode = generateAtom(bodyrow[atomIndex]);
138− td.appendChild(atomNode);
139− tablerow.appendChild(td);
140− }
141− tbody.appendChild(tablerow);
142− }
143− return tbody;
144−}
145−
146−function generateAtom(atom)
147−{
148− var element = document.createElement("span");
149− var atomType = atom[0]["contents"]["tag"];
150−
151− if(atomType == "RelationAtomType")
152− {
153−
154− }
155− else
156− {
157− element.textContent = atom[
158− }
159− return element;
160−}
161−
162−
163−</script>
4+<script type="text/javascript" src="project-m36.js"></script>
1645<style>
1656#relationresult, th, td
1667{