diff options
| author | Jan Krňávek <Jan.Krnavek@gmail.com> | 2023-03-26 20:14:57 +0200 |
|---|---|---|
| committer | Jan Krňávek <Jan.Krnavek@gmail.com> | 2023-03-26 20:14:57 +0200 |
| commit | a9c3c64ac9aa05dd9f5ebfd19ef3f89b4c50467b (patch) | |
| tree | 296ae672ef1b11ad80f1e7e626554967061bf71f | |
| parent | e654b9a8e0b8cb51c472c474d80c9b71affb892a (diff) | |
| download | perlweeklychallenge-club-a9c3c64ac9aa05dd9f5ebfd19ef3f89b4c50467b.tar.gz perlweeklychallenge-club-a9c3c64ac9aa05dd9f5ebfd19ef3f89b4c50467b.tar.bz2 perlweeklychallenge-club-a9c3c64ac9aa05dd9f5ebfd19ef3f89b4c50467b.zip | |
solution week 209-2 -- with class
| -rw-r--r-- | challenge-209/wambash/raku/ch-2.raku | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/challenge-209/wambash/raku/ch-2.raku b/challenge-209/wambash/raku/ch-2.raku new file mode 100644 index 0000000000..719d9bdc6d --- /dev/null +++ b/challenge-209/wambash/raku/ch-2.raku @@ -0,0 +1,63 @@ +#!/usr/bin/env raku + +class Account { + has $.name; + has Set() $.email; + + multi method COERCE (+@ (Str $name, +@email)) { + Account.new: :$name, :@email + } + + multi method List { + $!name, |$!email.keys.sort + } +} + + +multi join-account (+@acc) {samewith @acc} +multi join-account (Array[Account()]() \acc) { + Account.new: name => acc.head.name, email => [(|)] acc».email; +} + +sub merge-account-reducer ( @accounts, $email) { + @accounts + andthen .classify: { $email ∈ .email }\ + andthen |.{False}, join-account |.{True} +} + +multi merge-account (+@acc) {samewith @acc} +multi merge-account (Array[Account()]() \accounts) { + my @email = ([∪] accounts.map( *.email)).keys; + + accounts, |@email + andthen .reduce: &merge-account-reducer +} + +multi MAIN (Bool :test($)!) { + use Test; + is-deeply Account('A', 'a1@a.com', 'a2@a.com').email, <a1@a.com a2@a.com>.Set; + is Account(<B b@b.com>).name, 'B'; + is-deeply join-account( + <A a1@a.com a2@a.com>, <B b1@b.com>, <A a3@a.com a1@a.com> + ).email, <a1@a.com a2@a.com b1@b.com a3@a.com>.Set; + is-deeply join-account( + <A a1@a.com a2@a.com>, <B b1@b.com>, <A a3@a.com a1@a.com> + ).name, 'A'; + is-deeply merge-account-reducer( + Array[Account()](<A a1@a.com a2@a.com>, <B b1@b.com>, <A a3@a.com a1@a.com>), + 'a1@a.com' + )».email, (<b1@b.com>.Set, <a1@a.com a2@a.com a3@a.com>.Set) ; + is-deeply merge-account( <A a1@a.com a2@a.com>, <B b1@b.com>, <A a3@a.com a1@a.com> ).sort(*.name).head.email, + <a1@a.com a2@a.com a3@a.com>.Set; + is merge-account( <A a1@a.com a2@a.com>, <B b1@b.com>, <A a3@a.com a1@a.com> )».List.sort, + (<A a1@a.com a2@a.com a3@a.com>, <B b1@b.com>); + is merge-account( <A a1@a.com a2@a.com>, <B b1@b.com b2@b.com>, <A a3@a.com > )».List.sort, + (<A a1@a.com a2@a.com>, <A a3@a.com>, <B b1@b.com b2@b.com>); + is merge-account( <A a1@a.com a2@a.com>, <B b1@b.com b2@b.com>, <A a3@a.com >, <A a4@a.com a1@a.com> )».List.sort, + (<A a1@a.com a2@a.com a4@a.com>, <A a3@a.com>, <B b1@b.com b2@b.com>); + done-testing; +} + +multi MAIN (@account) { + say merge-account @account +} |
