Elm.Native.Time = {};
Elm.Native.Time.make = function(elm) {
elm.Native = elm.Native || {};
elm.Native.Time = elm.Native.Time || {};
if (elm.Native.Time.values) return elm.Native.Time.values;
var Signal = Elm.Signal.make(elm);
var NS = Elm.Native.Signal.make(elm);
var Maybe = Elm.Maybe.make(elm);
var Utils = Elm.Native.Utils.make(elm);
function fpsWhen(desiredFPS, isOn) {
var msPerFrame = 1000 / desiredFPS;
var prev = elm.timer.now(), curr = prev, diff = 0, wasOn = true;
var ticker = NS.input(diff);
function tick(zero) {
return function() {
curr = elm.timer.now();
diff = zero ? 0 : curr - prev;
if (prev > curr) {
diff = 0;
}
prev = curr;
elm.notify(ticker.id, diff);
};
}
var timeoutID = 0;
function f(isOn, t) {
if (isOn) {
timeoutID = elm.setTimeout(tick(!wasOn && isOn), msPerFrame);
} else if (wasOn) {
clearTimeout(timeoutID);
}
wasOn = isOn;
return t;
}
return A3( Signal.map2, F2(f), isOn, ticker );
}
function every(t) {
var clock = NS.input(elm.timer.now());
function tellTime() {
elm.notify(clock.id, elm.timer.now());
}
setInterval(tellTime, t);
return clock;
}
function read(s) {
var t = Date.parse(s);
return isNaN(t) ? Maybe.Nothing : Maybe.Just(t);
}
return elm.Native.Time.values = {
fpsWhen : F2(fpsWhen),
fps : function(t) { return fpsWhen(t, Signal.constant(true)); },
every : every,
delay : NS.delay,
timestamp : NS.timestamp,
toDate : function(t) { return new window.Date(t); },
read : read
};
};