blob: 6a6b5134c8576481a0d89a3c8df639eaa7c2f4c6 [file] [log] [blame]
Roman Elizarovd4dcbe22017-02-22 09:57:46 +03001/*
2 * Copyright 2016-2017 JetBrains s.r.o.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17// This file was automatically generated from coroutines-guide.md by Knit tool. Do not edit.
Roman Elizarova9687a32018-06-29 17:28:38 +030018package kotlinx.coroutines.experimental.guide.select01
Roman Elizarovd4dcbe22017-02-22 09:57:46 +030019
20import kotlinx.coroutines.experimental.*
21import kotlinx.coroutines.experimental.channels.*
22import kotlinx.coroutines.experimental.selects.*
Roman Elizarov9fe5f462018-02-21 19:05:52 +030023import kotlinx.coroutines.experimental.*
24import kotlin.coroutines.experimental.*
Roman Elizarovd4dcbe22017-02-22 09:57:46 +030025
Roman Elizarov57857202017-03-02 23:17:25 +030026fun fizz(context: CoroutineContext) = produce<String>(context) {
27 while (true) { // sends "Fizz" every 300 ms
Roman Elizarovd4dcbe22017-02-22 09:57:46 +030028 delay(300)
29 send("Fizz")
30 }
31}
32
Roman Elizarov57857202017-03-02 23:17:25 +030033fun buzz(context: CoroutineContext) = produce<String>(context) {
34 while (true) { // sends "Buzz!" every 500 ms
Roman Elizarovd4dcbe22017-02-22 09:57:46 +030035 delay(500)
36 send("Buzz!")
37 }
38}
39
Roman Elizarov57857202017-03-02 23:17:25 +030040suspend fun selectFizzBuzz(fizz: ReceiveChannel<String>, buzz: ReceiveChannel<String>) {
Roman Elizarovd4dcbe22017-02-22 09:57:46 +030041 select<Unit> { // <Unit> means that this select expression does not produce any result
42 fizz.onReceive { value -> // this is the first select clause
43 println("fizz -> '$value'")
44 }
45 buzz.onReceive { value -> // this is the second select clause
46 println("buzz -> '$value'")
47 }
48 }
49}
50
51fun main(args: Array<String>) = runBlocking<Unit> {
Roman Elizarov43e3af72017-07-21 16:01:31 +030052 val fizz = fizz(coroutineContext)
53 val buzz = buzz(coroutineContext)
Roman Elizarovd4dcbe22017-02-22 09:57:46 +030054 repeat(7) {
Roman Elizarov57857202017-03-02 23:17:25 +030055 selectFizzBuzz(fizz, buzz)
Roman Elizarovd4dcbe22017-02-22 09:57:46 +030056 }
Roman Elizarov8b38fa22017-09-27 17:44:31 +030057 coroutineContext.cancelChildren() // cancel fizz & buzz coroutines
Roman Elizarovd4dcbe22017-02-22 09:57:46 +030058}