summaryrefslogtreecommitdiff
path: root/lib/WebCoso/FileSet.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/WebCoso/FileSet.pm')
-rw-r--r--lib/WebCoso/FileSet.pm115
1 files changed, 115 insertions, 0 deletions
diff --git a/lib/WebCoso/FileSet.pm b/lib/WebCoso/FileSet.pm
new file mode 100644
index 0000000..958a649
--- /dev/null
+++ b/lib/WebCoso/FileSet.pm
@@ -0,0 +1,115 @@
+# -*- mode: perl6 -*-
+use WebCoso::File;
+
+class WebCoso::FileSet {
+ has %.files;
+
+ multi method new($self: :$path!, :$basename!, :$ext!) {
+ my @filenames = try {
+ CATCH { when X::IO { } }
+ $path.IO.dir(
+ test => /$basename \. .+? \. $ext/,
+ )
+ } // ();
+ my %files = map {
+ my $lang = (.basename ~~ /$basename \. (.+?) \. $ext/)[0].Str;
+ $lang => WebCoso::File.new(:$lang,path=>$_)
+ }, @filenames;
+ $self.bless(:%files);
+ }
+
+ multi method new($self: :@files!) {
+ $self.bless(files=>{}).merged-with(@files);
+ }
+ multi method new($self: :%files-hash!) {
+ $self.bless(files=>{}).merged-with(%files-hash);
+ }
+ multi method new($self: :%files!) {
+ $self.bless(files=>%files);
+ }
+
+ submethod BUILD(:%!files) {}
+
+ method langs() {
+ return %!files.keys;
+ }
+
+ method files() {
+ return %!files.values;
+ }
+ method export-hash() {
+ my %ret;
+ for $.langs -> $lang {
+ my $f = $.for-lang($lang);
+ if ($f.does(Iterable)) {
+ %ret{$lang} = $f.list».path».Str;
+ }
+ else {
+ %ret{$lang} = $f.path.Str;
+ }
+ }
+ return %ret;
+ }
+
+ method for-lang($lang) {
+ return %!files{$lang} // ();
+ }
+
+ multi method set-for-lang($lang,WebCoso::File @files) {
+ return %!files{$lang} = @files;
+ }
+ multi method set-for-lang($lang,WebCoso::File $file) {
+ return %!files{$lang} = $file;
+ }
+
+ multi method set-for-lang($lang,@files) {
+ return %!files{$lang} = map {
+ $_.isa(WebCoso::File) ?? $_ !! WebCoso::File.new($_)
+ },@files;
+ }
+ multi method set-for-lang($lang,$file) {
+ return %!files{$lang} = WebCoso::File.new($file);
+ }
+
+ multi method merged-with(Any:U $) { return self }
+ multi method merged-with(% where !*) { return self }
+ multi method merged-with(@ where !*) { return self }
+
+ multi method merged-with(WebCoso::File %b where *) {
+ my %new-files = %!files;
+ %new-files{$_} = %b{$_} for %b.keys;
+ return self.new(
+ files => %new-files,
+ );
+ }
+ multi method merged-with(%b where *) {
+ my WebCoso::File %files = map {
+ my $lang = $_;
+ my $v = %b{$_};
+ $lang => (
+ $v.isa(WebCoso::File)
+ ?? $v
+ !! $v.does(Iterable)
+ ?? [ map { WebCoso::File.new(:$lang,path=>$_) },$v ]
+ !! WebCoso::File.new(:$lang,path=>$v)
+ )
+ },%b.keys;
+ return self.merged-with(%files);
+ }
+ multi method merged-with(WebCoso::File @b where *) {
+ self.merged-with(
+ %(map { $_.lang => $_ },@b),
+ );
+ }
+ multi method merged-with(@b where *) {
+ my WebCoso::File %files = map {
+ $_.isa(WebCoso::File)
+ ?? (($_.lang//'') => $_)
+ !! ('' => WebCoso::File.new(path=>$_))
+ },@b;
+ self.merged-with(%files);
+ }
+ multi method merged-with(WebCoso::FileSet:D $b) {
+ self.merged-with($b.files);
+ }
+}