@@ -1,40 +1,51 @@
1−/*
2−import Signal
3−import List
4−*/
51
6−(function() {
2+Elm.Native.Keyboard.Raw = function(elm) {
73 'use strict';
84
9− var keysDown = Elm.Signal.constant(Elm.Native.List.Nil);
10− var charPressed = Elm.Signal.constant(Elm.Maybe.Nothing);
5+ var Signal = Elm.Signal(elm);
6+ var NList = Elm.Native.List(elm);
7+ var List = Elm.List(elm);
8+ var Maybe = Elm.Maybe(elm);
9+ var Misc = Elm.Native.Misc(elm);
1110
12− Value.addListener(document, 'keydown', function(e) {
13− if (Elm.List.member(e.keyCode)(keysDown.value)) return;
14− var list = Elm.Native.List.Cons(e.keyCode, keysDown.value);
15− var hasListener = Dispatcher.notify(keysDown.id, list);
16− if (!hasListener)
17− this.removeEventListener('keydown',arguments.callee,false);
18− });
19− Value.addListener(document, 'keyup', function(e) {
20− function notEq(kc) { return kc !== e.keyCode; }
21− var codes = Elm.List.filter(notEq)(keysDown.value);
22− var hasListener = Dispatcher.notify(keysDown.id, codes);
23− if (!hasListener)
24− this.removeEventListener('keyup',arguments.callee,false);
25− });
26− Value.addListener(window, 'blur', function(e) {
27− var hasListener = Dispatcher.notify(keysDown.id, ["Nil"]);
28− if (!hasListener)
29− this.removeEventListener('blur',arguments.callee,false);
30− });
31− Value.addListener(document, 'keypress', function(e) {
32− var next = Elm.Maybe.Just(e.charCode || e.keyCode);
33− var hasListener = Dispatcher.notify(charPressed.id, next);
34− Dispatcher.notify(charPressed.id, Elm.Maybe.Nothing);
35− if (!hasListener)
36− this.removeEventListener('keypress',arguments.callee,false);
37− });
11+ var keysDown = Signal.constant(NList.Nil);
12+ var charPressed = Signal.constant(Maybe.Nothing);
3813
39− Elm.Native.Keyboard.Raw = {keysDown:keysDown, charPressed:charPressed};
40−}());
14+ function down(e) {
15+ if (List.member(e.keyCode)(keysDown.value)) return;
16+ var list = NList.Cons(e.keyCode, keysDown.value);
17+ var hasListener = elm.notify(keysDown.id, list);
18+ if (!hasListener)
19+ this.removeEventListener('keydown',arguments.callee,false);
20+ }
21+ function up(e) {
22+ function notEq(kc) { return kc !== e.keyCode; }
23+ var codes = List.filter(notEq)(keysDown.value);
24+ var hasListener = elm.notify(keysDown.id, codes);
25+ if (!hasListener)
26+ this.removeEventListener('keyup',arguments.callee,false);
27+ }
28+ function blur(e) {
29+ var hasListener = elm.notify(keysDown.id, NList.Nil);
30+ if (!hasListener)
31+ this.removeEventListener('blur',arguments.callee,false);
32+ }
33+ function press(e) {
34+ var next = Maybe.Just(e.charCode || e.keyCode);
35+ var hasListener = elm.notify(charPressed.id, next);
36+ elm.notify(charPressed.id, Maybe.Nothing);
37+ if (!hasListener)
38+ this.removeEventListener('keypress',arguments.callee,false);
39+ }
40+
41+ Misc.addListener(document, 'keydown' , down );
42+ Misc.addListener(document, 'keyup' , up );
43+ Misc.addListener(window , 'blur' , blur );
44+ Misc.addListener(document, 'keypress', press);
45+
46+ return elm.Native.Keyboard.Raw = {
47+ keysDown:keysDown,
48+ charPressed:charPressed
49+ };
50+
51+};