diff options
Diffstat (limited to 'lib/Bookmarks/M/TagSet.pm')
-rw-r--r-- | lib/Bookmarks/M/TagSet.pm | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/lib/Bookmarks/M/TagSet.pm b/lib/Bookmarks/M/TagSet.pm new file mode 100644 index 0000000..aa84783 --- /dev/null +++ b/lib/Bookmarks/M/TagSet.pm @@ -0,0 +1,89 @@ +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; |