summaryrefslogtreecommitdiff
path: root/lib/Bookmarks/M/TagSet.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Bookmarks/M/TagSet.pm')
-rw-r--r--lib/Bookmarks/M/TagSet.pm89
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;