Einkaufsrechnung -> Zahlung buchen: sinnlosen Quark gefixt.
[kivitendo-erp.git] / SL / MoreCommon.pm
index 1ee62cc..e93dd17 100644 (file)
@@ -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();
 
@@ -127,4 +130,40 @@ 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;