@@ -1,117 +1,117 @@
1Elm.Native.Keyboard = {};
1Elm.Native.Keyboard = {};
2Elm.Native.Keyboard.make = function(elm) {
2Elm.Native.Keyboard.make = function(elm) {
4− elm.Native = elm.Native || {};
4+ elm.Native = elm.Native || {};
5− elm.Native.Keyboard = elm.Native.Keyboard || {};
5+ elm.Native.Keyboard = elm.Native.Keyboard || {};
6− if (elm.Native.Keyboard.values) return elm.Native.Keyboard.values;
6+ if (elm.Native.Keyboard.values) return elm.Native.Keyboard.values;
8− // Duplicated from Native.Signal
8+ // Duplicated from Native.Signal
9− function send(node, timestep, changed) {
9+ function send(node, timestep, changed) {
10− var kids = node.kids;
10+ var kids = node.kids;
11− for (var i = kids.length; i--; ) {
11+ for (var i = kids.length; i--; ) {
12− kids[i].recv(timestep, changed, node.id);
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);
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); }
72+ for (var i = n; i--; ) { args[i].kids.push(this); }
76− var keysDown = Signal.dropRepeats(new KeyMerge(downEvents,upEvents,blurEvents));
76+ var keysDown = Signal.dropRepeats(new KeyMerge(downEvents,upEvents,blurEvents));
78− function keySignal(f) {
78+ function keySignal(f) {
79− var signal = A2(Signal.lift, f, keysDown);
79+ var signal = A2(Signal.lift, f, keysDown);
80− // must set the default number of kids to make it possible to filter
80+ // must set the default number of kids to make it possible to filter
81− // these signals if they are not actually used.
81+ // these signals if they are not actually used.
82− keysDown.defaultNumberOfKids += 1;
82+ keysDown.defaultNumberOfKids += 1;
83− signal.defaultNumberOfKids = 1;
83+ signal.defaultNumberOfKids = 1;
84− var filtered = Signal.dropRepeats(signal)
84+ var filtered = Signal.dropRepeats(signal)
85− filtered.defaultNumberOfKids = 0;
85+ filtered.defaultNumberOfKids = 0;
86− return filtered;
86+ return filtered;
89− function dir(up, down, left, right) {
89+ function dir(up, down, left, right) {
90− function f(ks) {
90+ function f(ks) {
91− var x = 0, y = 0;
91+ var x = 0, y = 0;
92− while (ks.ctor === "::") {
92+ while (ks.ctor === "::") {
93− switch (ks._0) {
93+ switch (ks._0) {
94− case left : --x; break;
94+ case left : --x; break;
95− case right: ++x; break;
95+ case right: ++x; break;
96− case up : ++y; break;
96+ case up : ++y; break;
97− case down : --y; break;
97+ case down : --y; break;
101+ return { _:{}, x:x, y:y };
101− return { _:{}, x:x, y:y };
103+ return keySignal(f);
103− return keySignal(f);
106− function is(key) { return keySignal(NList.member(key)); }
106+ function is(key) { return keySignal(NList.member(key)); }
108− var lastPressed = downEvents;
108+ var lastPressed = downEvents;
110− return elm.Native.Keyboard.values = {
110+ return elm.Native.Keyboard.values = {
111− isDown:is,
111+ isDown:is,
112− directions:F4(dir),
112+ directions:F4(dir),
113− keysDown:keysDown,
113+ keysDown:keysDown,
114− lastPressed:lastPressed
114+ lastPressed:lastPressed