aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Krňávek <Jan.Krnavek@gmail.com>2023-03-26 20:14:57 +0200
committerJan Krňávek <Jan.Krnavek@gmail.com>2023-03-26 20:14:57 +0200
commita9c3c64ac9aa05dd9f5ebfd19ef3f89b4c50467b (patch)
tree296ae672ef1b11ad80f1e7e626554967061bf71f
parente654b9a8e0b8cb51c472c474d80c9b71affb892a (diff)
downloadperlweeklychallenge-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.raku63
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
+}