Life · 12 / 12

Поиск с немедленной отменой

Отменить старый запрос до задержки нового

Сложнаяflowcancellationsearch

Реализуй Flow результата поиска. Каждый новый нормализованный запрос должен сразу отменять предыдущую ветку; новый непустой запрос начинает поиск после 300 мс тишины. Нормализация — trim; одинаковые подряд строки не перезапускают работу. Пустая строка отменяет поиск и эмитит пустой результат без этой задержки.

Условия: search кооперативно отменяем, возвращает список и не изменяет UI. Ошибки, кроме отмены, в этой задаче передаются коллектору. Результат содержит query, чтобы потребитель мог сопоставить его с текущим вводом. Отмена не отзывает уже доставленные или поставленные в выходной буфер результаты; немедленная отрисовка медленным коллектором не гарантируется.

Проверки:

  • " a ", затем "a" → одна ветка.
  • "a" в 0 мс, "ab" в 100 мс → поиск только ab, не раньше 400 мс.
  • Поиск a уже запущен, затем приходит b → ветка a отменяется сразу, поиск b ждёт 300 мс.
  • Пустой ввод во время поиска → пустой результат без ожидания.

Используется kotlinx-coroutines-core 1.11.0; transformLatest в этой версии требует ExperimentalCoroutinesApi. В обычном проекте тестируйте временные сценарии виртуальным временем.

Основа: debounce-кейс из draft/lifeconding.md, уточнённый моментом отмены.

Твой код
Решение