Добавление yield к не приостанавливающей функции

#kotlin #kotlin-coroutines

#kotlin #kotlin-сопрограммы

Вопрос:

Я пытаюсь создать прерываемую версию CharSequence. Что-то в этом роде:

   class InterruptableCharSequence(private val delegate: CharSequence) : CharSequence {

  override fun get(index: Int): Char = runBlocking {

      yield() // Suspend here, in case we have cancelled
      delegate[index]
  }

  override fun subSequence(start: Int, end: Int): CharSequence {
      return delegate.subSequence(start, end)
  }

  override fun toString(): String {
      return delegate.toString()
  }
}
  

Поскольку это реализация существующего интерфейса, я не могу создать get приостанавливающую функцию, но я хотел бы вызвать ее из совместной процедуры (несколькими уровнями выше) и иметь возможность прерывать / отменять ее. Как бы мне сделать это возможным? Есть ли какой-нибудь способ сделать это без подобной блокировки или создания новой сопрограммы для каждого символа?

Комментарии:

1. Единственное, что вы, возможно, можете сделать, это подать сигнал вызывающей сопрограмме приостановить саму себя, как только она вернет управление. Например, вы можете создать специализированное исключение. Вы никак не сможете возобновить свою не приостанавливающуюся функцию после yield() (или любой другой эквивалент, который вы пытаетесь заменить для нее).

2. Вам действительно нужен CharSequence интерфейс? Похоже, что вам нужно Flow<Char> или Channel<Char> , если только вам не нужен произвольный доступ.

3. Да, я пытаюсь создавать регулярные выражения с возможностью прерывания, а регулярное выражение принимает последовательность символов.