From c06e044e51ffd1453b084e8416b0efcfe32d2177 Mon Sep 17 00:00:00 2001 From: "Markus \"Holli\" Holzer" Date: Sat, 30 May 2020 17:02:08 +0200 Subject: initial --- challenge-062/markus-holzer/raku/ch-1.raku | 43 ++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 challenge-062/markus-holzer/raku/ch-1.raku 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 -- cgit From 16a29792862341dec8cc0268e65c19a42ea4675f Mon Sep 17 00:00:00 2001 From: "Markus \"Holli\" Holzer" Date: Sat, 30 May 2020 22:16:34 +0200 Subject: final --- challenge-062/markus-holzer/raku/ch-1.raku | 81 ++++++++++++++++++------------ 1 file changed, 48 insertions(+), 33 deletions(-) diff --git a/challenge-062/markus-holzer/raku/ch-1.raku b/challenge-062/markus-holzer/raku/ch-1.raku index 550eecea7d..a2207abf11 100644 --- a/challenge-062/markus-holzer/raku/ch-1.raku +++ b/challenge-062/markus-holzer/raku/ch-1.raku @@ -1,43 +1,58 @@ +# This should really follow the spec or use something from CPAN 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; - } + has Str $.address; + has Str $.domain; + has Str $.mailbox; + has Str $.norm; + has Bool $.valid; + + method Str { $!address } + + submethod TWEAK( :$!address ) + { + my $index = $!address.index: '@'; + return unless $index && 0 < $index < $!address.chars - 1; + + $!mailbox = $!address.substr: 0, $index; + $!domain = lc $!address.substr: $index + 1, *; + $!norm = $!mailbox ~ '@' ~ $!domain; + $!valid = True; + } +} - method gist() { - $.norm } +subset FileIsReadable where { .IO.f && .IO.e && .IO.r } +subset FilesAreReadable where { .all ~~ FileIsReadable } - method Str() { - $.adress } -} +#| read from files +multi sub MAIN( + Bool :$u, #= unique. filters duplicates + *@files where FilesAreReadable #= files containing email addresses, 1 per line +) { + output-email-addresses $u, sort-mail-addresses @files.map: *.IO.open( :r ) } -multi sub MAIN( :$u ) { - output-email-adresses $u, sort-mail-adresses $*IN } +#| read from STDIN +multi sub MAIN( Bool :$u ) { + output-email-addresses $u, sort-mail-addresses $*IN } -multi sub MAIN( :$u, *@args ) { - output-email-adresses $u, sort-mail-adresses @args.map: *.IO.open( :r ) } +# catch bad arguments +multi sub MAIN( Bool :$u?, *@bad ) is hidden-from-USAGE { + $*USAGE.say } -sub output-email-adresses( $unique, @things ) { - .Str.say for $unique ?? @things.unique( :as( *.norm ) ) !! @things } +sub output-email-addresses( $unique, @addresses ) { + .address.say for $unique + ?? @addresses.squish( as => *.norm ) + !! @addresses } -sub sort-mail-adresses( *@handles ) +multi sub sort-mail-addresses( $handles where { .cache.all ~~ IO::Handle } ) { - 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 ) + my &address = -> $address { Mail.new( :$address ) } + my &valid = -> $mail { $mail.valid || $*ERR.say("Bad data <$mail>") && False } + my &sort = -> $a, $b { $a.domain cmp $b.domain || $a.mailbox cmp $b.mailbox } + + $handles + .map( | *.lines ) + .map( &address ) + .grep( &valid ) + .sort( &sort ) } \ No newline at end of file -- cgit From 95e2a06fb6f8fd4e919abbfe976a38c18a4ecc6c Mon Sep 17 00:00:00 2001 From: "Markus \"Holli\" Holzer" Date: Sat, 30 May 2020 22:23:52 +0200 Subject: final --- challenge-062/markus-holzer/raku/ch-1.raku | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/challenge-062/markus-holzer/raku/ch-1.raku b/challenge-062/markus-holzer/raku/ch-1.raku index a2207abf11..5e209b1e0a 100644 --- a/challenge-062/markus-holzer/raku/ch-1.raku +++ b/challenge-062/markus-holzer/raku/ch-1.raku @@ -36,7 +36,7 @@ multi sub MAIN( Bool :$u ) { output-email-addresses $u, sort-mail-addresses $*IN } # catch bad arguments -multi sub MAIN( Bool :$u?, *@bad ) is hidden-from-USAGE { +multi sub MAIN( Bool :$u, *@bad ) is hidden-from-USAGE { $*USAGE.say } sub output-email-addresses( $unique, @addresses ) { -- cgit From 8f6f95c4e9691ce1dddb7ae545609a661b7b9e20 Mon Sep 17 00:00:00 2001 From: "Markus \"Holli\" Holzer" Date: Sat, 30 May 2020 22:25:12 +0200 Subject: final --- challenge-062/markus-holzer/raku/ch-1.raku | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/challenge-062/markus-holzer/raku/ch-1.raku b/challenge-062/markus-holzer/raku/ch-1.raku index 5e209b1e0a..5a1e178e39 100644 --- a/challenge-062/markus-holzer/raku/ch-1.raku +++ b/challenge-062/markus-holzer/raku/ch-1.raku @@ -36,7 +36,7 @@ multi sub MAIN( Bool :$u ) { output-email-addresses $u, sort-mail-addresses $*IN } # catch bad arguments -multi sub MAIN( Bool :$u, *@bad ) is hidden-from-USAGE { +multi sub MAIN( Bool :$u, *@ ) is hidden-from-USAGE { $*USAGE.say } sub output-email-addresses( $unique, @addresses ) { -- cgit From 5feccc2ea3859be3483c12f399bc375a7c2e7884 Mon Sep 17 00:00:00 2001 From: "Markus \"Holli\" Holzer" Date: Sat, 30 May 2020 22:48:31 +0200 Subject: really final --- challenge-062/markus-holzer/raku/ch-1.raku | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/challenge-062/markus-holzer/raku/ch-1.raku b/challenge-062/markus-holzer/raku/ch-1.raku index 5a1e178e39..098d35f0d0 100644 --- a/challenge-062/markus-holzer/raku/ch-1.raku +++ b/challenge-062/markus-holzer/raku/ch-1.raku @@ -44,15 +44,19 @@ sub output-email-addresses( $unique, @addresses ) { ?? @addresses.squish( as => *.norm ) !! @addresses } -multi sub sort-mail-addresses( $handles where { .cache.all ~~ IO::Handle } ) -{ - my &address = -> $address { Mail.new( :$address ) } - my &valid = -> $mail { $mail.valid || $*ERR.say("Bad data <$mail>") && False } - my &sort = -> $a, $b { $a.domain cmp $b.domain || $a.mailbox cmp $b.mailbox } - +multi sub sort-mail-addresses( $handles where { .cache.all ~~ IO::Handle } ) { $handles .map( | *.lines ) - .map( &address ) - .grep( &valid ) - .sort( &sort ) -} \ No newline at end of file + .map( &make-mail ) + .grep( &valid-mail ) + .sort( &sort-mail ) } + +sub make-mail( $address ) { + Mail.new( :$address ) } + +sub valid-mail( $mail ) { + $mail.valid || + $*ERR.say("Bad data <$mail>") && False } + +sub sort-mail( $a, $b ) { + $a.domain cmp $b.domain || $a.mailbox cmp $b.mailbox } -- cgit