List-Collection

 view release on metacpan or  search on metacpan

lib/List/Collection.pm  view on Meta::CPAN

package List::Collection;
use Modern::Perl;
use Exporter;
use Sort::Naturally;

our $VERSION = '0.0.4'; # VERSION
# ABSTRACT: List::Collection


our @ISA = qw/Exporter/;
our @EXPORT = qw/intersect union subtract complement/;


sub new {
  my $class = shift;
  return bless { @_ }, $class;
}

sub _remove_obj {
  return if @_ == 0;
  shift if ($_[0] and ref $_[0] eq __PACKAGE__);
  return @_;
}


sub intersect {
  my @lists = _remove_obj(@_);
  my $list_count = @lists;
  my (%elements, @out);
  for my $list (@lists) {
    $elements{$_}++ for (@$list);
  }
  for my $key (sort keys %elements) {
    push (@out, $key) if $elements{$key} == $list_count;
  }
  @out = nsort(@out);
  return @out;
}


sub union {
  my @lists = _remove_obj(@_);
  my (%elements, @out);
  for my $list (@lists) {
    $elements{$_} = 1 for (@$list);
  }
  @out = nsort(keys %elements);
  return @out;
}


sub subtract {
  my @lists = _remove_obj(@_);
  my %elements;
  $elements{$_} = 1 for (@{$lists[0]});
  delete $elements{$_} for (@{$lists[1]});
  my @out = nsort(keys %elements);
  return @out;
}


sub complement {



( run in 1.631 second using v1.01-cache-2.11-cpan-75ffa21a3d4 )