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}}; # intersezione dei link, per chiave primaria 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}}; # intersezione dei related my @related=intersect_stuff( sub { return unless @tags; return (shift @tags)->related_tags() }, sub { "$_[0]" } ); return @related; } 1;