@@ -1,59 +1,76 @@
11Elm.Time = function() {
22 function timeNow() { return (new window.Date).getTime(); }
3− var now = function(t) {
3+ function everyWhen(isOn) { return function(t) {
44 var clock = Elm.Signal.constant(timeNow());
55 function tellTime() { Dispatcher.notify(clock.id, timeNow()); }
66 setInterval(tellTime, t);
77 return clock;
8− };
9− function fps(desiredFPS) {
8+ };
9+ }
10+ function fpsWhen(desiredFPS) { return function (isOn) {
1011 var msPerFrame = 1000 / desiredFPS;
11− var ticker = Elm.Signal.constant(timeNow());
12− function tick() { Dispatcher.notify(ticker.id, timeNow()); }
13− function f(t) { setTimeout(tick, msPerFrame); return t; }
14− return Elm.Signal.lift(f)(ticker);
12+ var prev = timeNow(), curr = prev, diff = 0, wasOn = true;
13+ var ticker = Elm.Signal.constant(diff);
14+ function tick(zero) { return function() {
15+ curr = timeNow();
16+ diff = zero ? 0 : curr - prev;
17+ prev = curr;
18+ Dispatcher.notify(ticker.id, diff);
19+ };
20+ }
21+ var timeoutID = 0;
22+ function f(isOn) { return function(t) {
23+ if (isOn) {
24+ timeoutID = setTimeout(tick(!wasOn && isOn), msPerFrame);
25+ } else if (wasOn) {
26+ clearTimeout(timeoutID);
27+ }
28+ wasOn = isOn;
29+ return t;
30+ };
31+ }
32+ return Elm.Signal.lift2(f)(isOn)(ticker);
33+ };
1534 }
16− var every = function(t) {
17− t *= 1000;
18− var clock = Elm.Signal.constant(0);
19− var time = 0;
20− setInterval(function() {
21− time += t;
22− Dispatcher.notify(clock.id, time/1000);
23− }, t);
24− return clock;
25− };
26− var after = function(t) {
35+ function since(t) { return function(s) {
36+ function cmp(a) { return function(b) { return !Value.eq(a,b); }; }
37+ var dcount = Elm.Signal.count(Elm.Signal.delay(t)(s));
38+ return Elm.Signal.lift2(cmp)(Elm.Signal.count(s))(dcount);
39+ };
40+ }
41+ function after(t) {
2742 t *= 1000;
2843 var thread = Elm.Signal.constant(false);
2944 setTimeout(function() { Dispatcher.notify(thread.id, true); }, t);
3045 return thread;
31− };
32− var before = function(t) {
46+ }
47+ function before(t) {
3348 t *= 1000;
3449 var thread = Elm.Signal.constant(true);
3550 setTimeout(function() { Dispatcher.notify(thread.id, false); }, t);
3651 return thread;
37− };
52+ }
3853 function read(s) {
3954 var t = window.Date.parse(s);
4055 return isNaN(t) ? ["Nothing"] : ["Just",t];
4156 }
42− return {now:now,
43− fps:fps,
44− every:every,
45− after:after,
46− before:before,
47− hours : function(n) { return n * 3600000; },
48− minutes : function(n) { return n * 60000; },
49− seconds : function(n) { return n * 1000; },
50− millis : function(n) { return n; },
51− inHours : function(t) { return ~~(t / 3600000); },
52− inMinutes : function(t) { return ~~(t / 60000); },
53− inSeconds : function(t) { return ~~(t / 1000); },
54− inMillis : function(t) { return t; },
57+ return {fpsWhen : fpsWhen,
58+ fps : function(t) { return fpsWhen(t)(Elm.Signal.constant(true)); },
59+ every : everyWhen(Elm.Signal.constant(true)),
60+ delay : Elm.Signal.delay,
61+ since : since,
62+ after : after,
63+ before : before,
64+ hour : 3600000,
65+ minute : 60000,
66+ second : 1000,
67+ ms : 1,
68+ inHours : function(t) { return t / 3600000; },
69+ inMinutes : function(t) { return t / 60000; },
70+ inSeconds : function(t) { return t / 1000; },
71+ inMss : function(t) { return t; },
5572 toDate : function(t) { return new window.Date(t); },
56− read : read
73+ read : read
5774 };
5875
5976}();