1Elm.Native.Keyboard = {};
2Elm.Native.Keyboard.make = function(elm) {
4 elm.Native = elm.Native || {};
5 elm.Native.Keyboard = elm.Native.Keyboard || {};
6 if (elm.Native.Keyboard.values) return elm.Native.Keyboard.values;
8 // Duplicated from Native.Signal
9 function send(node, timestep, changed) {
11 for (var i = kids.length; i--; ) {
12 kids[i].recv(timestep, changed, node.id);
16 var Signal = Elm.Signal.make(elm);
17 var NList = Elm.Native.List.make(elm);
18 var Utils = Elm.Native.Utils.make(elm);
20 var downEvents = Signal.constant(0);
21 var upEvents = Signal.constant(0);
22 var blurEvents = Signal.constant(0);
24 elm.addListener([downEvents.id], document, 'keydown', function down(e) {
25 elm.notify(downEvents.id, e.keyCode);
28 elm.addListener([upEvents.id], document, 'keyup', function up(e) {
29 elm.notify(upEvents.id, e.keyCode);
32 elm.addListener([blurEvents.id], document, 'blur', function blur(e) {
33 elm.notify(blurEvents.id, NList.Nil);
36 function KeyMerge(down, up, blur) {
37 var args = [down,up,blur];
38 this.id = Utils.guid();
39 // Ignore starting values here
40 this.value = NList.Nil
45 var isChanged = false;
47 this.recv = function(timestep, changed, parentID) {
50 // We know this a change must only be one of the following cases
51 if (parentID === down.id && !(NList.member(down.value)(this.value))) {
53 this.value = NList.Cons(down.value, this.value);
55 if (parentID === up.id) {
57 var notEq = function(kc) { return kc !== up.value };
58 this.value = NList.filter(notEq)(this.value);
60 if (parentID === blur.id) {
62 this.value = NList.Nil;
66 send(this, timestep, isChanged);
72 for (var i = n; i--; ) { args[i].kids.push(this); }
76 var keysDown = Signal.dropRepeats(new KeyMerge(downEvents,upEvents,blurEvents));
78 function keySignal(f) {
79 var signal = A2(Signal.lift, f, keysDown);
80 // must set the default number of kids to make it possible to filter
81 // these signals if they are not actually used.
82 keysDown.defaultNumberOfKids += 1;
83 signal.defaultNumberOfKids = 1;
84 var filtered = Signal.dropRepeats(signal)
85 filtered.defaultNumberOfKids = 0;
89 function dir(up, down, left, right) {
92 while (ks.ctor === "::") {
94 case left : --x; break;
95 case right: ++x; break;
97 case down : --y; break;
101 return { _:{}, x:x, y:y };
106 function is(key) { return keySignal(NList.member(key)); }
108 var lastPressed = downEvents;
110 return elm.Native.Keyboard.values = {
114 lastPressed:lastPressed
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list