use v6.d;
unit module MaildirIndexer::ScanDir;
class End {};
sub scan-dir(@paths --> Supply) is export {
supply {
my %watched-dirs;
CATCH { when X::IO { }; default { warn $_; done } }
sub start-watching(IO::Path $dir) {
%watched-dirs{$dir.Str} = True;
whenever $dir.watch {
my $path-io = .path.IO;
emit $path-io;
when $path-io ~~ :e & :d {
add-dir($path-io) unless %watched-dirs{$path-io.Str};
}
when $path-io ~~ :!e {
%watched-dirs{$path-io.Str}:delete
}
}
}
sub add-dir(IO::Path @dirs) {
my (@todo) = @dirs;
while @todo {
my $next = @todo.shift;
emit $next;
next unless $next ~~ :e & :r & :d;
start-watching($next);
for $next.dir {
emit $_;
when .e && .d {
@todo.push($_);
start-watching($_);
}
}
}
}
add-dir(Array[IO::Path].new(@paths».IO));
emit End;
}
}