2013-02-20 22:36:16 +00:00
|
|
|
|
2013-03-09 06:50:46 +00:00
|
|
|
Elm.Native.Time = function(elm) {
|
2013-02-22 23:19:40 +00:00
|
|
|
'use strict';
|
2013-02-20 22:36:16 +00:00
|
|
|
|
2013-03-09 06:50:46 +00:00
|
|
|
var Signal = Elm.Signal(elm);
|
|
|
|
var Maybe = Elm.Maybe(elm);
|
2013-04-10 07:52:53 +00:00
|
|
|
var Utils = Elm.Native.Utils(elm);
|
2013-02-20 22:36:16 +00:00
|
|
|
|
2013-03-02 17:18:36 +00:00
|
|
|
function fpsWhen(desiredFPS, isOn) {
|
|
|
|
var msPerFrame = 1000 / desiredFPS;
|
2013-03-09 06:50:46 +00:00
|
|
|
var prev = Date.now(), curr = prev, diff = 0, wasOn = true;
|
|
|
|
var ticker = Signal.constant(diff);
|
2013-03-02 17:18:36 +00:00
|
|
|
function tick(zero) { return function() {
|
2013-03-09 06:50:46 +00:00
|
|
|
curr = Date.now();
|
2013-05-11 20:42:45 +00:00
|
|
|
diff = zero ? 0 : curr - prev;
|
|
|
|
prev = curr;
|
|
|
|
elm.notify(ticker.id, diff);
|
2013-03-02 17:18:36 +00:00
|
|
|
};
|
|
|
|
}
|
|
|
|
var timeoutID = 0;
|
|
|
|
function f(isOn, t) {
|
|
|
|
if (isOn) {
|
|
|
|
timeoutID = setTimeout(tick(!wasOn && isOn), msPerFrame);
|
|
|
|
} else if (wasOn) {
|
2013-05-11 20:42:45 +00:00
|
|
|
clearTimeout(timeoutID);
|
2013-02-20 22:36:16 +00:00
|
|
|
}
|
2013-03-02 17:18:36 +00:00
|
|
|
wasOn = isOn;
|
|
|
|
return t;
|
|
|
|
}
|
2013-03-09 06:50:46 +00:00
|
|
|
return A3( Signal.lift2, F2(f), isOn, ticker );
|
2013-02-20 22:36:16 +00:00
|
|
|
}
|
2013-05-11 20:42:45 +00:00
|
|
|
|
2013-03-02 17:18:36 +00:00
|
|
|
function everyWhen(t, isOn) {
|
2013-03-09 06:50:46 +00:00
|
|
|
var clock = Signal.constant(Date.now());
|
|
|
|
function tellTime() { elm.notify(clock.id, Date.now()); }
|
2013-03-02 17:18:36 +00:00
|
|
|
setInterval(tellTime, t);
|
|
|
|
return clock;
|
2013-02-20 22:36:16 +00:00
|
|
|
}
|
|
|
|
|
2013-03-02 17:18:36 +00:00
|
|
|
function since(t, s) {
|
2013-05-11 20:42:45 +00:00
|
|
|
function cmp(a,b) { return !Utils.eq(a,b); }
|
2013-04-10 07:52:53 +00:00
|
|
|
var dcount = Signal.count(A2(Signal.delay, t, s));
|
2013-03-09 06:50:46 +00:00
|
|
|
return A3( Signal.lift2, F2(cmp), Signal.count(s), dcount );
|
2013-02-20 22:36:16 +00:00
|
|
|
}
|
|
|
|
function after(t) {
|
|
|
|
t *= 1000;
|
2013-03-09 06:50:46 +00:00
|
|
|
var thread = Signal.constant(false);
|
|
|
|
setTimeout(function() { elm.notify(thread.id, true); }, t);
|
2013-02-20 22:36:16 +00:00
|
|
|
return thread;
|
|
|
|
}
|
|
|
|
function before(t) {
|
|
|
|
t *= 1000;
|
2013-03-09 06:50:46 +00:00
|
|
|
var thread = Signal.constant(true);
|
|
|
|
setTimeout(function() { elm.notify(thread.id, false); }, t);
|
2013-02-20 22:36:16 +00:00
|
|
|
return thread;
|
|
|
|
}
|
|
|
|
function read(s) {
|
2013-03-09 06:50:46 +00:00
|
|
|
var t = Date.parse(s);
|
|
|
|
return isNaN(t) ? Maybe.Nothing : Maybe.Just(t);
|
2013-02-20 22:36:16 +00:00
|
|
|
}
|
2013-03-09 06:50:46 +00:00
|
|
|
return elm.Native.Time = {
|
2013-03-02 17:18:36 +00:00
|
|
|
fpsWhen : F2(fpsWhen),
|
2013-03-09 06:50:46 +00:00
|
|
|
fps : function(t) { return fpsWhen(t, Signal.constant(true)); },
|
|
|
|
every : function(t) { return everyWhen(t, Signal.constant(true)) },
|
|
|
|
delay : Signal.delay,
|
2013-03-02 17:18:36 +00:00
|
|
|
since : F2(since),
|
2013-02-22 23:19:40 +00:00
|
|
|
after : after,
|
|
|
|
before : before,
|
|
|
|
toDate : function(t) { return new window.Date(t); },
|
|
|
|
read : read
|
2013-02-20 22:36:16 +00:00
|
|
|
};
|
|
|
|
|
2013-05-11 20:42:45 +00:00
|
|
|
};
|