раздел 46

Effect: Тихая Академия

Курс для миддла на TypeScript, который пишет на async/await каждый день. Ты скорописец из городской конторы Анкмора: твой код уронил сигнальную башню, а в журнале пусто. Тихая Академия учит обратному городской магии: сначала записать заклинание целиком, потом произносить. Начинаешь с теории типов TypeScript и функционального программирования с нуля, собираешь свой маленький эффект-рантайм и только потом открываешь Effect: типизированные ошибки, сервисы и слои, ресурсы, файберы, расписания, Schema, стримы, HTTP, трассы и кластер. По дороге разбираешься, почему Семафорная Магистраль теряет сообщения и кто прячет её ошибки. Задачи и проверка типов идут прямо в браузере.

120 уроков120 тем · 17 кластеров

Начать раздел
Хочу пройти

Раздел открыт для всех. Войди, чтобы отмечать пройденные уроки, вести заметки и решать задачи в редакторе. войти

Мастерская: Шифр Магистрали

этапов 0 из 11

Мастерская: Котёл Матушки

этапов 0 из 13

Мастерская: Свой Гекс

этапов 0 из 6

Мастерская: Башня на Effect

этапов 0 из 39

  1. Квитанцииэтап не сдан
  2. Кадр целикомэтап не сдан
  3. Обработчик с именемэтап не сдан
  4. Ошибки делаэтап не сдан
  5. То, чего быть не можетэтап не сдан
  6. Итог словамиэтап не сдан
  7. Книга башенэтап не сдан
  8. Ответ по тегуэтап не сдан
  9. Дублиэтап не сдан
  10. Старый проводэтап не сдан
  11. Заказ: ночь целикомэтап не сдан
  1. Провод из контекстаэтап не сдан
  2. Слой как фабрикаэтап не сдан
  3. Один журнал на всехэтап не сдан
  4. Своя сменаэтап не сдан
  5. Позывной и печатьэтап не сдан
  6. Имя сменыэтап не сдан
  7. Дублёрыэтап не сдан
  8. Заказ: башня из слоёвэтап не сдан
  1. Что открыл, то закройэтап не сдан
  2. Линия в слоеэтап не сдан
  3. Не посерединеэтап не сдан
  4. Край и сигналэтап не сдан
  5. Линии к соседямэтап не сдан
  6. Заказ: башня не течётэтап не сдан
  1. Пульс в фонеэтап не сдан
  2. Чьи это детиэтап не сдан
  3. Много сразуэтап не сдан
  4. Кто первыйэтап не сдан
  5. Общий счётэтап не сдан
  6. Ворота и первый ответэтап не сдан
  7. Не больше трёхэтап не сдан
  8. Приёмник и объявленияэтап не сдан
  9. Квота строкэтап не сдан
  10. Заказ: сто соседей сразуэтап не сдан
  1. Расписаниеэтап не сдан
  2. Что стоит повторятьэтап не сдан
  3. По чьим часамэтап не сдан
  4. Заказ: башня, которая чинит себя самаэтап не сдан

Мастерская: Протокол Магистрали

этапов 0 из 14

Мастерская: Почтамт

этапов 0 из 12

Мастерская: Линия башен

этапов 0 из 9

Уроки раздела

Скорописец: зачем всё это

  1. Башня, которая молчитM~35 мин
  2. Слепота к несчастливому путиM~35 мин
  3. Описание против исполненияM~25 мин
  4. Как читать «Ук»M~25 мин

Библиотека: типы, чтобы читать Effect

Изделие «Шифр Магистрали», крейт shifr

  1. Типы как множестваM~30 мин
  2. СужениеM~30 мин
  3. Размеченные объединенияM~30 мин
  4. ДженерикиM~25 мин
  5. Чтение сигнатурM~30 мин
  6. keyof и отображённые типыM~25 мин
  7. Условные типы и inferMS~30 мин
  8. Шаблонные литеральные типыM~25 мин
  9. ВариантностьMS~35 мин
  10. Номинальность и брендыM~30 мин
  11. Тесты на типыMS~30 мин
  12. Босс: протокол семафораMS~80 мин

Головология: ФП с нуля

Изделие «Котёл Матушки», крейт kotel

  1. Действия, вычисления, данныеM~30 мин
  2. Чистые функцииM~30 мин
  3. НеизменяемостьM~30 мин
  4. Функции как значенияM~25 мин
  5. Композиция, pipe и flowM~30 мин
  6. Каррирование и двойные функцииMS~30 мин
  7. Алгебраические типыM~25 мин
  8. Option: коробка, которая может быть пустойM~25 мин
  9. Result: дорога в два путиM~30 мин
  10. Первая ошибка или все сразуM~25 мин
  11. Назвать узор: функтор и монадаMS~45 мин
  12. Генераторы: рецепт без лестницыMS~35 мин
  13. Босс: котёл МатушкиMS~80 мин

Свой Гекс: рантайм эффектов своими руками

Изделие «Свой Гекс», крейт geks

  1. Свиток на потом: свой IOM~25 мин
  2. Ошибка в типеM~25 мин
  3. Сундук: окружение RM~30 мин
  4. Цикл ГексаMS~30 мин
  5. Свиток на генератореMS~25 мин
  6. Босс: Гекс, который умеет остановитьсяMS~90 мин

Первые чары: ядро Effect

Изделие «Башня на Effect», крейт bashnya

  1. Квитанция Effect<A, E, R>M~35 мин
  2. Effect.gen и pipeM~30 мин
  3. Effect.fn: функции с именемM~30 мин
  4. Ожидаемые ошибкиM~35 мин
  5. ДефектыM~30 мин
  6. Cause и ExitMS~35 мин
  7. Option и Result внутри EffectM~35 мин
  8. Match: полное сопоставлениеM~30 мин
  9. Data и EqualM~30 мин
  10. Мост наружуM~30 мин
  11. Босс: обработчик кадров башниMS~80 мин

Сундук: сервисы и слои

Изделие «Башня на Effect», крейт bashnya

  1. СервисыM~30 мин
  2. Слой как фабрикаM~25 мин
  3. Граф слоёвM~25 мин
  4. Сколько раз построен слойMS~20 мин
  5. Конфигурация и RedactedM~20 мин
  6. Ссылки со значением по умолчаниюM~20 мин
  7. Тестовые слои и дублёрыMS~20 мин
  8. Босс: башня из слоёвMS~80 мин

Смерть приходит вовремя: ресурсы и прерывание

Изделие «Башня на Effect», крейт bashnya

  1. Scope и финализаторыM~25 мин
  2. Ресурс в слоеM~20 мин
  3. ПрерываниеMS~15 мин
  4. Край программы: runMain и ManagedRuntimeMS~20 мин
  5. Общие ресурсы: RcMap, RcRef и PoolMS~25 мин
  6. Босс: башня не течётMS~70 мин

Муравейник: файберы и координация

Изделие «Башня на Effect», крейт bashnya

  1. ФайберыM~20 мин
  2. Структурная конкурентностьMS~15 мин
  3. Много сразу: all, forEach, validate, partitionM~20 мин
  4. Гонки и времяM~20 мин
  5. Общее состояние: RefM~20 мин
  6. Ждать сигнала: Deferred и LatchMS~20 мин
  7. СемафорM~15 мин
  8. Очереди: Queue и PubSubMS~20 мин
  9. Транзакции: TxRef и Effect.txMS~20 мин
  10. Как устроены файберыMS~15 мин
  11. Босс: сто соседей сразуMS~70 мин

Часы на башне: расписания и время

Изделие «Башня на Effect», крейт bashnya

  1. РасписаниеM~25 мин
  2. Повторы: retry и repeatM~25 мин
  3. По чьим часам: Clock и TestClockM~20 мин
  4. Босс: башня, которая чинит себя самаMS~80 мин

Печати: Schema

Изделие «Протокол Магистрали», крейт magistral

  1. Разбирай, а не проверяйM~20 мин
  2. Бланк договора: Struct, Union, LiteralsM~20 мин
  3. Проверки и брендыM~20 мин
  4. Две стороны схемыMS~20 мин
  5. Классы схемM~20 мин
  6. Почему отказ: SchemaIssueM~20 мин
  7. Рекурсия и проверки с миромMS~20 мин
  8. Один договор, много копийM~20 мин
  9. Босс: две версии протоколаMS~80 мин

Магистраль: Stream

Изделие «Протокол Магистрали», крейт magistral

  1. Поток вместо массиваM~25 мин
  2. ПротиводавлениеM~25 мин
  3. Много линийMS~20 мин
  4. Мёртвые письмаM~25 мин
  5. Босс: ретрансляторMS~80 мин

Почтамт: платформа

Изделие «Почтамт», крейт pochtamt

  1. Провод к чужой книге: HttpClientM~25 мин
  2. Окошки на бумаге: HttpApiM~25 мин
  3. Окошки открыты: сервер, клиент, тест в памятиMS~30 мин
  4. Служебная линия: RPCM~20 мин
  5. Книги Почтамта: SQLMS~25 мин
  6. Подвал Почтамта: платформаM~20 мин
  7. Почтамт из терминала: effect/cliM~25 мин
  8. Босс: ПочтамтMS~80 мин

Свет в окнах: наблюдаемость

Изделие «Почтамт», крейт pochtamt

  1. Журнал для того, кто придёт ночьюM~25 мин
  2. История одного письма: трассыM~20 мин
  3. Сколько: метрикиM~25 мин
  4. Сорок башен, четыре тысячи вопросовMS~25 мин
  5. Босс: честный ПочтамтMS~80 мин

Витрина: Effect во фронтенде

  1. Табличка, которая не врёт: атомыM~20 мин
  2. Окно в лавку: атомы в ReactM~25 мин
  3. Улица: Effect в браузереM~25 мин

Башни без хозяина: распределённое

Изделие «Линия башен», крейт liniya

  1. Очередь, которая помнитM~30 мин
  2. Одно письмо за раз: акторыM~20 мин
  3. Кольцо башен: шарды и сущностиMS~20 мин
  4. Хотя бы раз: гарантии доставкиM~25 мин
  5. Ключ и outbox: двойная записьMS~20 мин
  6. Путь письма: workflowMS~20 мин
  7. Босс: линия без хозяинаMS~80 мин

Голем: модели и инструменты

  1. Свиток в голове: модель как недоверенный сервисM~30 мин
  2. Руки голема: инструменты и цикл агентаMS~25 мин
  3. Окошко для всех: свой MCP-серверM~30 мин

Мастерство: тесты, архитектура, переход

Изделие «Линия башен», крейт liniya

  1. Кто это проверил: тесты на EffectMS~25 мин
  2. Журнал без правил: архитектура и свои типыMS~30 мин
  3. Старая книга: постепенный переход на EffectMS~30 мин
  4. Записка Гилта: код v3 и инструментыM~30 мин
  5. Финальный босс: город на одном сервереS~170 мин

Понятия курса

Понятия разобраны внутри уроков. Нажми на понятие, чтобы открыть урок, где оно объясняется.

Скорописец: зачем всё это

  • Башня, которая молчитФункция башни на async/await падает молча, а журнал пуст. Что такое эффект на пальцах, чем он отличается от вызова функции, и как устроен курс: от типов и ФП к своему рантайму и Effect.урок 1 · Башня, которая молчитопираются: урок 2
  • Как читать «Ук»Ошибки TypeScript: hover, длинные ошибки снизу вверх, strict, exactOptionalPropertyTypes и noUncheckedIndexedAccess. Первый перевод с Ук.урок 4 · Как читать «Ук»опираются: урок 5
  • Описание против исполненияPromise уже летит, когда его создали, а функция без вызова ждёт. Рецепт, а не обед: ленивое описание можно повторить, отменить и проверить. Мифы про Effect: размер, скорость, «это RxJS».урок 3 · Описание против исполненияопираются: урок 4
  • Слепота к несчастливому путиcatch (e: unknown), нет отмены, таймаутов и повторов, скрытые зависимости, нет трассы. Каждое требование надёжности на голом async/await стоит строк, и код растёт быстрее пользы.урок 2 · Слепота к несчастливому путиопираются: урок 3

Библиотека: типы, чтобы читать Effect

  • ДженерикиДженерик как функция над типами: параметры, ограничения, вывод из аргументов, const-параметры типа. Каналы шифра, которые помнят тип сообщений.урок 8 · Дженерикиопираются: урок 9
  • Номинальность и брендыБренды на unique symbol, private и protected члены делают класс номинальным, коллизия _tag. Номера башен и сообщений, которые не подделать.урок 14 · Номинальность и брендыопираются: урок 15
  • Размеченные объединенияСообщения по полю _tag, разбор switch до never, absurd и проверка полноты компилятором.урок 7 · Размеченные объединенияопираются: урок 8
  • Сужениеtypeof, in, instanceof, предикаты is и asserts: как из unknown с провода получить кадр, которому можно верить.урок 6 · Сужениеопираются: урок 7
  • Типы как множестваЛитералы, объединение и пересечение, unknown как всё, never как пустое множество, присваиваемость как вложенность. Таблица кодов ставней для шифра башни.урок 5 · Типы как множестваопираются: урок 6
  • Чтение сигнатурПерегрузки, Array.map, Promise.then, перегрузки pipe и NoInfer: как прочитать чужую сигнатуру и предсказать выведенный тип.урок 9 · Чтение сигнатуропираются: урок 10
  • Шаблонные литеральные типыКоды башен `T-${number}` и маршруты в типах, infer внутри шаблона и умеренный разбор строк.урок 12 · Шаблонные литеральные типыопираются: урок 13
  • keyof и отображённые типыkeyof, индексный доступ, отображённые типы, модификаторы и переименование ключей через as. Таблица обработчиков сообщений.урок 10 · keyof и отображённые типыопираются: урок 11
  • Босс: протокол семафораПротокол башни целиком: провод, конверты, разбор с типизированными ошибками и неподделываемые номера, проверенные тестами на типы.урок 16 · Босс: протокол семафораопираются: урок 17
  • ВариантностьКто отдаёт, тот ковариантен, кто берёт, контравариантен. Почему ошибки двух задач складываются в объединение и почему never подходит куда угодно; аннотации in и out.урок 13 · Вариантностьопираются: урок 14
  • Тесты на типыexpectTypeOf, @ts-expect-error, тест «это не должно собираться» и свои Equal и Expect.урок 15 · Тесты на типыопираются: урок 16
  • Условные типы и inferУсловные типы, infer и распределение по объединению: достать A и E из своей ленивой задачи Task<A, E>. Читаем, а не сочиняем головоломки.урок 11 · Условные типы и inferопираются: урок 12

Головология: ФП с нуля

Свой Гекс: рантайм эффектов своими руками

  • Ошибка в типеIO<A, E>: свиток кончается Exit, а не исключением. Ожидаемая ошибка Fail против дефекта Die, catch и mapError, ошибки шагов складываются в объединение.урок 31 · Ошибка в типеопираются: урок 32
  • Свиток на потом: свой IOДействие как значение: IO<A> хранит, что сделать, и делает это только при запуске. succeed, sync, map, flatMap и runSync на замыканиях.урок 30 · Свиток на потом: свой IOопираются: урок 31
  • Сундук: окружение RIO<A, E, R>: свиток просит сервисы из Сундука по именам. service, provideService вычитает имя из R, запуск возможен только с пустым R. Почему R складывается объединением.урок 32 · Сундук: окружение Rопираются: урок 33
  • Босс: Гекс, который умеет остановитьсяПрерывание и финализаторы в своём рантайме: runFork, interrupt, ensuring, acquireUseRelease. Таблица соответствий своего Гекса и настоящего Effect.урок 35 · Босс: Гекс, который умеет остановитьсяопираются: урок 36
  • Свиток на генератореСвиток сам отдаётся в yield*, как в Effect 4; gen выводит ошибки и нужды всех шагов. Чем это отличается от адаптера Option.open.урок 34 · Свиток на генератореопираются: урок 35
  • Цикл ГексаСвиток деревом инструкций и цикл со стеком продолжений: сто тысяч flatMap без переполнения, асинхронность через callback, runPromise.урок 33 · Цикл Гексаопираются: урок 34

Первые чары: ядро Effect

Сундук: сервисы и слои

  • Граф слоёвСлой, которому нужен другой слой: Layer.provide, provideMerge, mergeAll. Провод и смена пишут в один журнал; Layer.satisfiesServicesType<never>() ловит забытую зависимость на типах.урок 49 · Граф слоёвопираются: урок 50
  • Конфигурация и RedactedConfig.String, Config.Redacted, orElse и withDefault; ConfigProvider.fromUnknown в тестах; сервис-строка из конфигурации и ошибка ConfigError в слое.урок 51 · Конфигурация и Redactedопираются: урок 52
  • Сервисы: что нужно, без того, где взятьContext.Service<Self, Shape>()("bashnya/Wire"), yield* в Effect.gen, Wire.of и Wire["Service"]. Зависимость уезжает из аргументов в R, а первый способ её дать это Effect.provideService.урок 47 · Сервисыопираются: урок 48
  • Слой как фабрикаLayer.succeed для готового значения, Layer.effect для сервиса со своим состоянием, Effect.provide. Соглашение layer, layerTest, layerConfig статическими полями класса сервиса.урок 48 · Слой как фабрикаопираются: урок 49
  • Ссылки со значением по умолчаниюContext.Reference вместо FiberRef из v3: значение по умолчанию, поэтому в R ссылки нет. References.CurrentLogLevel и подмена на кусок программы через provideService.урок 52 · Ссылки со значением по умолчаниюопираются: урок 53
  • Босс: башня из слоёвБашня собирается из слоёв в проде и в тесте, R пуст у обеих сборок. Позывной и ключ из конфигурации, ленивая книга, журнал один на смену.урок 54 · Босс: башня из слоёвопираются: урок 55
  • Сколько раз построен слойEffect 4 переиспользует слой, построенный внешним provide, а соседние provide строят свой. Слой в обработчике каждого кадра, { local: true } и Layer.fresh.урок 50 · Сколько раз построен слойопираются: урок 51
  • Тестовые слои и дублёрыLayer.mock, it.effect и layer(...) из @effect/vitest, TestClock; ленивый слой на Deferred, который готов сразу и ждёт данные только при первом вопросе.урок 53 · Тестовые слои и дублёрыопираются: урок 54

Смерть приходит вовремя: ресурсы и прерывание

  • Ресурс в слоеLayer.effect в Effect 4 сам даёт область: ресурс, взятый при сборке слоя, закрывается, когда слой разбирают, и узнаёт исход программы. Layer.scoped из v3 больше нет.урок 56 · Ресурс в слоеопираются: урок 57
  • Scope и финализаторыEffect.acquireRelease: взятие и возврат рядом, возврат знает Exit. Область Scope копит финализаторы и закрывает их в обратном порядке; Effect.scoped убирает Scope из R; addFinalizer.урок 55 · Scope и финализаторыопираются: урок 56
  • Босс: башня не течётНочь от сигнала до кода выхода: хорошая, с провалом открытия и с выдернутым шнуром. После каждой склад пуст, ресурсы закрыты в обратном порядке с верным исходом.урок 60 · Босс: башня не течётопираются: урок 61
  • Край программы: runMain и ManagedRuntimeКод выхода 0, 1 и 130; свой runMain из Runtime.makeRunMain, сигнал как прерывание главного файбера. ManagedRuntime собирает слой один раз для чужого сервера и закрывает по dispose.урок 58 · Край программы: runMain и ManagedRuntimeопираются: урок 59
  • Общие ресурсы: RcMap, RcRef и PoolСчётчик ссылок и время простоя: RcMap по ключу, RcRef для одного ресурса, Pool для нескольких одинаковых. Линия к соседу открывается при первой отправке и закрывается после простоя.урок 59 · Общие ресурсы: RcMap, RcRef и Poolопираются: урок 60
  • ПрерываниеПрерывание не ошибка и не дефект: Effect.catch его не ловит. uninterruptible откладывает прерывание до конца куска; onInterrupt и ensuring добавляют действие на выходе.урок 57 · Прерываниеопираются: урок 58

Муравейник: файберы и координация

  • Гонки и времяraceAll отдаёт первый успех и прерывает остальных; timeout и timeoutOption; firstSuccessOf пробует запасных по очереди. Почему Promise.race не останавливает проигравших.урок 64 · Гонки и времяопираются: урок 65
  • Много сразу: all, forEach, validate, partitionconcurrency и предел одновременности, результаты в порядке элементов, discard. validate собирает все ошибки, partition делит удачи и ошибки.урок 63 · Много сразу: all, forEach, validate, partitionопираются: урок 64
  • Общее состояние: RefПотерянное обновление между чтением и записью; Ref.update и Ref.modify одним шагом; SynchronizedRef для обновления с эффектом; SubscriptionRef с потоком изменений.урок 65 · Общее состояние: Refопираются: урок 66
  • СемафорПредел на узкое место, а не на того, кто шлёт: Semaphore и withPermits с возвратом при любом исходе. RateLimiter как предел за время, нестабильный в 4.1.урок 67 · Семафоропираются: урок 68
  • ФайберыФайбер это исполняемая квитанция: forkChild, Fiber.join, Fiber.await, Fiber.interrupt. Пульс башни в фоне, дерево файберов и прерывание вниз по дереву.урок 61 · Файберыопираются: урок 62
  • Босс: сто соседей сразуНочь, где кадры обрабатываются вперемешку и не больше предела сразу, а отчёт тот же, что по одному кадру: дубли через Seen одним шагом, судьбы собираются в порядке строк.урок 71 · Босс: сто соседей сразуопираются: урок 72
  • Ждать сигнала: Deferred и LatchОдноразовая ячейка Deferred и своя гонка на ней; ворота Latch, которые можно открыть и закрыть; свой мьютекс из Ref и Deferred и его дыра с прерыванием.урок 66 · Ждать сигнала: Deferred и Latchопираются: урок 67
  • Как устроены файберыОдин поток и планировщик; уступка при ожидании, по yieldNow и по бюджету 2048 шагов; почему Effect.sync не прервать; keep-alive у runMain; Worker для долгих расчётов.урок 70 · Как устроены файберыопираются: урок 71
  • Очереди: Queue и PubSubПроизводитель и потребитель; ограниченная очередь и противодавление, dropping и sliding; PubSub отдаёт каждое сообщение каждому подписчику. Почему unbounded опасна для входящих.урок 68 · Очереди: Queue и PubSubопираются: урок 69
  • Структурная конкурентностьРебёнок forkChild живёт не дольше родителя. Исключения явные: forkScoped к области из контекста, forkIn к названной области, forkDetach ни к кому.урок 62 · Структурная конкурентностьопираются: урок 63
  • Транзакции: TxRef и Effect.txНесколько ячеек одним шагом: TxRef, Effect.tx и txRetry, который ждёт перемены прочитанного. Оптимистичная конкурентность и почему внутри транзакции нет дел с миром.урок 69 · Транзакции: TxRef и Effect.txопираются: урок 70

Часы на башне: расписания и время

  • По чьим часам: Clock и TestClockВремя это сервис: Clock, Duration, DateTime. Почему Date.now и setTimeout в башне запрещены; TestClock из effect/testing: adjust, setTime, сутки за миллисекунды.урок 74 · По чьим часам: Clock и TestClockопираются: урок 75
  • Повторы: retry и repeatretry повторяет провал, repeat успех; while, until, times и schedule. Повторять только то, что может пройти; min, max и concat; Effect.schedule и cron с часовым поясом.урок 73 · Повторы: retry и repeatопираются: урок 74
  • РасписаниеРасписание это значение: recurs, spaced, fixed, exponential, jittered, upTo, while. Чем spaced отличается от fixed, зачем джиттер и почему повтор без паузы это молоток.урок 72 · Расписаниеопираются: урок 73
  • Босс: башня, которая чинит себя самаПредел на попытку, повторы обрывов и молчания с джиттером, общий срок строки, отчёт без ошибок в типе. Ночь проверяется на TestClock за миллисекунды.урок 75 · Босс: башня, которая чинит себя самаопираются: урок 76

Печати: Schema

Магистраль: Stream

  • Мёртвые письма: Sink и ChannelОчередь мёртвых писем вместо выброшенного мусора; Sink как значение, куда течёт поток; Channel под капотом; горячий поток на SubscriptionRef.урок 88 · Мёртвые письмаопираются: урок 89
  • Поток вместо массиваStream как тянущий поток и рецепт: callback и fromEventListener для источников, которые толкают сами, fromEffectRepeat для тех, кого тянут; map, filter, mapEffect, run*.урок 85 · Поток вместо массиваопираются: урок 86
  • ПротиводавлениеТянущий поток не берёт лишнего; толкающему нужен буфер и решение, что терять: suspend, dropping, sliding. Stream.buffer между шагами.урок 86 · Противодавлениеопираются: урок 87
  • Босс: ретрансляторНочь Магистрали потоком: дубли узнаются по ключу, свои кадры доставлены, чужие уходят пачками с повтором, мусор и неотправленное в мёртвых письмах.урок 89 · Босс: ретрансляторопираются: урок 90
  • Много линийmerge, mapEffect с concurrency и порядком, grouped и groupedWithin, throttle по кускам, broadcast и broadcastN.урок 87 · Много линийопираются: урок 88

Почтамт: платформа

Свет в окнах: наблюдаемость

Витрина: Effect во фронтенде

Башни без хозяина: распределённое

Голем: модели и инструменты

Мастерство: тесты, архитектура, переход