summaryrefslogtreecommitdiff
path: root/lib/Bookmarks/M/TagSet.pm
blob: aa847834511955e41ffaa9796384e4d9df7ba668 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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 @tagsreturn (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 @tagsreturn (shift @tags)->related_tags() },
        sub { "$_[0]" }
    );
 
    return @related;
}
 
1;