diff options
author | dakkar <dakkar@thenautilus.net> | 2017-12-23 15:22:19 +0000 |
---|---|---|
committer | dakkar <dakkar@thenautilus.net> | 2017-12-23 15:22:19 +0000 |
commit | 46a3bc64adca8fcedc5218243d3a4f11c956e49d (patch) | |
tree | 20614aff4ea16f071af51a29cec0ba4d90df2a6c | |
parent | minimal db model (diff) | |
download | Ultramarine-46a3bc64adca8fcedc5218243d3a4f11c956e49d.tar.gz Ultramarine-46a3bc64adca8fcedc5218243d3a4f11c956e49d.tar.bz2 Ultramarine-46a3bc64adca8fcedc5218243d3a4f11c956e49d.zip |
simple dir scanner
-rw-r--r-- | lib/Ultramarine/Model/DirScanner.pm6 | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/Ultramarine/Model/DirScanner.pm6 b/lib/Ultramarine/Model/DirScanner.pm6 new file mode 100644 index 0000000..71fe79c --- /dev/null +++ b/lib/Ultramarine/Model/DirScanner.pm6 @@ -0,0 +1,36 @@ +use v6.d.PREVIEW; + +class Ultramarine::Model::DirScanner { + has IO $.root is required; + submethod BUILD(IO() :$!root) {} + + class EndOfScan {} + + method scan(--> Supply) { + my $ret = Supplier::Preserving.new; + + my sub inner-scan(IO() $path) { + my @todo = $path; + while @todo { + my $next = @todo.pop; + $ret.emit($next); + next unless $next ~~ :d & :r & :x; + $next.watch().tap({ inner-scan($^event.path) }); + for $next.dir -> $child { + @todo.push($child); + } + CATCH { + when X::IO::Dir { } + } + } + } + + start { + inner-scan($.root); + $ret.emit(EndOfScan.new()); + } + + CATCH { $ret.quit($_) }; + return $ret.Supply; + } +} |