-sub scale {
- my ($c, $r) = @_;
- return unless defined $r;
- return (ref $r) ? { map { $_ => $r->{$_} * $c } keys %$r } : { $r => $c };
-}
-
-sub combine {
- reduce {{
- my %res;
- my $la = delete $a->{list};
- my $lb = delete $b->{list};
- if (defined $la || defined $lb) {
- $la ||= 0;
- $lb ||= 0;
- $res{list} = $la + $lb - $la * $lb;
- }
- while (my ($ka, $va) = each %$a) {
- $ka = int $ka;
- while (my ($kb, $vb) = each %$b) {
- my $key = $ka + int $kb;
- $res{$key} += $va * $vb;
- }
- }
- \%res
- }} map { (ref) ? $_ : { $_ => 1 } } grep defined, @_;
-}
-