X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/f30b6f52b1684388cebc0878b73c39c6b1040749..08c340d2caca21066fd8797e29f07facfde7a07c:/SL/MoreCommon.pm diff --git a/SL/MoreCommon.pm b/SL/MoreCommon.pm index 699a6724a..48eef0cf9 100644 --- a/SL/MoreCommon.pm +++ b/SL/MoreCommon.pm @@ -1,14 +1,17 @@ package SL::MoreCommon; require Exporter; -@ISA = qw(Exporter); +our @ISA = qw(Exporter); -@EXPORT = qw(save_form restore_form compare_numbers any cross); +our @EXPORT = qw(save_form restore_form compare_numbers any cross); +our @EXPORT_OK = qw(ary_union ary_intersect ary_diff listify); use YAML; use SL::AM; +use strict; + sub save_form { $main::lxdebug->enter_sub(); @@ -96,7 +99,7 @@ will modify the input arrays. # append each to each @a = qw/a b c/; @b = qw/1 2 3/; - @x = pairwise { "$a$b" } @a, @b; + @x = cross { "$a$b" } @a, @b; # returns a1, a2, a3, b1, b2, b3, c1, c2, c3 As cross expects an array but returns a list it is not directly chainable @@ -127,4 +130,41 @@ 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; +} + +sub listify { + my @ary = scalar @_ > 1 ? @_ : ref $_[0] eq 'ARRAY' ? @{ $_[0] } : (@_); + return wantarray ? @ary : scalar @ary; +} ++ + 1;