on master help sign in
Add date lib and clean up some existing modules.
c710179evancz
core/Date.elm+30−1
@@ -1,8 +1,37 @@
1
1
2module Date where
2module Date where
3
3
4−data Weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun
4+data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun
5
5
6data Month = Jan | Feb | Mar | Apr
6data Month = Jan | Feb | Mar | Apr
7 | May | Jun | Jul | Aug
7 | May | Jun | Jul | Aug
8 | Sep | Oct | Nov | Dec
8 | Sep | Oct | Nov | Dec
9+
10+
11+read : String -> Date
12+read = Native.Date.read
13+
14+toTime : Date -> Time
15+toTime = Native.Date.toTime
16+
17+
18+year : Date -> Int
19+year = Native.Date.year
20+
21+month : Date -> Month
22+month = Native.Date.month
23+
24+day : Date -> Int
25+day = Native.Date.day
26+
27+dayOfWeek : Date -> Day
28+dayOfWeek = Native.Date.dayOfWeek
29+
30+hour : Date -> Int
31+hour = Native.Date.hour
32+
33+minute : Date -> Int
34+minute = Native.Date.minute
35+
36+second : Date -> Int
37+second = Native.Date.second
core/Native/Color.js+7−7
@@ -1,4 +1,5 @@
1+
1−function nativeColor(elm) {
2+function nativeColor() {
2"use strict";
3"use strict";
3
4
4function extract(c) {
5function extract(c) {
@@ -54,12 +55,11 @@ function toRGB(hsv) {
54 else if (between(5,6,hue)) { r = c; g = 0; b = x; }
55 else if (between(5,6,hue)) { r = c; g = 0; b = x; }
55
56
56 var m = hsv.value - c;
57 var m = hsv.value - c;
57− return [ "Color", norm(r+m), norm(g+m), norm(b+m), 1 ];
58+ return { ctor:"Color", _0:norm(r+m), _1:norm(g+m), _2:norm(b+m), _3:1 };
58}
59}
59
60
60−elm.Native.Color = {
61+Elm.Native.Color = {hsva:hsva,
61− hsva:hsva,
62− hsv:hsv,
62+ hsv:hsv,
63− complement:complement,
63+ complement:complement,
64− extract:extract};
64+ extract:extract};
65}
65}
core/Native/Date.jsnew file+28
@@ -0,0 +1,28 @@
1+
2+function nativeDate(Maybe, JS) {
3+'use strict';
4+
5+ function dateNow() { return new window.Date; }
6+ function readDate(str) {
7+ var d = new window.Date(JS.castStringToJSString(str));
8+ if (isNaN(d.getTime())) return Maybe.Nothing;
9+ return Maybe.Just(d);
10+ }
11+
12+ var dayTable = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
13+ var monthTable = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
14+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
15+
16+ Elm.Native.Date = {
17+ read : readDate,
18+ year : function(d) { return d.getFullYear(); },
19+ month : function(d) { return { ctor:monthTable[d.getMonth()] }; },
20+ day : function(d) { return d.getDate(); },
21+ hour : function(d) { return d.getHours(); },
22+ minute : function(d) { return d.getMinutes(); },
23+ second : function(d) { return d.getSeconds(); },
24+ toTime : function(d) { return d.getTime(); }
25+ dayOfWeek : function(d) { return { ctor:dayTable[d.getDay()] }; },
26+ };
27+
28+}
core/Native/HTTP.js+11−10
@@ -1,8 +1,6 @@
1
1
2−function nativeHTTP(elm) {
2+function nativeHTTP() {
3 "use strict";
3 "use strict";
4− var toElmString = Elm.JavaScript.castJSStringToString;
5− var toJSString = Elm.JavaScript.castStringToJSString;
6
4
7 function registerReq(queue,responses) { return function(req) {
5 function registerReq(queue,responses) { return function(req) {
8 if (req.url !== "") { sendReq(queue,responses,req); }
6 if (req.url !== "") { sendReq(queue,responses,req); }
@@ -20,10 +18,12 @@ function nativeHTTP(elm) {
20 }
18 }
21
19
22 function setHeader(pair) {
20 function setHeader(pair) {
23− request.setRequestHeader(toJSString(pair._0), toJSString(pair._1));
21+ request.setRequestHeader(Elm.JavaScript.castStringToJSString(pair._0),
22+ Elm.JavaScript.castStringToJSString(pair._1));
24 }
23 }
25
24
26 function sendReq(queue,responses,req) {
25 function sendReq(queue,responses,req) {
26+ var JS = Elm.JavaScript;
27 var response = { value: Elm.HTTP.Waiting };
27 var response = { value: Elm.HTTP.Waiting };
28 queue.push(response);
28 queue.push(response);
29
29
@@ -33,15 +33,16 @@ function nativeHTTP(elm) {
33 request.onreadystatechange = function(e) {
33 request.onreadystatechange = function(e) {
34 if (request.readyState === 4) {
34 if (request.readyState === 4) {
35 response.value = (request.status === 200
35 response.value = (request.status === 200
36− ? Success(toElmString(request.responseText))
36+ ? Elm.HTTP.Success(JS.castJSStringToString(request.responseText))
37− : Failure(request.status)(toElmString(request.statusText)));
37+ : Elm.HTTP.Failure(request.status)(JS.castJSStringToString(request.statusText)));
38 setTimeout(function() { updateQueue(queue,responses); }, 0);
38 setTimeout(function() { updateQueue(queue,responses); }, 0);
39 }
39 }
40 };
40 };
41− request.open(toJSString(req.verb), toJSString(req.url), true);
41+ request.open(JS.castStringToJSString(req.verb),
42+ JS.castStringToJSString(req.url),
43+ true);
42 Elm.List.map(setHeader)(req.headers);
44 Elm.List.map(setHeader)(req.headers);
43− request.send(toJSString(req.body));
45+ request.send(JS.castStringToJSString(req.body));
44− return null;
45 }
46 }
46
47
47 function send(requests) {
48 function send(requests) {
@@ -51,5 +52,5 @@ function nativeHTTP(elm) {
51 return Elm.Signal.lift2(f)(responses)(sender);
52 return Elm.Signal.lift2(f)(responses)(sender);
52 }
53 }
53
54
54− elm.Native.HTTP = {send:send};
55+ Elm.Native.HTTP = {send:send};
55}
56}
core/Native/Keyboard.js+3−63
@@ -1,55 +1,4 @@
1−
2−Elm.Keyboard = { Raw : function() {
3− var keysDown = Elm.Signal.constant(["Nil"]);
4− var charPressed = Elm.Signal.constant(["Nothing"]);
5−
6− function remove(x,xs) {
7− if (xs[0] === "Nil") return xs;
8− if (xs[1] === x) return xs[2];
9− return ["Cons", xs[1], remove(x,xs[2])];
10− }
11− function has(x,xs) {
12− while (xs[0] !== "Nil") {
13− if (xs[1] === x) return true;
14− xs = xs[2];
15− }
16− return false;
17− }
18− Value.addListener(document, 'keydown', function(e) {
19− if (has(e.keyCode, keysDown.value)) return;
20− var hasListener = Dispatcher.notify(keysDown.id, ["Cons", e.keyCode, keysDown.value]);
21− if (!hasListener)
22− this.removeEventListener('keydown',arguments.callee,false);
23− });
24− Value.addListener(document, 'keyup', function(e) {
25− var codes = remove(e.keyCode, keysDown.value);
26− var hasListener = Dispatcher.notify(keysDown.id, codes);
27− if (!hasListener)
28− this.removeEventListener('keyup',arguments.callee,false);
29− });
30− Value.addListener(window, 'blur', function(e) {
31− var hasListener = Dispatcher.notify(keysDown.id, ["Nil"]);
32− if (!hasListener)
33− this.removeEventListener('blur',arguments.callee,false);
34− });
35− Value.addListener(document, 'keypress', function(e) {
36− var hasListener = Dispatcher.notify(charPressed.id, ["Just",e.charCode || e.keyCode]);
37− Dispatcher.notify(charPressed.id, ["Nothing"]);
38− if (!hasListener)
39− this.removeEventListener('keypress',arguments.callee,false);
40− });
41− return {keysDown:keysDown,
42− charPressed:charPressed};
43− }()
44−};
45−
46−/*! Keyboard
47−These are nicely curated inputs from the keyboard. See the
48−[Keyboard.Raw library](/docs/Signal/KeyboardRaw.elm) for a
49−lower-level interface that will let you define more complicated behavior.
50−!*/
51−
52−function nativeKeyboard(elm) {
1+function nativeKeyboard() {
53 'use strict';
2 'use strict';
54
3
55 function keySignal(f) {
4 function keySignal(f) {
@@ -78,17 +27,8 @@ function nativeKeyboard(elm) {
78 }}}
27 }}}
79 }
28 }
80
29
81− function is(key) {
82− function f(ks) {
83− while (ks.ctor == "Cons") {
84− if (key == ks._0) return true;
85− ks = ks._1;
86− }
87− return false;
88− }
89− return keySignal(f);
30+ function is(key) { return keySignal(Elm.List.member(key)); }
90− }
91
31
92− elm.Native.Keyboard = { isDown:is, dir:dir };
32+ Elm.Native.Keyboard = { isDown:is, dir:dir };
93
33
94}
34}
core/Native/Keyboard/Raw.js+2−2
@@ -1,4 +1,4 @@
1−function nativeKeyboardRaw(elm) {
1+function nativeKeyboardRaw() {
2 var keysDown = Elm.Signal.constant(Elm.Native.List.Nil);
2 var keysDown = Elm.Signal.constant(Elm.Native.List.Nil);
3 var charPressed = Elm.Signal.constant(Elm.Maybe.Nothing);
3 var charPressed = Elm.Signal.constant(Elm.Maybe.Nothing);
4
4
@@ -29,5 +29,5 @@ function nativeKeyboardRaw(elm) {
29 this.removeEventListener('keypress',arguments.callee,false);
29 this.removeEventListener('keypress',arguments.callee,false);
30 });
30 });
31
31
32− elm.Native.Keyboard.Raw = {keysDown:keysDown, charPressed:charPressed};
32+ Elm.Native.Keyboard.Raw = {keysDown:keysDown, charPressed:charPressed};
33}
33}
core/Native/List.js+7−4
@@ -1,6 +1,9 @@
1−function nativeList(elm) {
1+function nativeList() {
2 "use strict";
2 "use strict";
3
3
4+ var Nil = { ctor:'Nil' };
5+ function Cons(hd,tl) { return { ctor:"Cons", _0:hd, _1:tl }; }
6+
4 function throwError(f) {
7 function throwError(f) {
5 throw new Error("Function '" + f + "' expects a non-empty list!");
8 throw new Error("Function '" + f + "' expects a non-empty list!");
6 }
9 }
@@ -15,9 +18,9 @@ function nativeList(elm) {
15 }
18 }
16
19
17 function fromArray(arr) {
20 function fromArray(arr) {
18− var out = ["Nil"];
21+ var out = Nil;
19 for (var i = arr.length; i--; ) {
22 for (var i = arr.length; i--; ) {
20− out = ["Cons", arr[i], out];
23+ out = Cons(arr[i], out);
21 }
24 }
22 return out;
25 return out;
23 }
26 }
@@ -188,7 +191,7 @@ function nativeList(elm) {
188
191
189 function concatA(
192 function concatA(
190
193
191− elm.Native.List = {
194+ Elm.Native.List = {
192 head:head,
195 head:head,
193 tail:tail,
196 tail:tail,
194 last:last,
197 last:last,