on bbbd6ee help sign in
elk/libraries/Native/Signal/Keyboard.js
75 lines 2.2 kB history raw
2Elm.Native.Keyboard = function(elm) {
3 'use strict';
4 elm.Native = elm.Native || {};
5 if (elm.Native.Keyboard) return elm.Native.Keyboard;
7 var Signal = Elm.Signal(elm);
8 var NList = Elm.Native.List(elm);
9 var Maybe = Elm.Maybe(elm);
11 var keysDown = Signal.constant(NList.Nil);
12 var charPressed = Signal.constant(Maybe.Nothing);
14 function down(e) {
15 if (NList.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) elm.node.removeEventListener('keydown', down);
19 }
20 function up(e) {
21 function notEq(kc) { return kc !== e.keyCode; }
22 var codes = NList.filter(notEq)(keysDown.value);
23 var hasListener = elm.notify(keysDown.id, codes);
24 if (!hasListener) elm.node.removeEventListener('keyup', up);
25 }
26 function blur(e) {
27 var hasListener = elm.notify(keysDown.id, NList.Nil);
28 if (!hasListener) elm.node.removeEventListener('blur', blur);
29 }
30 function press(e) {
31 var next = Maybe.Just(e.charCode || e.keyCode);
32 var hasListener = elm.notify(charPressed.id, next);
33 elm.notify(charPressed.id, Maybe.Nothing);
34 if (!hasListener) elm.node.removeEventListener('keypress', press);
35 }
37 elm.node.addEventListener('keydown' , down );
38 elm.node.addEventListener('keyup' , up );
39 elm.node.addEventListener('blur' , blur );
40 elm.node.addEventListener('keypress', press);
42 function keySignal(f) {
43 var signal = A2( Signal.lift, f, elm.Keyboard.Raw.keysDown );
44 keysDown.defaultNumberOfKids += 1;
45 signal.defaultNumberOfKids = 0;
46 return signal;
47 }
49 function dir(up, down, left, right) {
50 function f(ks) {
51 var x = 0, y = 0;
52 while (ks.ctor == "Cons") {
53 switch (ks._0) {
54 case left : --x; break;
55 case right: ++x; break;
56 case up : ++y; break;
57 case down : --y; break;
58 }
59 ks = ks._1;
60 }
61 return { _:{}, x:x, y:y };
62 }
63 return keySignal(f);
64 }
66 function is(key) { return keySignal(NList.member(key)); }
68 return elm.Native.Keyboard = {
69 isDown:is,
70 directions:F4(dir),
71 keysDown:keysDown,
72 charPressed:charPressed
73 };
75};