@@ -2412,11 +2412,15 @@ Elm.Signal = function() {
24122412
24132413 function delay(t) { return function(s) {
24142414 var delayed = new input(s.value);
2415+ var firstEvent = true;
24152416 function update(v) {
2416− setTimeout(function() { Dispatcher.notify(delayed.id,v); },t*1000);
2417+ if (firstEvent) return;
2418+ setTimeout(function() { Dispatcher.notify(delayed.id,v); },t);
24172419 }
24182420 function first(a) { return function(b) { return a; }; }
2419− return new lift(first, [delayed, new lift(update,[s])]);
2421+ var out = new sampleOn(delayed,new lift(first, [delayed, new lift(update,[s])]));
2422+ firstEvent = false;
2423+ return out;
24202424 };
24212425 }
24222426
@@ -2453,16 +2457,56 @@ Elm.Signal = function() {
24532457 s2.kids.push(this);
24542458 };
24552459
2460+ function average(sampleSize) { return function(s) {
2461+ var sample = new Array(sampleSize);
2462+ var i = sampleSize;
2463+ while (i--) sample[i] = 0;
2464+ i = 0;
2465+ var full = false;
2466+ var total = 0;
2467+ function f(n) {
2468+ total += n - sample[i];
2469+ sample[i] = n;
2470+ var avg = total / Math.max(1, full ? sampleSize : i);
2471+ if (++i == sampleSize) { full = true; i = 0; }
2472+ return avg;
2473+ }
2474+ return new lift(f, [s]);
2475+ };
2476+ }
2477+
24562478 return {
24572479 constant : function(v) { return new input(v); },
24582480 lift : function(f){return function(e){return new lift(f,[e]);};},
2459− lift2 : function(f) { return function(e1) { return function(e2) {
2460− return new lift(f, [e1,e2]); }; }; },
2461− lift3 : function(f) { return function(e1) { return function(e2) {
2462− return function(e3){return new lift(f,[e1,e2,e3]);};};};},
2463− lift4 : function(f) { return function(e1) { return function(e2) {
2464− return function(e3) { return function(e4) {
2465− return new lift(f, [e1,e2,e3,e4]); }; }; }; }; },
2481+ lift2 : function(f) {
2482+ return function(e1) { return function(e2) {
2483+ return new lift(f, [e1,e2]); };};},
2484+ lift3 : function(f) {
2485+ return function(e1) { return function(e2) {
2486+ return function(e3){return new lift(f,[e1,e2,e3]);};};};},
2487+ lift4 : function(f) {
2488+ return function(e1) { return function(e2) {
2489+ return function(e3) { return function(e4) {
2490+ return new lift(f, [e1,e2,e3,e4]);};};};};},
2491+ lift5 : function(f) {
2492+ return function(e1) { return function(e2) {
2493+ return function(e3) { return function(e4) {
2494+ return function(e5) {
2495+ return new lift(f, [e1,e2,e3,e4,e5]);};};};};};},
2496+ lift6 : function(f) { return function(e1) { return function(e2) {
2497+ return function(e3) { return function(e4) {
2498+ return function(e5) { return function(e6) {
2499+ return new lift(f, [e1,e2,e3,e4,e5,e6]); };};};};};};},
2500+ lift7 : function(f) { return function(e1) { return function(e2) {
2501+ return function(e3) { return function(e4) {
2502+ return function(e5) { return function(e6) {
2503+ return function(e7) {
2504+ return new lift(f, [e1,e2,e3,e4,e5,e6,e7]);};};};};};};};},
2505+ lift8 : function(f) { return function(e1) { return function(e2) {
2506+ return function(e3) { return function(e4) {
2507+ return function(e5) { return function(e6) {
2508+ return function(e7) { return function(e8) {
2509+ return new lift(f, [e1,e2,e3,e4,e5,e6,e7,e8]);};};};};};};};};},
24662510 foldp : function(f) { return function(b) { return function(e) {
24672511 return new fold(f,b,false,e); }; }; },
24682512 foldp_ : function(f) { return function(b) { return function(e) {
@@ -2471,6 +2515,7 @@ Elm.Signal = function() {
24712515 return new fold(f,function(x){return x;},true,e); }; },
24722516 delay : delay,
24732517 merge : function(s1) { return function(s2) { return new merge(s1,s2)}; },
2518+ average : average,
24742519 count : function(sig) {
24752520 var incr = function(_){return function(c){return c+1;};};
24762521 return new fold(incr,0,false,sig) },
@@ -2826,49 +2871,77 @@ Elm.Random = function() {
28262871 return { inRange:inRange, randomize:randomize };
28272872}();Elm.Time = function() {
28282873 function timeNow() { return (new window.Date).getTime(); }
2829− var every = function(t) {
2874+ function everyWhen(isOn) { return function(t) {
28302875 var clock = Elm.Signal.constant(timeNow());
28312876 function tellTime() { Dispatcher.notify(clock.id, timeNow()); }
28322877 setInterval(tellTime, t);
28332878 return clock;
2834− };
2835− function fps(desiredFPS) {
2879+ };
2880+ }
2881+ function fpsWhen(desiredFPS) { return function (isOn) {
28362882 var msPerFrame = 1000 / desiredFPS;
2837− var ticker = Elm.Signal.constant(timeNow());
2838− function tick() { Dispatcher.notify(ticker.id, timeNow()); }
2839− function f(t) { setTimeout(tick, msPerFrame); return t; }
2840− return Elm.Signal.lift(f)(ticker);
2883+ var prev = timeNow(), curr = prev, diff = 0, wasOn = true;
2884+ var ticker = Elm.Signal.constant(diff);
2885+ function tick(zero) { return function() {
2886+ curr = timeNow();
2887+ diff = zero ? 0 : curr - prev;
2888+ prev = curr;
2889+ Dispatcher.notify(ticker.id, diff);
2890+ };
2891+ }
2892+ var timeoutID = 0;
2893+ function f(isOn) { return function(t) {
2894+ if (isOn) {
2895+ timeoutID = setTimeout(tick(!wasOn && isOn), msPerFrame);
2896+ } else if (wasOn) {
2897+ clearTimeout(timeoutID);
2898+ }
2899+ wasOn = isOn;
2900+ return t;
2901+ };
2902+ }
2903+ return Elm.Signal.lift2(f)(isOn)(ticker);
2904+ };
2905+ }
2906+ function since(t) { return function(s) {
2907+ function cmp(a) { return function(b) { return !Value.eq(a,b); }; }
2908+ var dcount = Elm.Signal.count(Elm.Signal.delay(t)(s));
2909+ return Elm.Signal.lift2(cmp)(Elm.Signal.count(s))(dcount);
2910+ };
28412911 }
2842− var after = function(t) {
2912+ function after(t) {
28432913 t *= 1000;
28442914 var thread = Elm.Signal.constant(false);
28452915 setTimeout(function() { Dispatcher.notify(thread.id, true); }, t);
28462916 return thread;
2847− };
2848− var before = function(t) {
2917+ }
2918+ function before(t) {
28492919 t *= 1000;
28502920 var thread = Elm.Signal.constant(true);
28512921 setTimeout(function() { Dispatcher.notify(thread.id, false); }, t);
28522922 return thread;
2853− };
2923+ }
28542924 function read(s) {
28552925 var t = window.Date.parse(s);
28562926 return isNaN(t) ? ["Nothing"] : ["Just",t];
28572927 }
2858− return {fps:fps,
2859− every:every,
2860− after:after,
2861− before:before,
2862− hours : function(n) { return n * 3600000; },
2863− minutes : function(n) { return n * 60000; },
2864− seconds : function(n) { return n * 1000; },
2865− millis : function(n) { return n; },
2866− inHours : function(t) { return t / 3600000; },
2928+ return {fpsWhen : fpsWhen,
2929+ fps : function(t) { return fpsWhen(t)(Elm.Signal.constant(true)); },
2930+ every : everyWhen(Elm.Signal.constant(true)),
2931+ delay : Elm.Signal.delay,
2932+ since : since,
2933+ after : after,
2934+ before : before,
2935+ hour : 3600000,
2936+ minute : 60000,
2937+ second : 1000,
2938+ ms : 1,
2939+ inHours : function(t) { return t / 3600000; },
28672940 inMinutes : function(t) { return t / 60000; },
28682941 inSeconds : function(t) { return t / 1000; },
2869− inMillis : function(t) { return t; },
2942+ inMss : function(t) { return t; },
28702943 toDate : function(t) { return new window.Date(t); },
2871− read : read
2944+ read : read
28722945 };
28732946
28742947}();Elm.Window = function() {
@@ -2894,12 +2967,6 @@ Elm.Random = function() {
28942967Elm.Date = function() {
28952968
28962969 function dateNow() { return new window.Date; }
2897− function every(t) {
2898− var clock = Elm.Signal.constant(dateNow());
2899− function tellTime() { Dispatcher.notify(clock.id, dateNow()); }
2900− setInterval(tellTime, t);
2901− return clock;
2902− }
29032970 function readDate(str) {
29042971 var d = new window.Date(Elm.JavaScript.castStringToJSString(str));
29052972 if (isNaN(d.getTime())) return ["Nothing"];
@@ -2911,7 +2978,6 @@ Elm.Date = function() {
29112978 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
29122979
29132980 return {
2914− every : every,
29152981 read : readDate,
29162982 year : function(d) { return d.getFullYear(); },
29172983 month : function(d) { return [monthTable[d.getMonth()]]; },
@@ -3079,10 +3145,10 @@ Elm.Prelude = function() {
30793145 foldp1 : Elm.Signal.foldp1,
30803146 foldp_ : Elm.Signal.foldp_,
30813147 constant : Elm.Signal.constant,
3082− delay : Elm.Signal.delay,
30833148 merge : Elm.Signal.merge,
30843149 count : Elm.Signal.count,
30853150 countIf : Elm.Signal.countIf,
3151+ average : Elm.Signal.average,
30863152 keepIf : Elm.Signal.keepIf,
30873153 dropIf : Elm.Signal.dropIf,
30883154 keepWhen : Elm.Signal.keepWhen,
@@ -3102,6 +3168,7 @@ Elm.Prelude = function() {
31023168 include (Elm.Color);
31033169 include (Elm.Text);
31043170 include (Elm.Graphics);
3171+ include (Elm.Time);
31053172
31063173 show = Value.show;
31073174