Представим генератор узоров на Lua 5.4, который предлагает по одной плитке. Создание его корутины ещё не начинает работу над рисунком. Сначала хост вызывает coroutine.resume, и генератор работает, пока явно не передаст предложение через yield.
Рассмотрим маленькую гипотетическую правку. Красная плитка уже принята. Генератор выдаёт через yield синий квадрат для соседнего места. Пользователь отклоняет его и просит янтарный цвет. Хост возобновляет приостановленную корутину с этим решением, а генератор может использовать значения, возвращённые из yield, чтобы подготовить другое предложение.
Существенная деталь состоит в том, что меняет отказ. Продвигает ли он позицию в палитре, сохраняет текущую или восстанавливает состояние до предложения? Каждый вариант даёт художнику свой способ внесения правок. Если сохранять видимыми отклонённое предложение и решение, будет проще понять, почему следующая плитка отличается.
Если пользователь останавливается, хост может перестать возобновлять генератор. Это оставляет вычисление приостановленным, а не устанавливает, что оно завершилось, поэтому приложению всё ещё нужна политика хранения состояния и ресурсов.
Такая последовательность разделяет предложение, оценку и продолжение. Корутина Lua не является потоком ОС. Явная передача управления может сделать правки понятнее, но приложение должно определить, что сохраняется после каждой передачи.
