Algorithm-Diff-Callback
view release on metacpan or search on metacpan
lib/Algorithm/Diff/Callback.pm view on Meta::CPAN
package Algorithm::Diff::Callback;
# ABSTRACT: Use callbacks on computed differences
$Algorithm::Diff::Callback::VERSION = '0.111';
use strict;
use warnings;
use parent 'Exporter';
use Carp 'croak';
use List::Util 1.45 'uniq';
use Algorithm::Diff 'diff';
our @EXPORT_OK = qw(diff_hashes diff_arrays);
sub diff_hashes {
my ( $old, $new, %cbs ) = @_;
ref $old eq 'HASH' or croak 'Arg 1 must be hashref';
ref $new eq 'HASH' or croak 'Arg 2 must be hashref';
my @changed;
foreach my $key ( keys %{$new} ) {
if ( ! exists $old->{$key} ) {
exists $cbs{'added'}
and $cbs{'added'}->( $key, $new->{$key} );
} else {
push @changed, $key;
}
}
foreach my $key ( keys %{$old} ) {
if ( ! exists $new->{$key} ) {
exists $cbs{'deleted'}
and $cbs{'deleted'}->( $key, $old->{$key} );
}
}
foreach my $key (@changed) {
my $before = $old->{$key} || '';
my $after = $new->{$key} || '';
if ( $before ne $after ) {
exists $cbs{'changed'}
and $cbs{'changed'}->( $key, $before, $after );
}
}
return;
}
sub diff_arrays {
my ( $old, $new, %cbs ) = @_;
ref $old eq 'ARRAY' or croak 'Arg 1 must be arrayref';
ref $new eq 'ARRAY' or croak 'Arg 2 must be arrayref';
# normalize arrays
my @old = uniq sort @{$old};
my @new = uniq sort @{$new};
my @diffs = diff( \@old, \@new );
foreach my $diff (@diffs) {
foreach my $changeset ( @{$diff} ) {
my ( $change, undef, $value ) = @{$changeset};
if ( $change eq '+' ) {
( run in 1.666 second using v1.01-cache-2.11-cpan-62a16548d74 )