Курс языка программирования Raku / Функциональное, конкурентное, реактивное и веб-программирование / Реактивное программирование / react и whenever / Exercises / Два 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 следят за двумя именованными supply и реагируют по-разному: поступления прибавляются, списания вычитаются. Один блок react, два потока, две различные реакции — ради этого и заводят по whenever на источник.

  2. Блок react завершается лишь тогда, когда закончатся оба supply, поэтому к моменту печати баланс уже окончательный: 100 + 50 + 200 - 30 - 120 даёт 200. Поскольку сложение и вычитание перестановочны, чередование двух потоков на результат не влияет.

  3. Здесь оба supply выдают свои значения мгновенно, один поток за другим. В жизни события банковского счёта приходят растянутыми во времени — поступление сейчас, списание через час, — и два потока переплетаются, как в примере Два таймера. Код при этом остаётся ровно тем же: блок react выполняет то тело whenever, которое соответствует очередному пришедшему событию.

Навигация по курсу

Два whenever   |   await