From 46a3bc64adca8fcedc5218243d3a4f11c956e49d Mon Sep 17 00:00:00 2001 From: dakkar Date: Sat, 23 Dec 2017 15:22:19 +0000 Subject: simple dir scanner --- lib/Ultramarine/Model/DirScanner.pm6 | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 lib/Ultramarine/Model/DirScanner.pm6 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; + } +} -- cgit v1.2.3