Edited at

ズンドコキヨシ Kotlin with Coroutine

More than 1 year has passed since last update.

Kotlin CoroutineのPipelineで処理する例

参考にしたKotlin Coroutineのdocumentはこちら

suspend fun zundokoKiyoshi() {

val (z, d) = Pair("ズン", "ドコ")

// ズンドコを生成しつづけるチャネル
fun zundokoStream() = produce<String>(CommonPool) {
Random().apply {
while (true) {
send(if (nextBoolean()) z else d)
}
}
}

// ズンドコを生成しつづけるチャンネルの値をバッファしてキヨシ判定をするチャネル
fun kiyoshiJudge(zundokoStream: ReceiveChannel<String>) = produce<String>(CommonPool) {
val buf = arrayListOf<String>()
for (v in zundokoStream) {
send(v)
buf.add(v)
if (buf.takeLast(6).equals(listOf(d, z, z, z, z, d))) {
send("キ・ヨ・シ!")
return@produce
}
}
}

val zundokoStream = zundokoStream()
val kiyoshiJudge = kiyoshiJudge(zundokoStream)
for (v in kiyoshiJudge) {
println(v)
}
zundokoStream.cancel()
kiyoshiJudge.cancel()
}

こんな感じで呼び出すと、

// runBlockingは呼び出し元をブロッキングしてコルーチンを実行するコルーチンのビルダー関数。他にも色々ある。

runBlocking {
zundokoKiyoshi()
}

キヨシします。

ズン

ズン
ズン
ドコ
ズン
ドコ
ドコ
ズン
ズン
ズン
ズン
ドコ
キ・ヨ・シ!