on c136ea7 help sign in
elk/core/Native/Time.js
79 lines 2.2 kB history raw
1/*
2import Signal
3import Maybe
4*/
6(function() {
7 'use strict';
9 function timeNow() { return (new window.Date).getTime(); }
11 function fpsWhen(desiredFPS) { return function (isOn) {
12 var msPerFrame = 1000 / desiredFPS;
13 var prev = timeNow(), curr = prev, diff = 0, wasOn = true;
14 var ticker = Elm.Signal.constant(diff);
15 function tick(zero) { return function() {
16 curr = timeNow();
17 diff = zero ? 0 : curr - prev;
18 prev = curr;
19 Dispatcher.notify(ticker.id, diff);
20 };
21 }
22 var timeoutID = 0;
23 function f(isOn) { return function(t) {
24 if (isOn) {
25 timeoutID = setTimeout(tick(!wasOn && isOn), msPerFrame);
26 } else if (wasOn) {
27 clearTimeout(timeoutID);
28 }
29 wasOn = isOn;
30 return t;
31 };
32 }
33 return Elm.Signal.lift2(f)(isOn)(ticker);
34 };
35 }
37 function everyWhen(isOn) { return function(t) {
38 var clock = Elm.Signal.constant(timeNow());
39 function tellTime() { Dispatcher.notify(clock.id, timeNow()); }
40 setInterval(tellTime, t);
41 return clock;
42 };
43 }
45 function since(t) { return function(s) {
46 function cmp(a) { return function(b) { return !Value.eq(a,b); }; }
47 var dcount = Elm.Signal.count(Elm.Signal.delay(t)(s));
48 return Elm.Signal.lift2(cmp)(Elm.Signal.count(s))(dcount);
49 };
50 }
51 function after(t) {
52 t *= 1000;
53 var thread = Elm.Signal.constant(false);
54 setTimeout(function() { Dispatcher.notify(thread.id, true); }, t);
55 return thread;
56 }
57 function before(t) {
58 t *= 1000;
59 var thread = Elm.Signal.constant(true);
60 setTimeout(function() { Dispatcher.notify(thread.id, false); }, t);
61 return thread;
62 }
63 function read(s) {
64 var t = window.Date.parse(s);
65 return isNaN(t) ? Elm.Maybe.Nothing : Elm.Maybe.Just(t);
66 }
67 Elm.Native.Time = {
68 fpsWhen : fpsWhen,
69 fps : function(t) { return fpsWhen(t)(Elm.Signal.constant(true)); },
70 every : everyWhen(Elm.Signal.constant(true)),
71 delay : Elm.Signal.delay,
72 since : since,
73 after : after,
74 before : before,
75 toDate : function(t) { return new window.Date(t); },
76 read : read
77 };
79}());