on master help sign in
Add Keyboard.Raw, Data.Char, and Data.Maybe libraries.
commit980c50bb4b3bed7a78d71034e82e01a162fc9c47 authorevancz <info@elm-lang.org> dateMon 11 Jun 2012, 06:14 (14 years ago) parent9069fca
8 files changed+131−42
core-js/Data.js+47 core-js/Element.js+5−5 core-js/Everything.js+7−6 core-js/String.js−23 core-js/Text.js+1−1 core-js/Value.js+26−2 core-js/cat-js.sh+1−1 core-js/runtime/Signal.js+44−4
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() {
7474
7575 var text = makeText(0)('left');
7676 var plainText = function(str) {
77− return makeText(0)("left")(String.toText(str)); };
77+ return makeText(0)("left")(Data.String.toText(str)); };
7878 var justifiedText = makeText(0)('justify');
7979 var centeredText = makeText(0)('center');
8080 var asText = function(v) { return makeText(0)("left")(Value.show(v)); };
@@ -91,7 +91,7 @@ var Element = function() {
9191 }
9292 Dispatcher.adjust()
9393 };
94− img.src = String.toText(src);
94+ img.src = Data.String.toText(src);
9595 img.name = img.src;
9696 return img;
9797 };
@@ -120,14 +120,14 @@ var Element = function() {
120120 0,0, canvas.width, canvas.height);
121121 }
122122 };
123− img.src = String.toText(src);
123+ img.src = Data.String.toText(src);
124124 return canvas;
125125 };
126126 };
127127 };
128128
129129 var video = function(src) {
130− src = String.toText(src);
130+ src = Data.String.toText(src);
131131 var e = newElement('video');
132132 e.controls = "controls";
133133 var source = newElement('source');
@@ -138,7 +138,7 @@ var Element = function() {
138138 return e;
139139 };
140140 var audio = function(src) {
141− src = String.toString(src);
141+ src = Data.String.toString(src);
142142 var e = newElement('video');
143143 e.controls = "controls";
144144 var source = newElement('source');
core-js/Everything.js+7−6
@@ -83,12 +83,13 @@ var includeGlobal = this;
8383 height = Element.height;
8484 show = Value.show;
8585
86− includeAs ('Time') (Signal.Time);
87− includeAs ('Mouse') (Signal.Mouse);
88− includeAs ('Window') (Signal.Window);
89− includeAs ('HTTP') (Signal.HTTP);
90− includeAs ('Input') (Signal.Input);
91− includeAs ('Random') (Signal.Random);
86+ includeAs ('Time') (Signal.Time);
87+ includeAs ('Mouse') (Signal.Mouse);
88+ includeAs ('Keyboard') (Signal.Keyboard);
89+ includeAs ('Window') (Signal.Window);
90+ includeAs ('HTTP') (Signal.HTTP);
91+ includeAs ('Input') (Signal.Input);
92+ includeAs ('Random') (Signal.Random);
9293
9394 include (Color);
9495 include (Shape);
core-js/String.jsdeleted−23
@@ -1,23 +0,0 @@
1−var String = function() {
2− var properEscape = function(str) {
3− str.replace('"', "&#34;");
4− str.replace("&", "&#38;");
5− str.replace("'", "&#39;");
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() {
77 a.push(elmList[1]);
88 elmList = elmList[2];
99 }
10− return String.properEscape(a.join(''));
10+ return Data.String.properEscape(a.join(''));
1111 };
1212
1313 var addTag = function(tag) { return function(text) {
core-js/Value.js+26−2
@@ -10,6 +10,25 @@ var Value = function(){
1010 return arr;
1111 };
1212
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+
1332 var toString = function(v) {
1433 if (typeof v === "boolean") {
1534 return v ? "True" : "False";
@@ -51,7 +70,7 @@ var Value = function(){
5170 return v+"";
5271 };
5372 var show = function(v) {
54− return Text.monospace(String.properEscape(toString(v)));
73+ return Text.monospace(properEscape(toString(v)));
5574 };
5675 var append = function(xs,ys) {
5776 if (typeof xs === "string" && typeof ys === "string") {
@@ -71,5 +90,10 @@ var Value = function(){
7190 curr[2] = ys;
7291 return root;
7392 };
74− return {show:show, Tuple:Tuple, append:append};
93+
94+ return {show:show,
95+ Tuple:Tuple,
96+ append:append,
97+ toText : toText,
98+ properEscape : properEscape};
7599}();
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() {
105105 height: Elm.Lift(function(p){return p[2];},[dimensions]) };
106106 }();
107107
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+
108143 var HTTP = function() {
109144 var fetch = function(how) { return function(url) {
110145 var thread = Elm.Input(["Waiting"]);
@@ -119,7 +154,7 @@ var Signal = function() {
119154 : ["Failure", request.status, toElmString(request.statusText)]);
120155 }
121156 };
122− request.open(how, String.toText(url), true);
157+ request.open(how, Data.String.toText(url), true);
123158 request.send(null);
124159 return thread;
125160 };
@@ -147,7 +182,7 @@ var Signal = function() {
147182 : ["Failure", request.status, toElmString(request.statusText)]]);
148183 }
149184 };
150− request.open(how, String.toText(strOpt[1]), true);
185+ request.open(how, Data.String.toText(strOpt[1]), true);
151186 request.send(null);
152187 return [];
153188 }
@@ -249,6 +284,11 @@ var Signal = function() {
249284 button:button};
250285 }();
251286
252− return {Mouse:Mouse, Time:Time, Window:Window,
253− HTTP:HTTP, Random:Random, Input:Input };
287+ return {Mouse:Mouse,
288+ Keyboard:Keyboard,
289+ Time:Time,
290+ Window:Window,
291+ HTTP:HTTP,
292+ Random:Random,
293+ Input:Input };
254294}();