1 package DOM::Tiny::_Collection;
7 use Scalar::Util 'blessed';
9 use constant REDUCE => ($] >= 5.008009 ? \&List::Util::reduce : \&_reduce);
11 our $VERSION = '0.002';
15 return bless [@_], ref $class || $class;
18 sub TO_JSON { [@{shift()}] }
22 return $self->new(grep { defined && (ref || length) } @$self);
27 return @$self unless $cb;
29 $_->$cb($i++) for @$self;
34 my ($self, $cb) = (shift, shift);
35 return $self->[0] unless $cb;
36 return List::Util::first { $_ =~ $cb } @$self if ref $cb eq 'Regexp';
37 return List::Util::first { $_->$cb(@_) } @$self;
40 sub flatten { $_[0]->new(_flatten(@{$_[0]})) }
43 my ($self, $cb) = (shift, shift);
44 return $self->new(grep { $_ =~ $cb } @$self) if ref $cb eq 'Regexp';
45 return $self->new(grep { $_->$cb(@_) } @$self);
49 join +(defined($_[1]) ? $_[1] : ''), map {"$_"} @{$_[0]};
52 sub last { shift->[-1] }
55 my ($self, $cb) = (shift, shift);
56 return $self->new(map { $_->$cb(@_) } @$self);
65 sub reverse { $_[0]->new(reverse @{$_[0]}) }
67 sub shuffle { $_[0]->new(List::Util::shuffle @{$_[0]}) }
69 sub size { scalar @{$_[0]} }
73 return $self->new(@$self[@_]);
79 return $self->new(sort @$self) unless $cb;
84 local (*{"${caller}::a"}, *{"${caller}::b"}) = (\$a, \$b);
87 return $self->new(@sorted);
91 my ($self, $cb) = (shift, shift);
92 $_->$cb(@_) for $self;
96 sub to_array { [@{shift()}] }
99 my ($self, $cb) = (shift, shift);
101 return $self->new(grep { !$seen{$_->$cb(@_)}++ } @$self) if $cb;
102 return $self->new(grep { !$seen{$_}++ } @$self);
106 map { _ref($_) ? _flatten(@$_) : $_ } @_;
113 return shift unless @_ > 1;
119 local(*{$caller."::a"}) = \my $a;
120 local(*{$caller."::b"}) = \my $b;
131 sub _ref { ref $_[0] eq 'ARRAY' || blessed $_[0] && $_[0]->isa(__PACKAGE__) }
135 =for Pod::Coverage *EVERYTHING*