#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. Да, я пытаюсь создавать регулярные выражения с возможностью прерывания, а регулярное выражение принимает последовательность символов.