diff options
Diffstat (limited to 'lib/ScanDir.rakumod')
-rw-r--r-- | lib/ScanDir.rakumod | 58 |
1 files changed, 0 insertions, 58 deletions
diff --git a/lib/ScanDir.rakumod b/lib/ScanDir.rakumod deleted file mode 100644 index 0f33a8b..0000000 --- a/lib/ScanDir.rakumod +++ /dev/null @@ -1,58 +0,0 @@ -use v6.d; -unit module ScanDir; - -class End {}; - -sub scan-dir(*@paths --> Supply) is export { - my $s = supply { - my %watched-dirs; - - CATCH { when X::IO { }; default { warn $_ } } - - sub start-watching(IO::Path $dir) { - return unless $dir ~~ :e; - return if %watched-dirs{$dir.Str}; - %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(*@todo) { - while @todo { - my $next = @todo.shift; - - next unless $next ~~ :e & :r & :d; - start-watching($next); - - for $next.dir { - emit $_; - when .e && .d { - @todo.push($_); - start-watching($_); - } - } - } - - } - - add-dir(@paths».IO); - emit End; - }; - - # let's not return multiple events for the same path too quickly, - # otherwise the consumer will get overwhelmed when (for example) a - # large file is being written - return $s.unique( - with => sub { $^a !~~ End && $^b !~~ End && $^a eq $^b }, - expires => 0.1, - ); -} |