on fb4e298 help sign in
74 lines 2.2 kB history raw
1Elm.Native.Time = {};
2Elm.Native.Time.make = function(elm) {
4 elm.Native = elm.Native || {};
5 elm.Native.Time = elm.Native.Time || {};
6 if (elm.Native.Time.values) return elm.Native.Time.values;
8 var Signal = Elm.Signal.make(elm);
9 var NS = Elm.Native.Signal.make(elm);
10 var Maybe = Elm.Maybe.make(elm);
11 var Utils = Elm.Native.Utils.make(elm);
13 function fpsWhen(desiredFPS, isOn) {
14 var msPerFrame = 1000 / desiredFPS;
15 var prev = Date.now(), curr = prev, diff = 0, wasOn = true;
16 var ticker = NS.input(diff);
17 function tick(zero) { return function(offset) {
18 /**
19 * The offset is used for the debugger module. To pause and
20 * unpause time in a continuous way (not jumping ahead by seconds)
21 * or minutes, we introduce a way to offset real time by the amount
22 * of time spend paused.
23 */
24 curr = Date.now() - (offset|0);
25 diff = zero ? 0 : curr - prev;
26 prev = curr;
27 elm.notify(ticker.id, diff);
28 };
29 }
30 var timeoutID = 0;
31 function f(isOn, t) {
32 if (isOn) {
33 timeoutID = elm.runDelayed(tick(!wasOn && isOn), msPerFrame);
34 } else if (wasOn) {
35 clearTimeout(timeoutID);
36 }
37 wasOn = isOn;
38 return t;
39 }
40 return A3( Signal.lift2, F2(f), isOn, ticker );
41 }
43 function every(t) {
44 var clock = NS.input(Date.now());
45 function tellTime(offset) {
46 // Leave the offset. It's for debugging. See above.
47 elm.notify(clock.id, Date.now() - (offset|0));
48 elm.runDelayed(tellTime, t);
49 }
50 elm.runDelayed(tellTime, t);
51 return clock;
52 }
54 function since(t, s) {
55 function cmp(a,b) { return !Utils.eq(a,b); }
56 var dcount = Signal.count(A2(NS.delay, t, s));
57 return A3( Signal.lift2, F2(cmp), Signal.count(s), dcount );
58 }
59 function read(s) {
60 var t = Date.parse(s);
61 return isNaN(t) ? Maybe.Nothing : Maybe.Just(t);
62 }
63 return elm.Native.Time.values = {
64 fpsWhen : F2(fpsWhen),
65 fps : function(t) { return fpsWhen(t, Signal.constant(true)); },
66 every : every,
67 delay : NS.delay,
68 timestamp : NS.timestamp,
69 since : F2(since),
70 toDate : function(t) { return new window.Date(t); },
71 read : read
72 };
74};