on c136ea7 help sign in
elk/core/Native/Touch.js
99 lines 2.4 kB history raw
1/*
2import Signal
3import JavaScript
4*/
6(function() {
7 'use strict';
9 function Dict() {
10 this.keys = [];
11 this.values = [];
13 this.insert = function(key,value) {
14 this.keys.push(key);
15 this.values.push(value);
16 };
17 this.lookup = function(key) {
18 var i = this.keys.indexOf(key)
19 return i >= 0 ? this.values[i] : {x:0,y:0,t:0};
20 };
21 this.remove = function(key) {
22 var i = this.keys.indexOf(key);
23 if (i < 0) return;
24 var t = this.values[i];
25 this.keys.splice(i,1);
26 this.values.splice(i,1);
27 return t;
28 };
29 }
31 var root = Elm.Signal.constant([]),
32 tapTime = 500,
33 hasTap = false,
34 tap = {_:{},x:0,y:0},
35 dict = new Dict();
37 function touch(t) {
38 var r = dict.lookup(t.identifier);
39 return {_ : {},
40 id: t.identifier,
41 x : t.pageX,
42 y : t.pageY,
43 x0: r.x,
44 y0: r.y,
45 t0: r.t
46 };
47 }
49 function start(e) {
50 dict.insert(e.identifier,{x:e.pageX,y:e.pageY,t:Date.now()});
51 }
52 function end(e) {
53 var t = dict.remove(e.identifier);
54 if (Date.now() - t.t < tapTime) {
55 hasTap = true;
56 tap = {_:{}, x:t.x, y:t.y};
57 }
58 }
60 function listen(name, f) {
61 function update(e) {
62 for (var i = e.changedTouches.length; i--; ) { f(e.changedTouches[i]); }
63 var ts = new Array(e.touches.length);
64 for (var i = e.touches.length; i--; ) { ts[i] = touch(e.touches[i]); }
65 var hasListener = Dispatcher.notify(root.id, ts);
66 if (!hasListener) return document.removeEventListener(name, update);
67 e.preventDefault();
68 }
69 Value.addListener(document, name, update);
70 }
72 listen("touchstart", start);
73 listen("touchmove", function(_){});
74 listen("touchend", end);
75 listen("touchcancel", end);
76 listen("touchleave", end);
78 function dependency(f) {
79 var sig = Elm.Signal.lift(f)(root);
80 root.defaultNumberOfKids += 1;
81 sig.defaultNumberOfKids = 0;
82 return sig;
83 }
85 var touches = dependency(function(ts) {
86 return Elm.JavaScript.castJSArrayToList(ts);
87 });
89 var taps = function() {
90 var sig = dependency(function(_) { return tap; });
91 sig.defaultNumberOfKids = 1;
92 function pred(_) { var b = hasTap; hasTap = false; return b; }
93 var sig2 = Elm.Signal.keepIf(pred)({_:{},x:0,y:0})(sig);
94 sig2.defaultNumberOfKids = 0;
95 return sig2;
96 }();
98 Elm.Native.Touch = { touches: touches, taps: taps };
99}());