X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/bc40c9890a1798edd9038d7d558a5e2df1ef21fd..e1cb00366d40cc3a1b07e065b51ad39c84baf7e6:/SL/MoreCommon.pm diff --git a/SL/MoreCommon.pm b/SL/MoreCommon.pm index 1ee62cca4..e09d7c85d 100644 --- a/SL/MoreCommon.pm +++ b/SL/MoreCommon.pm @@ -3,7 +3,8 @@ package SL::MoreCommon; require Exporter; @ISA = qw(Exporter); -@EXPORT = qw(save_form restore_form compare_numbers any cross); +@EXPORT = qw(save_form restore_form compare_numbers any cross); +@EXPORT_OK = qw(ary_union ary_intersect ary_diff); use YAML; @@ -127,4 +128,35 @@ sub cross(&\@\@) { } 0 .. $#A; } +sub _ary_calc_union_intersect { + my ($a, $b) = @_; + + my %count = (); + + foreach my $e (@$a, @$b) { $count{$e}++ } + + my @union = (); + my @isect = (); + foreach my $e (keys %count) { + push @union, $e; + push @isect, $e if $count{$e} == 2; + } + + return (\@union, \@isect); +} + +sub ary_union { + return @{ (_ary_calc_union_intersect @_)[0] }; +} + +sub ary_intersect { + return @{ (_ary_calc_union_intersect @_)[1] }; +} + +sub ary_diff { + my ($a, $b) = @_; + my %in_b = map { $_ => 1 } @$b; + return grep { !$in_b{$_} } @$a; +} + 1;