@@ -2412,11 +2412,15 @@ Elm.Signal = function() {
2413 function delay(t) { return function(s) {
2413 function delay(t) { return function(s) {
2414 var delayed = new input(s.value);
2414 var delayed = new input(s.value);
2415+ var firstEvent = true;
2415 function update(v) {
2416 function update(v) {
2417+ if (firstEvent) return;
2416− setTimeout(function() { Dispatcher.notify(delayed.id,v); },t*1000);
2418+ setTimeout(function() { Dispatcher.notify(delayed.id,v); },t);
2418 function first(a) { return function(b) { return a; }; }
2420 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;
@@ -2453,16 +2457,56 @@ Elm.Signal = function() {
2453 s2.kids.push(this);
2457 s2.kids.push(this);
2460+ function average(sampleSize) { return function(s) {
2461+ var sample = new Array(sampleSize);
2462+ var i = sampleSize;
2463+ while (i--) sample[i] = 0;
2468+ total += n - sample[i];
2470+ var avg = total / Math.max(1, full ? sampleSize : i);
2471+ if (++i == sampleSize) { full = true; i = 0; }
2474+ return new lift(f, [s]);
2456 return {
2478 return {
2457 constant : function(v) { return new input(v); },
2479 constant : function(v) { return new input(v); },
2458 lift : function(f){return function(e){return new lift(f,[e]);};},
2480 lift : function(f){return function(e){return new lift(f,[e]);};},
2481+ lift2 : function(f) {
2459− lift2 : function(f) { return function(e1) { return function(e2) {
2482+ return function(e1) { return function(e2) {
2460− return new lift(f, [e1,e2]); }; }; },
2483+ return new lift(f, [e1,e2]); };};},
2484+ lift3 : function(f) {
2461− lift3 : function(f) { return function(e1) { return function(e2) {
2485+ return function(e1) { return function(e2) {
2462− return function(e3){return new lift(f,[e1,e2,e3]);};};};},
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) {
2463− lift4 : function(f) { return function(e1) { return function(e2) {
2492+ return function(e1) { return function(e2) {
2464− return function(e3) { return function(e4) {
2493+ return function(e3) { return function(e4) {
2494+ return function(e5) {
2465− return new lift(f, [e1,e2,e3,e4]); }; }; }; }; },
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]);};};};};};};};};},
2466 foldp : function(f) { return function(b) { return function(e) {
2510 foldp : function(f) { return function(b) { return function(e) {
2467 return new fold(f,b,false,e); }; }; },
2511 return new fold(f,b,false,e); }; }; },
2468 foldp_ : function(f) { return function(b) { return function(e) {
2512 foldp_ : function(f) { return function(b) { return function(e) {
@@ -2471,6 +2515,7 @@ Elm.Signal = function() {
2471 return new fold(f,function(x){return x;},true,e); }; },
2515 return new fold(f,function(x){return x;},true,e); }; },
2472 delay : delay,
2516 delay : delay,
2473 merge : function(s1) { return function(s2) { return new merge(s1,s2)}; },
2517 merge : function(s1) { return function(s2) { return new merge(s1,s2)}; },
2474 count : function(sig) {
2519 count : function(sig) {
2475 var incr = function(_){return function(c){return c+1;};};
2520 var incr = function(_){return function(c){return c+1;};};
2476 return new fold(incr,0,false,sig) },
2521 return new fold(incr,0,false,sig) },
@@ -2826,49 +2871,77 @@ Elm.Random = function() {
2826 return { inRange:inRange, randomize:randomize };
2871 return { inRange:inRange, randomize:randomize };
2827}();Elm.Time = function() {
2872}();Elm.Time = function() {
2828 function timeNow() { return (new window.Date).getTime(); }
2873 function timeNow() { return (new window.Date).getTime(); }
2829− var every = function(t) {
2874+ function everyWhen(isOn) { return function(t) {
2830 var clock = Elm.Signal.constant(timeNow());
2875 var clock = Elm.Signal.constant(timeNow());
2831 function tellTime() { Dispatcher.notify(clock.id, timeNow()); }
2876 function tellTime() { Dispatcher.notify(clock.id, timeNow()); }
2832 setInterval(tellTime, t);
2877 setInterval(tellTime, t);
2833 return clock;
2878 return clock;
2835− function fps(desiredFPS) {
2881+ function fpsWhen(desiredFPS) { return function (isOn) {
2836 var msPerFrame = 1000 / desiredFPS;
2882 var msPerFrame = 1000 / desiredFPS;
2883+ var prev = timeNow(), curr = prev, diff = 0, wasOn = true;
2837− var ticker = Elm.Signal.constant(timeNow());
2884+ var ticker = Elm.Signal.constant(diff);
2885+ function tick(zero) { return function() {
2887+ diff = zero ? 0 : curr - prev;
2838− function tick() { Dispatcher.notify(ticker.id, timeNow()); }
2889+ Dispatcher.notify(ticker.id, diff);
2893+ function f(isOn) { return function(t) {
2839− function f(t) { setTimeout(tick, msPerFrame); return t; }
2895+ timeoutID = setTimeout(tick(!wasOn && isOn), msPerFrame);
2896+ } else if (wasOn) {
2897+ clearTimeout(timeoutID);
2840− return Elm.Signal.lift(f)(ticker);
2903+ return Elm.Signal.lift2(f)(isOn)(ticker);
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);
2842− var after = function(t) {
2912+ function after(t) {
2843 t *= 1000;
2913 t *= 1000;
2844 var thread = Elm.Signal.constant(false);
2914 var thread = Elm.Signal.constant(false);
2845 setTimeout(function() { Dispatcher.notify(thread.id, true); }, t);
2915 setTimeout(function() { Dispatcher.notify(thread.id, true); }, t);
2846 return thread;
2916 return thread;
2848− var before = function(t) {
2918+ function before(t) {
2849 t *= 1000;
2919 t *= 1000;
2850 var thread = Elm.Signal.constant(true);
2920 var thread = Elm.Signal.constant(true);
2851 setTimeout(function() { Dispatcher.notify(thread.id, false); }, t);
2921 setTimeout(function() { Dispatcher.notify(thread.id, false); }, t);
2852 return thread;
2922 return thread;
2854 function read(s) {
2924 function read(s) {
2855 var t = window.Date.parse(s);
2925 var t = window.Date.parse(s);
2856 return isNaN(t) ? ["Nothing"] : ["Just",t];
2926 return isNaN(t) ? ["Nothing"] : ["Just",t];
2858− return {fps:fps,
2928+ return {fpsWhen : fpsWhen,
2859− every:every,
2929+ fps : function(t) { return fpsWhen(t)(Elm.Signal.constant(true)); },
2930+ every : everyWhen(Elm.Signal.constant(true)),
2931+ delay : Elm.Signal.delay,
2860− after:after,
2933+ after : after,
2861− before:before,
2934+ before : before,
2862− hours : function(n) { return n * 3600000; },
2935+ hour : 3600000,
2863− minutes : function(n) { return n * 60000; },
2936+ minute : 60000,
2864− seconds : function(n) { return n * 1000; },
2937+ second : 1000,
2865− millis : function(n) { return n; },
2938+ ms : 1,
2866− inHours : function(t) { return t / 3600000; },
2939+ inHours : function(t) { return t / 3600000; },
2867 inMinutes : function(t) { return t / 60000; },
2940 inMinutes : function(t) { return t / 60000; },
2868 inSeconds : function(t) { return t / 1000; },
2941 inSeconds : function(t) { return t / 1000; },
2869− inMillis : function(t) { return t; },
2942+ inMss : function(t) { return t; },
2870 toDate : function(t) { return new window.Date(t); },
2943 toDate : function(t) { return new window.Date(t); },
2871− read : read
2944+ read : read
2874}();Elm.Window = function() {
2947}();Elm.Window = function() {
@@ -2894,12 +2967,6 @@ Elm.Random = function() {
2894Elm.Date = function() {
2967Elm.Date = function() {
2896 function dateNow() { return new window.Date; }
2969 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);
2903 function readDate(str) {
2970 function readDate(str) {
2904 var d = new window.Date(Elm.JavaScript.castStringToJSString(str));
2971 var d = new window.Date(Elm.JavaScript.castStringToJSString(str));
2905 if (isNaN(d.getTime())) return ["Nothing"];
2972 if (isNaN(d.getTime())) return ["Nothing"];
@@ -2911,7 +2978,6 @@ Elm.Date = function() {
2911 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
2978 "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
2913 return {
2980 return {
2915 read : readDate,
2981 read : readDate,
2916 year : function(d) { return d.getFullYear(); },
2982 year : function(d) { return d.getFullYear(); },
2917 month : function(d) { return [monthTable[d.getMonth()]]; },
2983 month : function(d) { return [monthTable[d.getMonth()]]; },
@@ -3079,10 +3145,10 @@ Elm.Prelude = function() {
3079 foldp1 : Elm.Signal.foldp1,
3145 foldp1 : Elm.Signal.foldp1,
3080 foldp_ : Elm.Signal.foldp_,
3146 foldp_ : Elm.Signal.foldp_,
3081 constant : Elm.Signal.constant,
3147 constant : Elm.Signal.constant,
3082− delay : Elm.Signal.delay,
3083 merge : Elm.Signal.merge,
3148 merge : Elm.Signal.merge,
3084 count : Elm.Signal.count,
3149 count : Elm.Signal.count,
3085 countIf : Elm.Signal.countIf,
3150 countIf : Elm.Signal.countIf,
3151+ average : Elm.Signal.average,
3086 keepIf : Elm.Signal.keepIf,
3152 keepIf : Elm.Signal.keepIf,
3087 dropIf : Elm.Signal.dropIf,
3153 dropIf : Elm.Signal.dropIf,
3088 keepWhen : Elm.Signal.keepWhen,
3154 keepWhen : Elm.Signal.keepWhen,
@@ -3102,6 +3168,7 @@ Elm.Prelude = function() {
3102 include (Elm.Color);
3168 include (Elm.Color);
3103 include (Elm.Text);
3169 include (Elm.Text);
3104 include (Elm.Graphics);
3170 include (Elm.Graphics);
3171+ include (Elm.Time);
3106 show = Value.show;
3173 show = Value.show;