browser: store only changed values in version support
[sheet.git] / browser.plp
index 2fe75009ef3cd293b8296ee7e19594b24db41592..b6b501e5be17a44efa70275cd939f8fa9b650e03 100644 (file)
@@ -279,9 +279,12 @@ sub featurescore {
                if ($canihas) {
                        while (my ($browser, $versions) = each %$row) {
                                ref $versions eq 'HASH' or next;
-                               while (my ($version, $status) = each %$versions) {
+                               my $prev;
+                               for my $version (@{ $caniuse->{agents}->{$browser}->{versions} }) {
+                                       my $status = $versions->{$version} // $prev;
                                        $status =~ s/\h\#\d+//g;
                                        $rank += ($canihas->{$browser}->{$version} || .001) * $PSTATS{$status};
+                                       $prev = $status;
                                }
                        }
                        return $rank;
@@ -392,15 +395,15 @@ sub saybrowsercols {
                my $compare = (
                        !defined $ver ? undef :      # last column if nameless
                        ref $data ne 'HASH' ? '' :   # unclassified if no support hash
-                       $data->{ $ver->[-1] } // $prev  # known or inherit from predecessor
-                       // (grep { defined } @{$data}{ map { $_->[0] } @{ $versions{$browser} } })[0]
-                          ~~ 'n' && 'n'             # first known version is unsupported
+                       (first { defined } @{$data}{ reverse @{$ver} })  # last known version
+                       // $prev                     # inherit from predecessor
                        || 'u'                       # unsure
                );
-               unless (!defined $prev or $prev ~~ $compare) {
-                       my @vercover = (map { @{$_} } @span);
+               if (defined $prev and not $prev ~~ $compare) {
+                       # different columns
+                       my @vercover = (map { @{$_} } @span);  # accumulated conforming versions
                        for ($ver ? @{$ver} : ()) {
-                               $data->{$_} eq $data->{$vercover[-1]} or last;
+                               last if defined $data->{$_};  # until different
                                push @vercover, $_;  # matches from next span start
                        }
                        my $usage = sum(@{ $canihas->{$browser} }{@vercover});
@@ -438,7 +441,11 @@ sub saybrowsercols {
                        undef $prev;
                        @span = ();
                }
-               push @span, $ver && [ grep { $data->{ $_ } eq $data->{ $ver->[-1] } } @{$ver} ];
+               if ($ver) {
+                       my $startversion = first { defined $data->{ $ver->[$_] } }
+                               reverse 0 .. $#{$ver};  # compare index
+                       push @span, [ @{$ver}[ $startversion .. $#{$ver} ] ];
+               }
                $prev = $compare;
        }
 }