on 9c8dfd9 help sign in
72 lines 2.0 kB history raw
2Elm.Native.Time = function(elm) {
3 'use strict';
5 var Signal = Elm.Signal(elm);
6 var Maybe = Elm.Maybe(elm);
8 function fpsWhen(desiredFPS, isOn) {
9 var msPerFrame = 1000 / desiredFPS;
10 var prev = Date.now(), curr = prev, diff = 0, wasOn = true;
11 var ticker = Signal.constant(diff);
12 function tick(zero) { return function() {
13 curr = Date.now();
14 diff = zero ? 0 : curr - prev;
15 prev = curr;
16 elm.notify(ticker.id, diff);
17 };
18 }
19 var timeoutID = 0;
20 function f(isOn, t) {
21 if (isOn) {
22 timeoutID = setTimeout(tick(!wasOn && isOn), msPerFrame);
23 } else if (wasOn) {
24 clearTimeout(timeoutID);
25 }
26 wasOn = isOn;
27 return t;
28 }
29 return A3( Signal.lift2, F2(f), isOn, ticker );
30 }
32 function everyWhen(t, isOn) {
33 var clock = Signal.constant(Date.now());
34 function tellTime() { elm.notify(clock.id, Date.now()); }
35 setInterval(tellTime, t);
36 return clock;
37 }
39 function since(t, s) {
40 function cmp(a,b) { return !Value.eq(a,b) }
41 var dcount = Signal.count(Signal.delay(t)(s));
42 return A3( Signal.lift2, F2(cmp), Signal.count(s), dcount );
43 }
44 function after(t) {
45 t *= 1000;
46 var thread = Signal.constant(false);
47 setTimeout(function() { elm.notify(thread.id, true); }, t);
48 return thread;
49 }
50 function before(t) {
51 t *= 1000;
52 var thread = Signal.constant(true);
53 setTimeout(function() { elm.notify(thread.id, false); }, t);
54 return thread;
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 = {
61 fpsWhen : F2(fpsWhen),
62 fps : function(t) { return fpsWhen(t, Signal.constant(true)); },
63 every : function(t) { return everyWhen(t, Signal.constant(true)) },
64 delay : Signal.delay,
65 since : F2(since),
66 after : after,
67 before : before,
68 toDate : function(t) { return new window.Date(t); },
69 read : read
70 };
72};