on c2eecc2 help sign in
64 lines 1.8 kB history raw
2Elm.Native.Time = function(elm) {
3 'use strict';
5 var Signal = Elm.Signal(elm);
6 var NS = Elm.Native.Signal(elm);
7 var Maybe = Elm.Maybe(elm);
8 var Utils = Elm.Native.Utils(elm);
10 function fpsWhen(desiredFPS, isOn) {
11 var msPerFrame = 1000 / desiredFPS;
12 var prev = Date.now(), curr = prev, diff = 0, wasOn = true;
13 var ticker = Signal.constant(diff);
14 function tick(zero) { return function() {
15 curr = Date.now();
16 diff = zero ? 0 : curr - prev;
17 prev = curr;
18 elm.notify(ticker.id, diff);
19 };
20 }
21 var timeoutID = 0;
22 function f(isOn, 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 return A3( Signal.lift2, F2(f), isOn, ticker );
32 }
34 function everyWhen(t, isOn) {
35 var clock = Signal.constant(Date.now());
36 var id = setInterval(function tellTime() {
37 if (!elm.notify(clock.id, Date.now())) {
38 clearInterval(id);
39 }
40 }, t);
41 return clock;
42 }
44 function since(t, s) {
45 function cmp(a,b) { return !Utils.eq(a,b); }
46 var dcount = Signal.count(A2(NS.delay, t, s));
47 return A3( Signal.lift2, F2(cmp), Signal.count(s), dcount );
48 }
49 function read(s) {
50 var t = Date.parse(s);
51 return isNaN(t) ? Maybe.Nothing : Maybe.Just(t);
52 }
53 return elm.Native.Time = {
54 fpsWhen : F2(fpsWhen),
55 fps : function(t) { return fpsWhen(t, Signal.constant(true)); },
56 every : function(t) { return everyWhen(t, Signal.constant(true)) },
57 delay : NS.delay,
58 timestamp : NS.timestamp,
59 since : F2(since),
60 toDate : function(t) { return new window.Date(t); },
61 read : read
62 };
64};