summaryrefslogtreecommitdiff
path: root/lib/Ultramarine/Model/DirScanner.pm6
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Ultramarine/Model/DirScanner.pm6')
-rw-r--r--lib/Ultramarine/Model/DirScanner.pm636
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;
+ }
+}