on 62d30f2 help sign in
elk/core/Native/Keyboard.js
94 lines 2.6 kB history raw
2Elm.Keyboard = { Raw : function() {
3 var keysDown = Elm.Signal.constant(["Nil"]);
4 var charPressed = Elm.Signal.constant(["Nothing"]);
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};
46/*! Keyboard
47These are nicely curated inputs from the keyboard. See the
48[Keyboard.Raw library](/docs/Signal/KeyboardRaw.elm) for a
49lower-level interface that will let you define more complicated behavior.
50!*/
52function nativeKeyboard(elm) {
53 'use strict';
55 function keySignal(f) {
56 var signal = Elm.Signal.lift(f)(Elm.Keyboard.Raw.keysDown);
57 Elm.Keyboard.Raw.keysDown.defaultNumberOfKids += 1;
58 signal.defaultNumberOfKids = 0;
59 return signal;
60 }
62 function dir(up) { return function(down) {
63 return function(left) { return function(right) {
64 function f(ks) {
65 var x = 0, y = 0;
66 while (ks.ctor == "Cons") {
67 switch (ks._0) {
68 case left : --x; break;
69 case right: ++x; break;
70 case up : ++y; break;
71 case down : --y; break;
72 }
73 ks = ks._1;
74 }
75 return { _:{}, x:x, y:y };
76 }
77 return keySignal(f);
78 }}}
79 }
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);
90 }
92 elm.Native.Keyboard = { isDown:is, dir:dir };