diff options
| -rw-r--r-- | challenge-062/markus-holzer/raku/ch-1.raku | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/challenge-062/markus-holzer/raku/ch-1.raku b/challenge-062/markus-holzer/raku/ch-1.raku new file mode 100644 index 0000000000..550eecea7d --- /dev/null +++ b/challenge-062/markus-holzer/raku/ch-1.raku @@ -0,0 +1,43 @@ +class Mail +{ + has Str $.adress; + has Str $.domain; + has Str $.mailbox; + has Str $.norm; + + submethod TWEAK( :$!adress ) + { + my $index = $!adress.index: '@'; + + $!mailbox = $!adress.substr( 0, $index ); + $!domain = $!adress.substr( $index + 1, * ).lc; + $!norm = $!mailbox ~ '@' ~ $!domain; + } + + method gist() { + $.norm } + + method Str() { + $.adress } +} + +multi sub MAIN( :$u ) { + output-email-adresses $u, sort-mail-adresses $*IN } + +multi sub MAIN( :$u, *@args ) { + output-email-adresses $u, sort-mail-adresses @args.map: *.IO.open( :r ) } + +sub output-email-adresses( $unique, @things ) { + .Str.say for $unique ?? @things.unique( :as( *.norm ) ) !! @things } + +sub sort-mail-adresses( *@handles ) +{ + my &adress = -> $adress { Mail.new( :$adress ) }; + my &sort = -> $a, $b { $a.domain cmp $b.domain || $a.mailbox cmp $b.mailbox }; + + @handles + .map( *.lines ) + .flat + .map( &adress ) + .sort( &sort ) +}
\ No newline at end of file |
