Full storage does not scale well, taking over 1.2s to load the current 23MB
perl structure (mostly indentation, minified it's 3MB like the original json).
Simple deduplication reduces this to 2.6MB pp (800kB as json) which takes only
0.2s excluding parsing.
if ($canihas) {
while (my ($browser, $versions) = each %$row) {
ref $versions eq 'HASH' or next;
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};
$status =~ s/\h\#\d+//g;
$rank += ($canihas->{$browser}->{$version} || .001) * $PSTATS{$status};
my $compare = (
!defined $ver ? undef : # last column if nameless
ref $data ne 'HASH' ? '' : # unclassified if no support hash
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
- 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} : ()) {
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});
push @vercover, $_; # matches from next span start
}
my $usage = sum(@{ $canihas->{$browser} }{@vercover});
undef $prev;
@span = ();
}
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} ] ];
+ }
use Time::Piece;
use List::Util 'uniq';
use Time::Piece;
use List::Util 'uniq';
my %BROWSERJOIN = (
edge => 'ie',
my %BROWSERJOIN = (
edge => 'ie',
while (my ($agent, $row) = each %{ $data->{agents} }) {
$row->{versions} = [ uniq map { $_->{version} } @{ $row->{version_list} } ];
while (my ($agent, $row) = each %{ $data->{agents} }) {
$row->{versions} = [ uniq map { $_->{version} } @{ $row->{version_list} } ];
+
+ # omit identical values from subsequent versions
+ for my $feature (values %{ $data->{data} }) {
+ my $cmp; # same value to be omitted
+ my $verstats = $feature->{stats}->{$agent};
+ for my $version (@{ $row->{versions} }) {
+ defined $verstats->{$version}
+ or warn "missing feature $feature->{title} for $agent $version";
+ if (defined $cmp and $verstats->{$version} eq $cmp) {
+ delete $verstats->{$version};
+ }
+ else {
+ $cmp = $verstats->{$version};
+ }
+ }
+ }
}
say "# automatically generated by $0";
}
say "# automatically generated by $0";