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