1 package DOM::Tiny::_Collection;
7 use Scalar::Util 'blessed';
9 our $VERSION = '0.002';
13 return bless [@_], ref $class || $class;
16 sub TO_JSON { [@{shift()}] }
20 return $self->new(grep { defined && (ref || length) } @$self);
25 return @$self unless $cb;
27 $_->$cb($i++) for @$self;
32 my ($self, $cb) = (shift, shift);
33 return $self->[0] unless $cb;
34 return List::Util::first { $_ =~ $cb } @$self if ref $cb eq 'Regexp';
35 return List::Util::first { $_->$cb(@_) } @$self;
38 sub flatten { $_[0]->new(_flatten(@{$_[0]})) }
41 my ($self, $cb) = (shift, shift);
42 return $self->new(grep { $_ =~ $cb } @$self) if ref $cb eq 'Regexp';
43 return $self->new(grep { $_->$cb(@_) } @$self);
47 join $_[1] // '', map {"$_"} @{$_[0]};
50 sub last { shift->[-1] }
53 my ($self, $cb) = (shift, shift);
54 return $self->new(map { $_->$cb(@_) } @$self);
60 goto &List::Util::reduce;
63 sub reverse { $_[0]->new(reverse @{$_[0]}) }
65 sub shuffle { $_[0]->new(List::Util::shuffle @{$_[0]}) }
67 sub size { scalar @{$_[0]} }
71 return $self->new(@$self[@_]);
77 return $self->new(sort @$self) unless $cb;
82 local (*{"${caller}::a"}, *{"${caller}::b"}) = (\$a, \$b);
85 return $self->new(@sorted);
89 my ($self, $cb) = (shift, shift);
90 $_->$cb(@_) for $self;
94 sub to_array { [@{shift()}] }
97 my ($self, $cb) = (shift, shift);
99 return $self->new(grep { !$seen{$_->$cb(@_)}++ } @$self) if $cb;
100 return $self->new(grep { !$seen{$_}++ } @$self);
104 map { _ref($_) ? _flatten(@$_) : $_ } @_;
107 sub _ref { ref $_[0] eq 'ARRAY' || blessed $_[0] && $_[0]->isa(__PACKAGE__) }
111 =for Pod::Coverage *EVERYTHING*