on c19ccfe help sign in
elk/libraries/Native/Signal/Keyboard.js
61 lines 1.8 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 lastKey = Signal.constant('\0');
13 elm.addListener([keysDown.id], document, 'keydown', function down(e) {
14 if (NList.member(e.keyCode)(keysDown.value)) return;
15 elm.notify(keysDown.id, NList.Cons(e.keyCode, keysDown.value));
16 });
17 elm.addListener([keysDown.id], document, 'keyup', function up(e) {
18 function notEq(kc) { return kc !== e.keyCode; }
19 elm.notify(keysDown.id, NList.filter(notEq)(keysDown.value));
20 });
21 elm.addListener([keysDown.id], document, 'blur', function blur(e) {
22 elm.notify(keysDown.id, NList.Nil);
23 });
24 elm.addListener([lastKey.id], document, 'keypress', function press(e) {
25 elm.notify(lastKey.id, e.charCode || e.keyCode);
26 });
28 function keySignal(f) {
29 var signal = Signal.dropRepeats(A2(Signal.lift, f, keysDown));
30 keysDown.defaultNumberOfKids += 1;
31 signal.defaultNumberOfKids = 0;
32 return signal;
33 }
35 function dir(up, down, left, right) {
36 function f(ks) {
37 var x = 0, y = 0;
38 while (ks.ctor === "::") {
39 switch (ks._0) {
40 case left : --x; break;
41 case right: ++x; break;
42 case up : ++y; break;
43 case down : --y; break;
44 }
45 ks = ks._1;
46 }
47 return { _:{}, x:x, y:y };
48 }
49 return keySignal(f);
50 }
52 function is(key) { return keySignal(NList.member(key)); }
54 return elm.Native.Keyboard = {
55 isDown:is,
56 directions:F4(dir),
57 keysDown:keysDown,
58 lastPressed:lastKey
59 };
61};