Skip to content

Instantly share code, notes, and snippets.

@moritz
Last active August 29, 2015 13:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save moritz/9293475 to your computer and use it in GitHub Desktop.
Save moritz/9293475 to your computer and use it in GitHub Desktop.
recursive file traversal, in parallel!
#!./perl6-j
use v6;
sub MAIN($path = '.') {
my $counter = 0;
my $callback = sub ($file) {
$counter++;
# say $counter, "\t", $file.Str;
};
walk $path, $callback;
say $counter;
}
sub walk($dir, &callback) {
my $dirs = Channel.new;
my $files = Channel.new;
my $reader = start {
callback($_) for $files.list;
1;
};
$dirs.send($dir);
my @file-readers;
loop {
my $f = $dirs.poll;
unless ($f) {
say "Got no element";
@file-readers = @file-readers.grep: { .status ~~ Planned };
if @file-readers {
winner @file-readers { done * { } };
next;
}
else {
$f = $dirs.poll;
unless $f {
$dirs.close;
last;
}
}
}
@file-readers.push: start {
for dir($f) -> $path {
if $path.d {
$dirs.send: $path;
}
else {
$files.send: $path;
}
}
}
}
$files.close;
await $reader;
}
# vim: ft=perl6
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment