JQ-Lite
view release on metacpan or search on metacpan
lib/JQ/Lite/Util/Transform.pm view on Meta::CPAN
}
sub _clamp_scalar {
my ($value, $min, $max) = @_;
return $value unless looks_like_number($value);
my $numeric = 0 + $value;
$numeric = $min if defined $min && $numeric < $min;
$numeric = $max if defined $max && $numeric > $max;
return $numeric;
}
sub _apply_to_number {
my ($value) = @_;
return undef if !defined $value;
if (JSON::PP::is_bool($value)) {
return $value ? 1 : 0;
}
if (!ref $value) {
return looks_like_number($value) ? 0 + $value : $value;
}
if (ref $value eq 'ARRAY') {
return [ map { _apply_to_number($_) } @$value ];
}
return $value;
}
sub _extract_numeric_values {
my ($values) = @_;
return () unless ref $values eq 'ARRAY';
return map {
JSON::PP::is_bool($_) ? ($_ ? 1 : 0) : 0 + $_;
} grep {
defined $_ && (JSON::PP::is_bool($_) || (!ref $_ && looks_like_number($_)));
} @$values;
}
sub _normalize_percentile {
my ($value) = @_;
return undef if !defined $value;
if (JSON::PP::is_bool($value)) {
$value = $value ? 1 : 0;
}
return undef if ref $value;
return undef unless looks_like_number($value);
my $fraction = 0 + $value;
return undef if $fraction != $fraction; # NaN
return undef if ($fraction * 0) != ($fraction * 0); # infinity
if ($fraction > 1) {
$fraction /= 100 if $fraction <= 100;
}
$fraction = 0 if $fraction < 0;
$fraction = 1 if $fraction > 1;
return $fraction;
}
sub _percentile_value {
my ($numbers, $fraction) = @_;
return undef unless ref $numbers eq 'ARRAY';
return undef unless @$numbers;
$fraction = 0 if $fraction < 0;
$fraction = 1 if $fraction > 1;
return $numbers->[0] if @$numbers == 1;
my $rank = $fraction * (@$numbers - 1);
my $lower_index = int($rank);
my $upper_index = $lower_index == @$numbers - 1 ? $lower_index : $lower_index + 1;
my $weight = $rank - $lower_index;
return $numbers->[$lower_index] if $upper_index == $lower_index;
my $lower = $numbers->[$lower_index];
my $upper = $numbers->[$upper_index];
return $lower + ($upper - $lower) * $weight;
}
sub _apply_merge_objects {
my ($value) = @_;
if (ref $value eq 'ARRAY') {
my %merged;
my $saw_object = 0;
for my $element (@$value) {
next unless ref $element eq 'HASH';
%merged = (%merged, %$element);
$saw_object = 1;
}
return $saw_object ? \%merged : {};
}
if (ref $value eq 'HASH') {
return { %$value };
}
return $value;
}
sub _to_entries {
( run in 1.534 second using v1.01-cache-2.11-cpan-99c4e6809bf )