Курс Raku / Функційне, конкурентне, реактивне та веб-програмування / Реактивне програмування / react і whenever / Вправи / Два whenever

Розв’язання: Два whenever

Ось одне з можливих розв’язань задачі.

Код

my $deposits    = Supply.from-list(100, 50, 200);
my $withdrawals = Supply.from-list(30, 120);

my $balance = 0;

react {
    whenever $deposits    { $balance += $_ }
    whenever $withdrawals { $balance -= $_ }
}

say $balance;

🦋 Знайдіть програму у файлі two-whenevers.raku.

Вивід

200

Коментарі

  1. Два блоки whenever стежать за двома іменованими потоками й реагують по-різному: надходження додаються, зняття віднімаються. Один блок react, два струмені, дві виразно різні реакції — саме заради цього й тримають по whenever на джерело.

  2. Блок react завершується лише тоді, коли завершаться обидва потоки, тож баланс остаточний ще до друку: 100 + 50 + 200 - 30 - 120 дає 200. Оскільки додавання й віднімання комутують, переплетення двох струменів на результат не впливає.

  3. Тут обидва потоки віддають свої значення миттєво, один струмінь за одним. У житті події банківського рахунку надходять розтягнутими в часі — надходження зараз, зняття за годину, — і два струмені сплітаються, як у демонстрації Два таймери. Код при цьому лишається точно таким самим: блок react виконує те тіло whenever, що відповідає кожній події в міру її надходження.

Навігація курсом

Два whenever   |   await