use v6.d; unit module MaildirIndexer::ScanDir; sub scan-dir(IO() $path --> Supply) is export { supply { my %watched-dirs; sub add-dir(IO::Path $dir, :$initial) { %watched-dirs{$dir} = True; CATCH { when X::IO::Dir { }; default { warn $_ } } whenever $dir.watch { my $path-io = .path.IO; emit $path-io; when $path-io.e && $path-io.d { add-dir($path-io) unless %watched-dirs{$path-io}; } when !$path-io.e { %watched-dirs{$path-io}:delete } } for $dir.dir { emit $_; when .e && .d { add-dir($_); } } } add-dir($path); } }