on d53cecf help sign in
elk/core/Native/Time.js
78 lines 2.1 kB history raw
1/*
2import Signal
3*/
5(function() {
6 'use strict';
8 function timeNow() { return (new window.Date).getTime(); }
10 function fpsWhen(desiredFPS) { return function (isOn) {
11 var msPerFrame = 1000 / desiredFPS;
12 var prev = timeNow(), curr = prev, diff = 0, wasOn = true;
13 var ticker = Elm.Signal.constant(diff);
14 function tick(zero) { return function() {
15 curr = timeNow();
16 diff = zero ? 0 : curr - prev;
17 prev = curr;
18 Dispatcher.notify(ticker.id, diff);
19 };
20 }
21 var timeoutID = 0;
22 function f(isOn) { return function(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 }
32 return Elm.Signal.lift2(f)(isOn)(ticker);
33 };
34 }
36 function everyWhen(isOn) { return function(t) {
37 var clock = Elm.Signal.constant(timeNow());
38 function tellTime() { Dispatcher.notify(clock.id, timeNow()); }
39 setInterval(tellTime, t);
40 return clock;
41 };
42 }
44 function since(t) { return function(s) {
45 function cmp(a) { return function(b) { return !Value.eq(a,b); }; }
46 var dcount = Elm.Signal.count(Elm.Signal.delay(t)(s));
47 return Elm.Signal.lift2(cmp)(Elm.Signal.count(s))(dcount);
48 };
49 }
50 function after(t) {
51 t *= 1000;
52 var thread = Elm.Signal.constant(false);
53 setTimeout(function() { Dispatcher.notify(thread.id, true); }, t);
54 return thread;
55 }
56 function before(t) {
57 t *= 1000;
58 var thread = Elm.Signal.constant(true);
59 setTimeout(function() { Dispatcher.notify(thread.id, false); }, t);
60 return thread;
61 }
62 function read(s) {
63 var t = window.Date.parse(s);
64 return isNaN(t) ? ["Nothing"] : ["Just",t];
65 }
66 Elm.Native.Time = {
67 fpsWhen : fpsWhen,
68 fps : function(t) { return fpsWhen(t)(Elm.Signal.constant(true)); },
69 every : everyWhen(Elm.Signal.constant(true)),
70 delay : Elm.Signal.delay,
71 since : since,
72 after : after,
73 before : before,
74 toDate : function(t) { return new window.Date(t); },
75 read : read
76 };
78}());