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 )