]> wagnertech.de Git - mfinanz.git/blobdiff - SL/MoreCommon.pm
Bugfix für Bug 1127. webpages/ct/get_delivery_master ist nicht customer/vendor sicher...
[mfinanz.git] / SL / MoreCommon.pm
index 699a6724a777ec0d0a5fce04c4758025e40bd35e..e09d7c85dd13a236a8b45103bf0a1ee647b3a28f 100644 (file)
@@ -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;
 
@@ -96,7 +97,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 +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;