Skip to content

Commit 0c80e07

Browse files
committed
add coroutine versions of asyncSumOf
1 parent b9aac24 commit 0c80e07

File tree

3 files changed

+45
-15
lines changed

3 files changed

+45
-15
lines changed

gradle/libs.versions.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[versions]
22
assertk = "0.28.1"
3-
kotlin = "2.0.21"
3+
kotlin = "2.1.0"
44
kotlinCoroutines = "1.9.0"
55
junitJupiter = "5.11.3"
66
mockk = "1.13.13"

src/main/kotlin/com/soberg/aoc/utlities/extensions/AsyncSum.kt

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,26 @@
11
package com.soberg.aoc.utlities.extensions
22

3-
import kotlinx.coroutines.CoroutineDispatcher
4-
import kotlinx.coroutines.Dispatchers
5-
import kotlinx.coroutines.launch
6-
import kotlinx.coroutines.runBlocking
3+
import kotlinx.coroutines.*
74
import java.util.concurrent.atomic.AtomicInteger
85
import java.util.concurrent.atomic.AtomicLong
96
import kotlin.experimental.ExperimentalTypeInference
107

118
@OptIn(ExperimentalTypeInference::class)
129
@OverloadResolutionByLambdaReturnType
13-
@JvmName("asyncSumOfInt")
14-
inline fun <T> Iterable<T>.asyncSumOf(
10+
@JvmName("asyncSumOfIntBlocking")
11+
inline fun <T> Iterable<T>.asyncSumOfBlocking(
1512
dispatcher: CoroutineDispatcher = Dispatchers.Default,
1613
crossinline selector: (T) -> Int,
17-
): Int {
14+
): Int = runBlocking(dispatcher) {
15+
asyncSumOf(selector)
16+
}
17+
18+
@OptIn(ExperimentalTypeInference::class)
19+
@OverloadResolutionByLambdaReturnType
20+
@JvmName("asyncSumOfInt")
21+
suspend inline fun <T> Iterable<T>.asyncSumOf(crossinline selector: (T) -> Int): Int {
1822
val sum = AtomicInteger()
19-
runBlocking(dispatcher) {
23+
coroutineScope {
2024
forEach {
2125
launch {
2226
sum.getAndAdd(selector(it))
@@ -28,13 +32,20 @@ inline fun <T> Iterable<T>.asyncSumOf(
2832

2933
@OptIn(ExperimentalTypeInference::class)
3034
@OverloadResolutionByLambdaReturnType
31-
@JvmName("asyncSumOfLong")
32-
inline fun <T> Iterable<T>.asyncSumOf(
35+
@JvmName("asyncSumOfLongBlocking")
36+
inline fun <T> Iterable<T>.asyncSumOfBlocking(
3337
dispatcher: CoroutineDispatcher = Dispatchers.Default,
3438
crossinline selector: (T) -> Long,
35-
): Long {
39+
): Long = runBlocking(dispatcher){
40+
asyncSumOf(selector)
41+
}
42+
43+
@OptIn(ExperimentalTypeInference::class)
44+
@OverloadResolutionByLambdaReturnType
45+
@JvmName("asyncSumOfLong")
46+
suspend inline fun <T> Iterable<T>.asyncSumOf(crossinline selector: (T) -> Long): Long {
3647
val sum = AtomicLong()
37-
runBlocking(dispatcher) {
48+
coroutineScope {
3849
forEach {
3950
launch {
4051
sum.getAndAdd(selector(it))

src/test/kotlin/com/soberg/aoc/utlities/extensions/AsyncSumTest.kt

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,23 @@ package com.soberg.aoc.utlities.extensions
22

33
import assertk.assertThat
44
import assertk.assertions.isEqualTo
5+
import kotlinx.coroutines.test.runTest
56
import org.junit.jupiter.api.Test
67

78
class AsyncSumTest {
89
private val testData = "The quick brown fox jumped over the lazy dog".split(" ")
910

1011
@Test
11-
fun `return sum of integers`() {
12+
fun `return sum of integers - blocking`() {
13+
val letterCount = testData.asyncSumOfBlocking {
14+
it.length
15+
}
16+
17+
assertThat(letterCount).isEqualTo(36)
18+
}
19+
20+
@Test
21+
fun `return sum of integers - coroutine`() = runTest{
1222
val letterCount = testData.asyncSumOf {
1323
it.length
1424
}
@@ -17,7 +27,16 @@ class AsyncSumTest {
1727
}
1828

1929
@Test
20-
fun `return sum of longs`() {
30+
fun `return sum of longs - blocking`() {
31+
val letterCount = testData.asyncSumOfBlocking {
32+
it.length.toLong()
33+
}
34+
35+
assertThat(letterCount).isEqualTo(36)
36+
}
37+
38+
@Test
39+
fun `return sum of longs - coroutine`() = runTest{
2140
val letterCount = testData.asyncSumOf {
2241
it.length.toLong()
2342
}

0 commit comments

Comments
 (0)