summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordakkar <dakkar@thenautilus.net>2017-12-23 15:22:19 +0000
committerdakkar <dakkar@thenautilus.net>2017-12-23 15:22:19 +0000
commit46a3bc64adca8fcedc5218243d3a4f11c956e49d (patch)
tree20614aff4ea16f071af51a29cec0ba4d90df2a6c
parentminimal db model (diff)
downloadUltramarine-46a3bc64adca8fcedc5218243d3a4f11c956e49d.tar.gz
Ultramarine-46a3bc64adca8fcedc5218243d3a4f11c956e49d.tar.bz2
Ultramarine-46a3bc64adca8fcedc5218243d3a4f11c956e49d.zip
simple dir scanner
-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;
+ }
+}