on 294fdfd help sign in
100 lines 2.5 kB history raw
2Elm.Native.Touch = function(elm) {
3 'use strict';
5 elm.Native = elm.Native || {};
6 if (elm.Native.Touch) return elm.Native.Touch;
8 var Signal = Elm.Signal(elm);
9 var JS = Elm.JavaScript(elm);
11 function Dict() {
12 this.keys = [];
13 this.values = [];
15 this.insert = function(key,value) {
16 this.keys.push(key);
17 this.values.push(value);
18 };
19 this.lookup = function(key) {
20 var i = this.keys.indexOf(key)
21 return i >= 0 ? this.values[i] : {x:0,y:0,t:0};
22 };
23 this.remove = function(key) {
24 var i = this.keys.indexOf(key);
25 if (i < 0) return;
26 var t = this.values[i];
27 this.keys.splice(i,1);
28 this.values.splice(i,1);
29 return t;
30 };
31 }
33 var root = Signal.constant([]),
34 tapTime = 500,
35 hasTap = false,
36 tap = {_:{},x:0,y:0},
37 dict = new Dict();
39 function touch(t) {
40 var r = dict.lookup(t.identifier);
41 return {_ : {},
42 id: t.identifier,
43 x : t.pageX,
44 y : t.pageY,
45 x0: r.x,
46 y0: r.y,
47 t0: r.t
48 };
49 }
51 function start(e) {
52 dict.insert(e.identifier,{x:e.pageX,y:e.pageY,t:Date.now()});
53 }
54 function end(e) {
55 var t = dict.remove(e.identifier);
56 if (Date.now() - t.t < tapTime) {
57 hasTap = true;
58 tap = {_:{}, x:t.x, y:t.y};
59 }
60 }
62 function listen(name, f) {
63 function update(e) {
64 for (var i = e.changedTouches.length; i--; ) { f(e.changedTouches[i]); }
65 var ts = new Array(e.touches.length);
66 for (var i = e.touches.length; i--; ) { ts[i] = touch(e.touches[i]); }
67 var hasListener = elm.notify(root.id, ts);
68 if (!hasListener) return elm.node.removeEventListener(name, update);
69 e.preventDefault();
70 }
71 elm.node.addEventListener(name, update);
72 }
74 listen("touchstart", start);
75 listen("touchmove", function(_){});
76 listen("touchend", end);
77 listen("touchcancel", end);
78 listen("touchleave", end);
80 function dependency(f) {
81 var sig = A2( Signal.lift, f, root );
82 root.defaultNumberOfKids += 1;
83 sig.defaultNumberOfKids = 0;
84 return sig;
85 }
87 var touches = dependency(JS.fromList);
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 = A3( Signal.keepIf, pred, {_:{},x:0,y:0}, sig);
94 sig2.defaultNumberOfKids = 0;
95 return sig2;
96 }();
98 return elm.Native.Touch = { touches: touches, taps: taps };
100};