diff options
Diffstat (limited to 'lib/MaildirIndexer/ScanDir.rakumod')
-rw-r--r-- | lib/MaildirIndexer/ScanDir.rakumod | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/lib/MaildirIndexer/ScanDir.rakumod b/lib/MaildirIndexer/ScanDir.rakumod new file mode 100644 index 0000000..b21fd81 --- /dev/null +++ b/lib/MaildirIndexer/ScanDir.rakumod @@ -0,0 +1,34 @@ +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); + } +} |