sum calculation on demand and cached
authorMischa POSLAWSKY <perl@shiar.org>
Sat, 10 Dec 2022 00:12:57 +0000 (01:12 +0100)
committerMischa POSLAWSKY <perl@shiar.org>
Mon, 12 Dec 2022 22:56:34 +0000 (23:56 +0100)
Automatic handling of any (re)use in calc().

barcat

diff --git a/barcat b/barcat
index cb3282eaf4b356e0a7a40aa4b97c59d00660eafd..1fd0dd3e8815c8879569fc3bf0e4fa5c679524d5 100755 (executable)
--- a/barcat
+++ b/barcat
@@ -400,11 +400,9 @@ sub show_stat {
                $vars{partsum} = sum(0, grep {length} @values[$linemin .. $linemax])
                        if $linemin <= $linemax and ($opt{hidemin} or $opt{hidemax});
                %vars = (%vars,
-                       sum => sum(@order),
                        min => $order[-1],
                        max => $order[0],
                );
-               $vars{avg} = $vars{sum} / @order;
        }
        say varfmt($opt{report}, \%vars);
        return 1;
@@ -413,10 +411,16 @@ sub show_stat {
 sub calc {
        my ($func) = @_;
        if ($func eq 'avg') {
-               return sum(@order) / @order;
+               return calc('sum') / @order;
        }
        elsif ($func eq 'sum') {
-               return sum(@order);
+               state $cache;         # avoid recount
+               state $cachednr = 0;  # if unchanged
+               unless (@order == $cachednr) {
+                       $cache = sum(@order);
+                       $cachednr = @order;
+               }
+               return $cache;
        }
        elsif ($func =~ /\A([0-9.]+)v\z/) {
                $1 <= 100 or die(