on 104faf1 help sign in
elk/libraries/Native/Signal/Keyboard.js
72 lines 2.1 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);
10 var keysDown = Signal.constant(NList.Nil);
11 var charPressed = Signal.constant('\0');
13 function down(e) {
14 if (NList.member(e.keyCode)(keysDown.value)) return;
15 var list = NList.Cons(e.keyCode, keysDown.value);
16 var hasListener = elm.notify(keysDown.id, list);
17 if (!hasListener) elm.node.removeEventListener('keydown', down);
18 }
19 function up(e) {
20 function notEq(kc) { return kc !== e.keyCode; }
21 var codes = NList.filter(notEq)(keysDown.value);
22 var hasListener = elm.notify(keysDown.id, codes);
23 if (!hasListener) elm.node.removeEventListener('keyup', up);
24 }
25 function blur(e) {
26 var hasListener = elm.notify(keysDown.id, NList.Nil);
27 if (!hasListener) elm.node.removeEventListener('blur', blur);
28 }
29 function press(e) {
30 var hasListener = elm.notify(charPressed.id, e.charCode || e.keyCode);
31 if (!hasListener) elm.node.removeEventListener('keypress', press);
32 }
34 elm.node.addEventListener('keydown' , down );
35 elm.node.addEventListener('keyup' , up );
36 elm.node.addEventListener('blur' , blur );
37 elm.node.addEventListener('keypress', press);
39 function keySignal(f) {
40 var signal = A2( Signal.lift, f, keysDown );
41 keysDown.defaultNumberOfKids += 1;
42 signal.defaultNumberOfKids = 0;
43 return signal;
44 }
46 function dir(up, down, left, right) {
47 function f(ks) {
48 var x = 0, y = 0;
49 while (ks.ctor == "Cons") {
50 switch (ks._0) {
51 case left : --x; break;
52 case right: ++x; break;
53 case up : ++y; break;
54 case down : --y; break;
55 }
56 ks = ks._1;
57 }
58 return { _:{}, x:x, y:y };
59 }
60 return keySignal(f);
61 }
63 function is(key) { return keySignal(NList.member(key)); }
65 return elm.Native.Keyboard = {
66 isDown:is,
67 directions:F4(dir),
68 keysDown:keysDown,
69 lastPressed:charPressed
70 };
72};