# -*- 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); } }