3 package Data::Stream::Bulk::Path::Class;
9 use namespace::clean -except => 'meta';
11 with qw(Data::Stream::Bulk);
14 isa => "Path::Class::Dir",
39 default => sub { [] },
48 return [ $self->dir ],
55 @{ $self->_stack } == 0
57 @{ $self->_queue } == 0
64 my $queue = $self->_queue;
65 my $stack = $self->_stack;
67 my $depth_first = $self->depth_first;
68 my $only_files = $self->only_files;
69 my $chunk_size = $self->chunk_size;
74 outer: while ( @$stack ) {
75 my $frame = $stack->[-1];
77 my ( $dh, $parent ) = @$frame;
79 while ( defined(my $entry = $dh->read) ) {
80 next if $entry eq '.' || $entry eq '..';
82 my $path = $parent->file($entry);
85 my $dir = $parent->subdir($entry);
88 unshift @$queue, $dir;
96 return \@ret if @ret >= $chunk_size;
100 # we're done reading this dir
105 my $dir = shift @$queue;
106 my $dh = $dir->open || croak("Can't open directory $dir: $!");
108 if ( $depth_first ) {
109 push @$stack, [ $dh, $dir ];
111 unshift @$stack, [ $dh, $dir ];
114 unless ( $only_files ) {
116 return \@ret if @ret >= $chunk_size;
128 __PACKAGE__->meta->make_immutable;
138 Data::Stream::Bulk::Path::Class - L<Path::Class::Dir> traversal
142 use Data::Stream::Bulk::Path::Class;
144 my $dir = Data::Stream::Bulk::Path::Class->new(
145 dir => Path::Class::Dir->new( ... ),
150 This stream produces depth or breadth first traversal order recursion through
151 L<Path::Class::Dir> objects.
153 Items are read iteratively, and a stack of open directory handles is used to
166 Chooses between depth first and breadth first traversal order.
170 If true only L<Path::Class::File> items will be returned in the output streams
181 Returns true when no more files are left to iterate.
185 Returns the next chunk of L<Path::Class> objects