Skip to content

Commit

Permalink
Add coroutines module (#9)
Browse files Browse the repository at this point in the history
* Updating Gradle Wrapper

* Adding Coroutines Module

* PR feedback

* PR feedback

* Adding stub test class

* adding test for combine extension functions

* matching coroutines package name

* fixing tests

* fixing build

* adding path fix to codecov.yml

* fixing build
  • Loading branch information
KVelasco authored Jun 10, 2020
1 parent 7aced8f commit 5071c49
Show file tree
Hide file tree
Showing 7 changed files with 267 additions and 0 deletions.
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ Library is organized into the following modules:
| Type | Module | Artifact ID | Description |
|:-------------------------------:|:----------------------------:|:---------------:|------------------------------------|
| ![Kotlin](artwork/kotlin.png) | [`collections`](collections) | [`collections`] | Tools/utilities for [Collections]. |
| ![Kotlin](artwork/kotlin.png) | [`coroutines`](coroutines) | [`coroutines`] | Tools/utilities for [Coroutines]. |


All artifacts have the Maven group ID: `com.juul.tuulbox`

Expand Down Expand Up @@ -41,3 +43,6 @@ table above) and_ `$version` _with the desired version (can be found by followin

[`collections`]: https://github.com/JuulLabs/android-github-packages/packages/215143
[Collections]: https://kotlinlang.org/docs/reference/collections-overview.html
[`coroutines`]: https://github.com/JuulLabs/android-github-packages/packages/261605
[Coroutines]: https://kotlinlang.org/docs/reference/coroutines-overview.html

1 change: 1 addition & 0 deletions codecov.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ coverage:
patch: off
fixes:
- "com/juul/tuulbox/collections::"
- "com/juul/tuulbox/coroutines/flow::"
8 changes: 8 additions & 0 deletions coroutines/api/coroutines.api
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
public final class com/juul/tuulbox/coroutines/flow/FlowsKt {
public static final fun combine (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function7;)Lkotlinx/coroutines/flow/Flow;
public static final fun combine (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function8;)Lkotlinx/coroutines/flow/Flow;
public static final fun combine (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function9;)Lkotlinx/coroutines/flow/Flow;
public static final fun combine (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function10;)Lkotlinx/coroutines/flow/Flow;
public static final fun combine (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function11;)Lkotlinx/coroutines/flow/Flow;
}

16 changes: 16 additions & 0 deletions coroutines/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
plugins {
id 'org.jetbrains.kotlin.jvm'
id 'org.jmailen.kotlinter'
id 'jacoco'
id 'maven-publish'
}

apply from: rootProject.file('gradle/kotlin.gradle')
apply from: rootProject.file('gradle/jacoco.gradle')
apply from: rootProject.file('gradle/publish.gradle')

dependencies {
api deps.kotlin.stdlib
api deps.kotlin.coroutines
testImplementation deps.kotlin.junit
}
141 changes: 141 additions & 0 deletions coroutines/src/main/kotlin/Flows.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
@file:Suppress("UNCHECKED_CAST")

package com.juul.tuulbox.coroutines.flow

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine

/**
* Returns a [Flow] whose values are generated with [transform] function by combining
* the most recently emitted values by each flow.
*/
inline fun <T1, T2, T3, T4, T5, T6, R> combine(
flow: Flow<T1>,
flow2: Flow<T2>,
flow3: Flow<T3>,
flow4: Flow<T4>,
flow5: Flow<T5>,
flow6: Flow<T6>,
crossinline transform: suspend (T1, T2, T3, T4, T5, T6) -> R
): Flow<R> = combine(flow, flow2, flow3, flow4, flow5, flow6) { args: Array<*> ->
transform(
args[0] as T1,
args[1] as T2,
args[2] as T3,
args[3] as T4,
args[4] as T5,
args[5] as T6
)
}

/**
* Returns a [Flow] whose values are generated with [transform] function by combining
* the most recently emitted values by each flow.
*/
inline fun <T1, T2, T3, T4, T5, T6, T7, R> combine(
flow: Flow<T1>,
flow2: Flow<T2>,
flow3: Flow<T3>,
flow4: Flow<T4>,
flow5: Flow<T5>,
flow6: Flow<T6>,
flow7: Flow<T7>,
crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7) -> R
): Flow<R> = combine(flow, flow2, flow3, flow4, flow5, flow6, flow7) { args: Array<*> ->
transform(
args[0] as T1,
args[1] as T2,
args[2] as T3,
args[3] as T4,
args[4] as T5,
args[5] as T6,
args[6] as T7
)
}

/**
* Returns a [Flow] whose values are generated with [transform] function by combining
* the most recently emitted values by each flow.
*/
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, R> combine(
flow: Flow<T1>,
flow2: Flow<T2>,
flow3: Flow<T3>,
flow4: Flow<T4>,
flow5: Flow<T5>,
flow6: Flow<T6>,
flow7: Flow<T7>,
flow8: Flow<T8>,
crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7, T8) -> R
): Flow<R> = combine(flow, flow2, flow3, flow4, flow5, flow6, flow7, flow8) { args: Array<*> ->
transform(
args[0] as T1,
args[1] as T2,
args[2] as T3,
args[3] as T4,
args[4] as T5,
args[5] as T6,
args[6] as T7,
args[7] as T8
)
}

/**
* Returns a [Flow] whose values are generated with [transform] function by combining
* the most recently emitted values by each flow.
*/
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> combine(
flow: Flow<T1>,
flow2: Flow<T2>,
flow3: Flow<T3>,
flow4: Flow<T4>,
flow5: Flow<T5>,
flow6: Flow<T6>,
flow7: Flow<T7>,
flow8: Flow<T8>,
flow9: Flow<T9>,
crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R
): Flow<R> = combine(flow, flow2, flow3, flow4, flow5, flow6, flow7, flow8, flow9) { args: Array<*> ->
transform(
args[0] as T1,
args[1] as T2,
args[2] as T3,
args[3] as T4,
args[4] as T5,
args[5] as T6,
args[6] as T7,
args[7] as T8,
args[8] as T9
)
}

/**
* Returns a [Flow] whose values are generated with [transform] function by combining
* the most recently emitted values by each flow.
*/
inline fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, R> combine(
flow: Flow<T1>,
flow2: Flow<T2>,
flow3: Flow<T3>,
flow4: Flow<T4>,
flow5: Flow<T5>,
flow6: Flow<T6>,
flow7: Flow<T7>,
flow8: Flow<T8>,
flow9: Flow<T9>,
flow10: Flow<T10>,
crossinline transform: suspend (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10) -> R
): Flow<R> = combine(flow, flow2, flow3, flow4, flow5, flow6, flow7, flow8, flow9, flow10) { args: Array<*> ->
transform(
args[0] as T1,
args[1] as T2,
args[2] as T3,
args[3] as T4,
args[4] as T5,
args[5] as T6,
args[6] as T7,
args[7] as T8,
args[8] as T9,
args[9] as T10
)
}
95 changes: 95 additions & 0 deletions coroutines/src/test/kotlin/CombineParametersTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package com.juul.tuulbox.coroutines.flow

import kotlin.test.Test
import kotlin.test.assertEquals
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.single
import kotlinx.coroutines.runBlocking

class CombineParametersTest {

@Test
fun testSixParameters() = runBlocking {
val flow = combine(
flowOf("1"),
flowOf(2),
flowOf("3"),
flowOf(4.toByte()),
flowOf(null),
flowOf("6")
) { a, b, c, d, e, f ->
a + b + c + d + e + f
}
assertEquals("1234null6", flow.single())
}

@Test
fun testSevenParameters() = runBlocking {
val flow = combine(
flowOf("1"),
flowOf(2),
flowOf("3"),
flowOf(4.toByte()),
flowOf(null),
flowOf("6"),
flowOf(7)
) { a, b, c, d, e, f, g ->
a + b + c + d + e + f + g
}
assertEquals("1234null67", flow.single())
}

@Test
fun testEightParameters() = runBlocking {
val flow = combine(
flowOf("1"),
flowOf(2),
flowOf("3"),
flowOf(4.toByte()),
flowOf(null),
flowOf("6"),
flowOf(7),
flowOf("8")
) { a, b, c, d, e, f, g, h ->
a + b + c + d + e + f + g + h
}
assertEquals("1234null678", flow.single())
}

@Test
fun testNineParameters() = runBlocking {
val flow = combine(
flowOf("1"),
flowOf(2),
flowOf("3"),
flowOf(4.toByte()),
flowOf(null),
flowOf("6"),
flowOf(7),
flowOf("8"),
flowOf(9.toByte())
) { a, b, c, d, e, f, g, h, i ->
a + b + c + d + e + f + g + h + i
}
assertEquals("1234null6789", flow.single())
}

@Test
fun testTenParameters() = runBlocking {
val flow = combine(
flowOf("1"),
flowOf(2),
flowOf("3"),
flowOf(4.toByte()),
flowOf(null),
flowOf("6"),
flowOf(7),
flowOf("8"),
flowOf(9.toByte()),
flowOf(null)
) { a, b, c, d, e, f, g, h, i, j ->
a + b + c + d + e + f + g + h + i + j
}
assertEquals("1234null6789null", flow.single())
}
}
1 change: 1 addition & 0 deletions settings.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ pluginManagement {
}

include ':collections'
include ':coroutines'

0 comments on commit 5071c49

Please sign in to comment.