diff --git a/CHANGELOG.md b/CHANGELOG.md index 14c2e747916..977e9eaf695 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 0.4.24 + +* `Versions`: + * `Kotlin`: `1.4.21` -> `1.4.30` + * `Klock`: `2.0.4` -> `2.0.6` +* `Coroutines`: + * New class `DoWithFirstBuilder` + * Several new extensions like `firstOf`/`first`/`invokeOnFirstOf` + ## 0.4.23 * `Versions`: diff --git a/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/DoWithFirst.kt b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/DoWithFirst.kt index 8bc71da51cb..94891715b83 100644 --- a/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/DoWithFirst.kt +++ b/coroutines/src/commonMain/kotlin/dev/inmo/micro_utils/coroutines/DoWithFirst.kt @@ -9,6 +9,19 @@ class DeferredAction( suspend operator fun invoke() = callback(deferred.await()) } +class DoWithFirstBuilder( + private val scope: CoroutineScope +) { + private val deferreds = mutableListOf>() + operator fun plus(block: suspend CoroutineScope.() -> T) { + deferreds.add(scope.async(start = CoroutineStart.LAZY, block = block)) + } + inline fun add(noinline block: suspend CoroutineScope.() -> T) = plus(block) + inline fun include(noinline block: suspend CoroutineScope.() -> T) = plus(block) + + fun build() = deferreds.toList() +} + fun Deferred.buildAction(callback: suspend (T) -> O) = DeferredAction(this, callback) suspend fun Iterable>.invokeFirstOf( @@ -32,9 +45,41 @@ suspend fun Iterable>.invokeOnFirst( callback: suspend (T) -> O ): O = map { it.buildAction(callback) }.invokeFirstOf(scope, cancelOnResult) +suspend fun CoroutineScope.invokeOnFirstOf( + cancelOnResult: Boolean = true, + block: DoWithFirstBuilder.() -> Unit, + callback: suspend (T) -> O +) = firstOf( + DoWithFirstBuilder(this).apply(block).build(), + cancelOnResult +).let { callback(it) } + suspend fun invokeOnFirst( scope: CoroutineScope, vararg variants: Deferred, cancelOnResult: Boolean = true, callback: suspend (T) -> O ): O = variants.toList().invokeOnFirst(scope, cancelOnResult, callback) + +suspend fun CoroutineScope.firstOf( + variants: Iterable>, + cancelOnResult: Boolean = true +) = variants.invokeOnFirst(this, cancelOnResult) { it } + +suspend fun CoroutineScope.firstOf( + cancelOnResult: Boolean = true, + block: DoWithFirstBuilder.() -> Unit +) = firstOf( + DoWithFirstBuilder(this).apply(block).build(), + cancelOnResult +) + +suspend fun CoroutineScope.firstOf( + vararg variants: Deferred, + cancelOnResult: Boolean = true +) = firstOf(variants.toList(), cancelOnResult) + +suspend fun List>.first( + scope: CoroutineScope, + cancelOnResult: Boolean = true +) = scope.firstOf(this, cancelOnResult) diff --git a/gradle.properties b/gradle.properties index e74082177ec..cf79ad930cc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,14 +6,14 @@ kotlin.incremental.js=true android.useAndroidX=true android.enableJetifier=true -kotlin_version=1.4.21 +kotlin_version=1.4.30 kotlin_coroutines_version=1.4.2 kotlin_serialisation_core_version=1.0.1 kotlin_exposed_version=0.29.1 ktor_version=1.5.1 -klockVersion=2.0.4 +klockVersion=2.0.6 github_release_plugin_version=2.2.12 @@ -44,5 +44,5 @@ dokka_version=1.4.20 # Project data group=dev.inmo -version=0.4.23 -android_code_version=27 +version=0.4.24 +android_code_version=28 diff --git a/pubconf.kpsb b/pubconf.kpsb index 3efd784fc97..3e8437fc386 100644 --- a/pubconf.kpsb +++ b/pubconf.kpsb @@ -1 +1 @@ -{"bintrayConfig":{"repo":"MicroUtils","packageName":"${project.name}","packageVcs":"https://github.com/InsanusMokrassar/MicroUtils","autoPublish":true,"overridePublish":true},"licenses":[{"id":"Apache-2.0","title":"Apache Software License 2.0","url":"https://git.inmo.dev/InsanusMokrassar/MicroUtils_mirror/src/master/LICENSE"}],"mavenConfig":{"name":"${project.name}","description":"","url":"https://git.inmo.dev/InsanusMokrassar/MicroUtils_mirror","vcsUrl":"ssh://git@git.inmo.dev:8322/InsanusMokrassar/MicroUtils_mirror.git","developers":[{"id":"InsanusMokrassar","name":"Aleksei Ovsiannikov","eMail":"ovsyannikov.alexey95@gmail.com"},{"id":"000Sanya","name":"Syrov Aleksandr","eMail":"000sanya.000sanya@gmail.com"}]}} \ No newline at end of file +{"bintrayConfig":{"repo":"MicroUtils","packageName":"${project.name}","packageVcs":"https://github.com/InsanusMokrassar/MicroUtils","autoPublish":true,"overridePublish":true},"licenses":[{"id":"Apache-2.0","title":"Apache Software License 2.0","url":"https://git.inmo.dev/InsanusMokrassar/MicroUtils_mirror/src/master/LICENSE"}],"mavenConfig":{"name":"${project.name}","description":"","url":"https://git.inmo.dev/InsanusMokrassar/MicroUtils_mirror","vcsUrl":"ssh://git@git.inmo.dev:8322/InsanusMokrassar/MicroUtils_mirror.git","includeGpgSigning":true,"developers":[{"id":"InsanusMokrassar","name":"Aleksei Ovsiannikov","eMail":"ovsyannikov.alexey95@gmail.com"},{"id":"000Sanya","name":"Syrov Aleksandr","eMail":"000sanya.000sanya@gmail.com"}]}} \ No newline at end of file diff --git a/publish.gradle b/publish.gradle index 778028dc545..0d6fbea7927 100644 --- a/publish.gradle +++ b/publish.gradle @@ -1,24 +1,9 @@ apply plugin: 'maven-publish' +apply plugin: 'signing' task javadocsJar(type: Jar) { classifier = 'javadoc' } -task sourceJar (type : Jar) { - classifier = 'sources' -} - -afterEvaluate { - project.publishing.publications.all { - // rename artifacts - groupId "${project.group}" - if (it.name.contains('kotlinMultiplatform')) { - artifactId = "${project.name}" - artifact sourceJar - } else { - artifactId = "${project.name}-$name" - } - } -} publishing { publications.all { @@ -73,4 +58,9 @@ publishing { } } -} \ No newline at end of file +} + +signing { + useGpgCmd() + publishing.publications.forEach { sign it } +}