1 package DOM::Tiny::_Collection;
7 use Scalar::Util 'blessed';
9 our $VERSION = '0.001';
11 =for Pod::Coverage *EVERYTHING*
17 return bless [@_], ref $class || $class;
20 sub TO_JSON { [@{shift()}] }
24 return $self->new(grep { defined && (ref || length) } @$self);
29 return @$self unless $cb;
31 $_->$cb($i++) for @$self;
36 my ($self, $cb) = (shift, shift);
37 return $self->[0] unless $cb;
38 return List::Util::first { $_ =~ $cb } @$self if ref $cb eq 'Regexp';
39 return List::Util::first { $_->$cb(@_) } @$self;
42 sub flatten { $_[0]->new(_flatten(@{$_[0]})) }
45 my ($self, $cb) = (shift, shift);
46 return $self->new(grep { $_ =~ $cb } @$self) if ref $cb eq 'Regexp';
47 return $self->new(grep { $_->$cb(@_) } @$self);
51 join $_[1] // '', map {"$_"} @{$_[0]};
54 sub last { shift->[-1] }
57 my ($self, $cb) = (shift, shift);
58 return $self->new(map { $_->$cb(@_) } @$self);
64 goto &List::Util::reduce;
67 sub reverse { $_[0]->new(reverse @{$_[0]}) }
69 sub shuffle { $_[0]->new(List::Util::shuffle @{$_[0]}) }
71 sub size { scalar @{$_[0]} }
75 return $self->new(@$self[@_]);
81 return $self->new(sort @$self) unless $cb;
86 local (*{"${caller}::a"}, *{"${caller}::b"}) = (\$a, \$b);
89 return $self->new(@sorted);
93 my ($self, $cb) = (shift, shift);
94 $_->$cb(@_) for $self;
98 sub to_array { [@{shift()}] }
101 my ($self, $cb) = (shift, shift);
103 return $self->new(grep { !$seen{$_->$cb(@_)}++ } @$self) if $cb;
104 return $self->new(grep { !$seen{$_}++ } @$self);
108 map { _ref($_) ? _flatten(@$_) : $_ } @_;
111 sub _ref { ref $_[0] eq 'ARRAY' || blessed $_[0] && $_[0]->isa(__PACKAGE__) }