Есть ли канал сопрограммы Kotlin, который ведет себя как XStream Stream? - PullRequest
0 голосов
/ 06 июля 2018

Мне нужен канал сопрограммы, который ведет себя как XStream Stream

  1. send к каналу всегда неблокируемые
  2. Нет буфера и значения «теряются», если нет получателя.
  3. Новые подписчики не получают последнее значение.
  4. Все подписчики получают все значения (например, BroadcastChannel )

Самое близкое, что я нахожу, это ConflatedBroadcastChannel , однако это «запоминает» последнее значение, которое делает его похожим на XStream MemoryStream .

Есть ли способ обойти мою точную семантику?

1 Ответ

0 голосов
/ 06 июля 2018

Нет, таких каналов нет, не стесняйтесь создать проблему .

Ближайший обходной путь, который вы можете иметь, - это предоставить расширение для ConflatedBroadcastChannel, которое отбросит существующий элемент:

fun <T> ConflatedBroadcastChannel<T>.subscription(): ReceiveChannel<T> {
    val subscription = openSubscription()
    subscription.poll()
    return subscription
}

С точки зрения потребителя, эта подписка имеет ту же семантику, что и XStream, но она не соответствует части "Нет буфера": отправленный элемент будет сохранен в памяти (~ не может быть удален ) до следующего send.

...