on 68a2ced help sign in
71 lines 2.0 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 = elm.timer.now(), curr = prev, diff = 0, wasOn = true;
16 var ticker = NS.input(diff);
17 function tick(zero) {
18 return function() {
19 curr = elm.timer.now();
20 diff = zero ? 0 : curr - prev;
21 if (prev > curr) {
22 diff = 0;
23 }
24 prev = curr;
25 elm.notify(ticker.id, diff);
26 };
27 }
28 var timeoutID = 0;
29 function f(isOn, t) {
30 if (isOn) {
31 timeoutID = elm.setTimeout(tick(!wasOn && isOn), msPerFrame);
32 } else if (wasOn) {
33 clearTimeout(timeoutID);
34 }
35 wasOn = isOn;
36 return t;
37 }
38 return A3( Signal.lift2, F2(f), isOn, ticker );
39 }
41 function every(t) {
42 var clock = NS.input(elm.timer.now());
43 function tellTime() {
44 elm.notify(clock.id, elm.timer.now());
45 elm.setTimeout(tellTime, t);
46 }
47 elm.setTimeout(tellTime, t);
48 return clock;
49 }
51 function since(t, s) {
52 function cmp(a,b) { return !Utils.eq(a,b); }
53 var dcount = Signal.count(A2(NS.delay, t, s));
54 return A3( Signal.lift2, F2(cmp), Signal.count(s), dcount );
55 }
56 function read(s) {
57 var t = Date.parse(s);
58 return isNaN(t) ? Maybe.Nothing : Maybe.Just(t);
59 }
60 return elm.Native.Time.values = {
61 fpsWhen : F2(fpsWhen),
62 fps : function(t) { return fpsWhen(t, Signal.constant(true)); },
63 every : every,
64 delay : NS.delay,
65 timestamp : NS.timestamp,
66 since : F2(since),
67 toDate : function(t) { return new window.Date(t); },
68 read : read
69 };
71};