package Bookmarks::M::TagSet;
use base 'Catalyst::Base';
use Bookmarks::M::DB::Tags;
our $VERSION='0.1';
sub retrieve {
my ($class, $opts)=@_;
return unless defined $opts->{tags};
return unless ref($opts->{tags}) eq 'ARRAY';
my @tagnames=@{$opts->{tags}};
return unless @tagnames;
my @tags=map {
(Bookmarks::M::DB::Tags->search({name=>$_}))[0]
or return;
} @tagnames;
my $self=bless {tags=>[@tags]},$class;
}
sub size {
my ($self)=@_;
return scalar @{$self->{tags}};
}
sub tags {
my ($self)=@_;
return @{$self->{tags}};
}
sub unite_stuff {
my ($generator,$key)=@_;
my %set=();
while (my @slice=$generator->()) {
for my $item (@slice) {
$set{$key->($item)}||=$item;
}
}
return values %set;
}
sub intersect_stuff {
my ($generator,$key)=@_;
my $count=0;
my %set=();
while (my @slice=$generator->()) {
$count++;
for my $item (@slice) {
my $this_key=$key->($item);
$set{$this_key}||=[$item,0];
$set{$this_key}->[1]++;
}
}
return map { $_->[0] } grep { $_->[1] == $count } values %set;
}
sub ordered_links {
my ($self)=@_;
my @tags=@{$self->{tags}};
my @links=intersect_stuff(
sub { return unless @tags; return (shift @tags)->ordered_links() },
sub { "$_[0]" }
);
return sort Bookmarks::M::DB::Tags::links_sorter @links;
}
sub related_tags {
my ($self)=@_;
my @tags=@{$self->{tags}};
my @related=intersect_stuff(
sub { return unless @tags; return (shift @tags)->related_tags() },
sub { "$_[0]" }
);
return @related;
}
1;