on master help sign in
Add Keyboard.Raw, Data.Char, and Data.Maybe libraries.
980c50bevancz
core-js/Data.jsnew file+47
@@ -0,0 +1,47 @@
1+
2+var Data = function() {
3+
4+var Char = function() {
5+ return {fromCode : function(c) { return String.fromCharCode(c); },
6+ toCode : function(c) { return c.charCodeAt(0); },
7+ toUpper : function(c) { return c.toUpperCase(); },
8+ toLower : function(c) { return c.toLowerCase(); },
9+ toLocaleUpper : function(c) { return c.toLocaleUpperCase(); },
10+ toLocaleLower : function(c) { return c.toLocaleLowerCase(); }
11+ };
12+}();
13+
14+var Maybe = function() {
15+ function consMaybe(x) { return function(xs) {
16+ if (x[0] === "Just") return ["Cons", x[1], xs];
17+ return xs;
18+ };
19+ }
20+ function fromMaybe(b) { return function(m) {
21+ if (m[0] === "Just") return m[1];
22+ return b;
23+ };
24+ }
25+ function mapCons(f) { return function(y) { return function(xs) {
26+ var x = f(x);
27+ if (x[0] === "Just") return ["Cons", x[1], xs];
28+ return xs;
29+ };
30+ };
31+ };
32+
33+ return {catMaybes : List.foldr(consMaybe)(["Nil"]),
34+ isJust : function(m) { return m[0] === "Just"; },
35+ isNothing : function(m) { return m[0] === "Nothing"; },
36+ fromMaybe : fromMaybe,
37+ consMaybe : consMaybe,
38+ mapMaybe : function(f) { return List.foldr(mapCons(f))(["Nil"]); }
39+ };
40+}();
41+
42+return {String: { toText : Value.toText , properEscape : Value.properEscape } ,
43+ Char:Char,
44+ Maybe:Maybe,
45+ List:List
46+ };
47+}();
core-js/Element.js+5−5
@@ -74,7 +74,7 @@ var Element = function() {
74
74
75 var text = makeText(0)('left');
75 var text = makeText(0)('left');
76 var plainText = function(str) {
76 var plainText = function(str) {
77− return makeText(0)("left")(String.toText(str)); };
77+ return makeText(0)("left")(Data.String.toText(str)); };
78 var justifiedText = makeText(0)('justify');
78 var justifiedText = makeText(0)('justify');
79 var centeredText = makeText(0)('center');
79 var centeredText = makeText(0)('center');
80 var asText = function(v) { return makeText(0)("left")(Value.show(v)); };
80 var asText = function(v) { return makeText(0)("left")(Value.show(v)); };
@@ -91,7 +91,7 @@ var Element = function() {
91 }
91 }
92 Dispatcher.adjust()
92 Dispatcher.adjust()
93 };
93 };
94− img.src = String.toText(src);
94+ img.src = Data.String.toText(src);
95 img.name = img.src;
95 img.name = img.src;
96 return img;
96 return img;
97 };
97 };
@@ -120,14 +120,14 @@ var Element = function() {
120 0,0, canvas.width, canvas.height);
120 0,0, canvas.width, canvas.height);
121 }
121 }
122 };
122 };
123− img.src = String.toText(src);
123+ img.src = Data.String.toText(src);
124 return canvas;
124 return canvas;
125 };
125 };
126 };
126 };
127 };
127 };
128
128
129 var video = function(src) {
129 var video = function(src) {
130− src = String.toText(src);
130+ src = Data.String.toText(src);
131 var e = newElement('video');
131 var e = newElement('video');
132 e.controls = "controls";
132 e.controls = "controls";
133 var source = newElement('source');
133 var source = newElement('source');
@@ -138,7 +138,7 @@ var Element = function() {
138 return e;
138 return e;
139 };
139 };
140 var audio = function(src) {
140 var audio = function(src) {
141− src = String.toString(src);
141+ src = Data.String.toString(src);
142 var e = newElement('video');
142 var e = newElement('video');
143 e.controls = "controls";
143 e.controls = "controls";
144 var source = newElement('source');
144 var source = newElement('source');
core-js/Everything.js+7−6
@@ -83,12 +83,13 @@ var includeGlobal = this;
83 height = Element.height;
83 height = Element.height;
84 show = Value.show;
84 show = Value.show;
85
85
86− includeAs ('Time') (Signal.Time);
86+ includeAs ('Time') (Signal.Time);
87− includeAs ('Mouse') (Signal.Mouse);
87+ includeAs ('Mouse') (Signal.Mouse);
88+ includeAs ('Keyboard') (Signal.Keyboard);
88− includeAs ('Window') (Signal.Window);
89+ includeAs ('Window') (Signal.Window);
89− includeAs ('HTTP') (Signal.HTTP);
90+ includeAs ('HTTP') (Signal.HTTP);
90− includeAs ('Input') (Signal.Input);
91+ includeAs ('Input') (Signal.Input);
91− includeAs ('Random') (Signal.Random);
92+ includeAs ('Random') (Signal.Random);
92
93
93 include (Color);
94 include (Color);
94 include (Shape);
95 include (Shape);
core-js/String.jsdeleted−23
@@ -1,23 +0,0 @@
1−var String = function() {
2− var properEscape = function(str) {
3− str.replace('"', """);
4− str.replace("&", "&");
5− str.replace("'", "'");
6− str.replace("<", "&#60;");
7− str.replace(">", "&#62;");
8− return str;
9− };
10−
11− var toText = function(elmList) {
12− if (typeof elmList === "string") return elmList;
13− var a = [];
14− while (elmList[0] === "Cons") {
15− a.push(elmList[1]);
16− elmList = elmList[2];
17− }
18− return String.properEscape(a.join(''));
19− };
20−
21− return {toText : toText,
22− properEscape : properEscape };
23−}();
core-js/Text.js+1−1
@@ -7,7 +7,7 @@ var Text = function() {
7 a.push(elmList[1]);
7 a.push(elmList[1]);
8 elmList = elmList[2];
8 elmList = elmList[2];
9 }
9 }
10− return String.properEscape(a.join(''));
10+ return Data.String.properEscape(a.join(''));
11 };
11 };
12
12
13 var addTag = function(tag) { return function(text) {
13 var addTag = function(tag) { return function(text) {
core-js/Value.js+26−2
@@ -10,6 +10,25 @@ var Value = function(){
10 return arr;
10 return arr;
11 };
11 };
12
12
13+ var properEscape = function(str) {
14+ str.replace('"', "&#34;");
15+ str.replace("&", "&#38;");
16+ str.replace("'", "&#39;");
17+ str.replace("<", "&#60;");
18+ str.replace(">", "&#62;");
19+ return str;
20+ };
21+
22+ var toText = function(elmList) {
23+ if (typeof elmList === "string") return elmList;
24+ var a = [];
25+ while (elmList[0] === "Cons") {
26+ a.push(elmList[1]);
27+ elmList = elmList[2];
28+ }
29+ return properEscape(a.join(''));
30+ };
31+
13 var toString = function(v) {
32 var toString = function(v) {
14 if (typeof v === "boolean") {
33 if (typeof v === "boolean") {
15 return v ? "True" : "False";
34 return v ? "True" : "False";
@@ -51,7 +70,7 @@ var Value = function(){
51 return v+"";
70 return v+"";
52 };
71 };
53 var show = function(v) {
72 var show = function(v) {
54− return Text.monospace(String.properEscape(toString(v)));
73+ return Text.monospace(properEscape(toString(v)));
55 };
74 };
56 var append = function(xs,ys) {
75 var append = function(xs,ys) {
57 if (typeof xs === "string" && typeof ys === "string") {
76 if (typeof xs === "string" && typeof ys === "string") {
@@ -71,5 +90,10 @@ var Value = function(){
71 curr[2] = ys;
90 curr[2] = ys;
72 return root;
91 return root;
73 };
92 };
93+
74− return {show:show, Tuple:Tuple, append:append};
94+ return {show:show,
95+ Tuple:Tuple,
96+ append:append,
97+ toText : toText,
98+ properEscape : properEscape};
75}();
99}();
core-js/cat-js.sh+1−1
@@ -1 +1 @@
1−cat Guid.js Value.js String.js collage/Color.js Element.js Text.js collage/Shape.js collage/Line.js runtime/Dispatcher.js runtime/Signal.js List.js Everything.js > ../elm-mini.js ; ls
1+cat Guid.js Value.js List.js Data.js collage/Color.js Element.js Text.js collage/Shape.js collage/Line.js runtime/Dispatcher.js runtime/Signal.js Everything.js > ../elm-mini.js ; ls
core-js/runtime/Signal.js+44−4
@@ -105,6 +105,41 @@ var Signal = function() {
105 height: Elm.Lift(function(p){return p[2];},[dimensions]) };
105 height: Elm.Lift(function(p){return p[2];},[dimensions]) };
106 }();
106 }();
107
107
108+ var Keyboard = { Raw : function() {
109+ var keysDown = Elm.Input(["Nil"]);
110+ var charPressed = Elm.Input(["Nothing"]);
111+ function remove(x,xs) {
112+ if (xs[0] === "Nil") return xs;
113+ if (xs[1] === x) return xs[2];
114+ return ["Cons", xs[1], remove(x,xs[2])];
115+ }
116+ function has(x,xs) {
117+ while (xs[0] !== "Nil") {
118+ if (xs[1] === x) return true;
119+ xs = xs[2];
120+ }
121+ return false;
122+ }
123+ addListener(document, 'keydown', function(e) {
124+ if (has(e.keyCode, keysDown.value)) return;
125+ Dispatcher.notify(keysDown.id, ["Cons", e.keyCode, keysDown.value]);
126+ });
127+ addListener(document, 'keyup', function(e) {
128+ var codes = remove(e.keyCode, keysDown.value)
129+ Dispatcher.notify(keysDown.id, codes);
130+ });
131+ addListener(window, 'blur', function(e) {
132+ Dispatcher.notify(keysDown.id, ["Nil"]);
133+ });
134+ addListener(document, 'keypress', function(e) {
135+ Dispatcher.notify(charPressed.id, ["Just",e.charCode || e.keyCode]);
136+ Dispatcher.notify(charPressed.id, ["Nothing"]);
137+ });
138+ return {keysDown:keysDown,
139+ charPressed:charPressed};
140+ }()
141+ };
142+
108 var HTTP = function() {
143 var HTTP = function() {
109 var fetch = function(how) { return function(url) {
144 var fetch = function(how) { return function(url) {
110 var thread = Elm.Input(["Waiting"]);
145 var thread = Elm.Input(["Waiting"]);
@@ -119,7 +154,7 @@ var Signal = function() {
119 : ["Failure", request.status, toElmString(request.statusText)]);
154 : ["Failure", request.status, toElmString(request.statusText)]);
120 }
155 }
121 };
156 };
122− request.open(how, String.toText(url), true);
157+ request.open(how, Data.String.toText(url), true);
123 request.send(null);
158 request.send(null);
124 return thread;
159 return thread;
125 };
160 };
@@ -147,7 +182,7 @@ var Signal = function() {
147 : ["Failure", request.status, toElmString(request.statusText)]]);
182 : ["Failure", request.status, toElmString(request.statusText)]]);
148 }
183 }
149 };
184 };
150− request.open(how, String.toText(strOpt[1]), true);
185+ request.open(how, Data.String.toText(strOpt[1]), true);
151 request.send(null);
186 request.send(null);
152 return [];
187 return [];
153 }
188 }
@@ -249,6 +284,11 @@ var Signal = function() {
249 button:button};
284 button:button};
250 }();
285 }();
251
286
252− return {Mouse:Mouse, Time:Time, Window:Window,
287+ return {Mouse:Mouse,
288+ Keyboard:Keyboard,
289+ Time:Time,
290+ Window:Window,
291+ HTTP:HTTP,
253− HTTP:HTTP, Random:Random, Input:Input };
292+ Random:Random,
293+ Input:Input };
254}();
294}();