File Coverage

blib/lib/Data/Pipeline/Action/Unique.pm
Criterion Covered Total %
statement 1 3 33.3
branch n/a
condition n/a
subroutine 1 1 100.0
pod n/a
total 2 4 50.0


line stmt bran cond sub pod time code
1             package Data::Pipeline::Action::Unique;
2              
3 1     1   2871 use Moose;
  0            
  0            
4             with 'Data::Pipeline::Action';
5              
6             has key_generator => (
7             isa => 'CodeRef',
8             is => 'ro',
9             lazy => 1,
10             predicate => 'has_key_generator',
11             default => sub {
12             sub { $_[0] }
13             }
14             );
15              
16             has fields => (
17             isa => 'ArrayRef',
18             is => 'ro',
19             lazy => 1,
20             predicate => 'has_fields',
21             default => sub { [ ] }
22             );
23              
24             sub transform {
25             my($self, $iterator) = @_;
26              
27             $iterator = $self -> make_iterator($iterator);
28              
29             my %seen;
30             my $next = $iterator -> next;
31              
32             if($self -> has_fields && !$self -> has_key_generator) {
33             $self -> key_generator(sub {
34             join("\0\0", @{$_[0]}{@{$self -> fields}})
35             });
36             }
37              
38             $seen{$self -> key_generator -> ($next)}++;
39              
40             return Data::Pipeline::Iterator -> new(
41             source => Data::Pipeline::Source::Iterator -> new(
42             has_next => sub {
43             !$iterator -> finished;
44             },
45             get_next => sub {
46             my $ret = $next;
47             while( !$iterator -> finished ) {
48             $next = $iterator -> next;
49             last unless $seen{ $self -> key_generator -> ($next) }++;
50             }
51             $next = undef if $iterator -> finished;
52             return $ret;
53             },
54             )
55             );
56             }
57              
58             1;
59              
60             __END__