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