on master help sign in
cosmetic: change indentation to 4 spaces
eb35afbEvan Czaplicki
libraries/Native/Signal/Keyboard.js+105−105
@@ -1,117 +1,117 @@
1Elm.Native.Keyboard = {};
1Elm.Native.Keyboard = {};
2Elm.Native.Keyboard.make = function(elm) {
2Elm.Native.Keyboard.make = function(elm) {
3
3
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;
7−
7+
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);
13− }
14− }
15−
16− var Signal = Elm.Signal.make(elm);
17− var NList = Elm.Native.List.make(elm);
18− var Utils = Elm.Native.Utils.make(elm);
19−
20− var downEvents = Signal.constant(0);
21− var upEvents = Signal.constant(0);
22− var blurEvents = Signal.constant(0);
23−
24− elm.addListener([downEvents.id], document, 'keydown', function down(e) {
25− elm.notify(downEvents.id, e.keyCode);
26− });
27−
28− elm.addListener([upEvents.id], document, 'keyup', function up(e) {
29− elm.notify(upEvents.id, e.keyCode);
30− });
31−
32− elm.addListener([blurEvents.id], document, 'blur', function blur(e) {
33− elm.notify(blurEvents.id, NList.Nil);
34− });
35−
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
41− this.kids = [];
42−
43− var n = args.length;
44− var count = 0;
45− var isChanged = false;
46−
47− this.recv = function(timestep, changed, parentID) {
48− ++count;
49− if (changed) {
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))) {
52− isChanged = true;
53− this.value = NList.Cons(down.value, this.value);
54− }
55− if (parentID === up.id) {
56− isChanged = true;
57− var notEq = function(kc) { return kc !== up.value };
58− this.value = NList.filter(notEq)(this.value);
59− }
60− if (parentID === blur.id) {
61− isChanged = true;
62− this.value = NList.Nil;
63 }
13 }
64− }
65− if (count == n) {
66− send(this, timestep, isChanged);
67− isChanged = false;
68− count = 0;
69− }
70− };
14+ }
71
15
16+ var Signal = Elm.Signal.make(elm);
17+ var NList = Elm.Native.List.make(elm);
18+ var Utils = Elm.Native.Utils.make(elm);
19+
20+ var downEvents = Signal.constant(0);
21+ var upEvents = Signal.constant(0);
22+ var blurEvents = Signal.constant(0);
23+
24+ elm.addListener([downEvents.id], document, 'keydown', function down(e) {
25+ elm.notify(downEvents.id, e.keyCode);
26+ });
27+
28+ elm.addListener([upEvents.id], document, 'keyup', function up(e) {
29+ elm.notify(upEvents.id, e.keyCode);
30+ });
31+
32+ elm.addListener([blurEvents.id], document, 'blur', function blur(e) {
33+ elm.notify(blurEvents.id, NList.Nil);
34+ });
35+
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
41+ this.kids = [];
42+
43+ var n = args.length;
44+ var count = 0;
45+ var isChanged = false;
46+
47+ this.recv = function(timestep, changed, parentID) {
48+ ++count;
49+ if (changed) {
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))) {
52+ isChanged = true;
53+ this.value = NList.Cons(down.value, this.value);
54+ }
55+ if (parentID === up.id) {
56+ isChanged = true;
57+ var notEq = function(kc) { return kc !== up.value };
58+ this.value = NList.filter(notEq)(this.value);
59+ }
60+ if (parentID === blur.id) {
61+ isChanged = true;
62+ this.value = NList.Nil;
63+ }
64+ }
65+ if (count == n) {
66+ send(this, timestep, isChanged);
67+ isChanged = false;
68+ count = 0;
69+ }
70+ };
71+
72− for (var i = n; i--; ) { args[i].kids.push(this); }
72+ for (var i = n; i--; ) { args[i].kids.push(this); }
73−
73+
74− }
74+ }
75−
75+
76− var keysDown = Signal.dropRepeats(new KeyMerge(downEvents,upEvents,blurEvents));
76+ var keysDown = Signal.dropRepeats(new KeyMerge(downEvents,upEvents,blurEvents));
77−
77+
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;
87− }
87+ }
88−
88+
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;
98+ }
99+ ks = ks._1;
100+ }
101+ return { _:{}, x:x, y:y };
98 }
102 }
99− ks = ks._1;
100− }
101− return { _:{}, x:x, y:y };
103+ return keySignal(f);
102 }
104 }
103− return keySignal(f);
104− }
105
105
106− function is(key) { return keySignal(NList.member(key)); }
106+ function is(key) { return keySignal(NList.member(key)); }
107
107
108− var lastPressed = downEvents;
108+ var lastPressed = downEvents;
109
109
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
115− };
115+ };
116
116
117};
117};