on 577fc17 help sign in
65 lines 1.8 kB history raw
1Elm.Native.Time = {};
2Elm.Native.Time.make = function(elm) {
4 elm.Native = elm.Native || {};
5 elm.Native.Time = elm.Native.Time || {};
6 if (elm.Native.Time.values) return elm.Native.Time.values;
8 var Signal = Elm.Signal.make(elm);
9 var NS = Elm.Native.Signal.make(elm);
10 var Maybe = Elm.Maybe.make(elm);
11 var Utils = Elm.Native.Utils.make(elm);
13 function fpsWhen(desiredFPS, isOn) {
14 var msPerFrame = 1000 / desiredFPS;
15 var prev = Date.now(), curr = prev, diff = 0, wasOn = true;
16 var ticker = Signal.constant(diff);
17 function tick(zero) { return function() {
18 curr = Date.now();
19 diff = zero ? 0 : curr - prev;
20 prev = curr;
21 elm.notify(ticker.id, diff);
22 };
23 }
24 var timeoutID = 0;
25 function f(isOn, t) {
26 if (isOn) {
27 timeoutID = setTimeout(tick(!wasOn && isOn), msPerFrame);
28 } else if (wasOn) {
29 clearTimeout(timeoutID);
30 }
31 wasOn = isOn;
32 return t;
33 }
34 return A3( Signal.lift2, F2(f), isOn, ticker );
35 }
37 function every(t) {
38 var clock = Signal.constant(Date.now());
39 setInterval(function() {
40 elm.notify(clock.id, Date.now());
41 }, t);
42 return clock;
43 }
45 function since(t, s) {
46 function cmp(a,b) { return !Utils.eq(a,b); }
47 var dcount = Signal.count(A2(NS.delay, t, s));
48 return A3( Signal.lift2, F2(cmp), Signal.count(s), dcount );
49 }
50 function read(s) {
51 var t = Date.parse(s);
52 return isNaN(t) ? Maybe.Nothing : Maybe.Just(t);
53 }
54 return elm.Native.Time.values = {
55 fpsWhen : F2(fpsWhen),
56 fps : function(t) { return fpsWhen(t, Signal.constant(true)); },
57 every : every,
58 delay : NS.delay,
59 timestamp : NS.timestamp,
60 since : F2(since),
61 toDate : function(t) { return new window.Date(t); },
62 read : read
63 };
65};