mirror of
				https://github.com/InsanusMokrassar/MicroUtils.git
				synced 2025-11-03 21:51:59 +00:00 
			
		
		
		
	@@ -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`:
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,19 @@ class DeferredAction<T, O>(
 | 
			
		||||
    suspend operator fun invoke() = callback(deferred.await())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class DoWithFirstBuilder<T>(
 | 
			
		||||
    private val scope: CoroutineScope
 | 
			
		||||
) {
 | 
			
		||||
    private val deferreds = mutableListOf<Deferred<T>>()
 | 
			
		||||
    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 <T, O> Deferred<T>.buildAction(callback: suspend (T) -> O) = DeferredAction(this, callback)
 | 
			
		||||
 | 
			
		||||
suspend fun <O> Iterable<DeferredAction<*, O>>.invokeFirstOf(
 | 
			
		||||
@@ -32,9 +45,41 @@ suspend fun <T, O> Iterable<Deferred<T>>.invokeOnFirst(
 | 
			
		||||
    callback: suspend (T) -> O
 | 
			
		||||
): O = map { it.buildAction(callback) }.invokeFirstOf(scope, cancelOnResult)
 | 
			
		||||
 | 
			
		||||
suspend fun <T, O> CoroutineScope.invokeOnFirstOf(
 | 
			
		||||
    cancelOnResult: Boolean = true,
 | 
			
		||||
    block: DoWithFirstBuilder<T>.() -> Unit,
 | 
			
		||||
    callback: suspend (T) -> O
 | 
			
		||||
) = firstOf(
 | 
			
		||||
    DoWithFirstBuilder<T>(this).apply(block).build(),
 | 
			
		||||
    cancelOnResult
 | 
			
		||||
).let { callback(it) }
 | 
			
		||||
 | 
			
		||||
suspend fun <T, O> invokeOnFirst(
 | 
			
		||||
    scope: CoroutineScope,
 | 
			
		||||
    vararg variants: Deferred<T>,
 | 
			
		||||
    cancelOnResult: Boolean = true,
 | 
			
		||||
    callback: suspend (T) -> O
 | 
			
		||||
): O = variants.toList().invokeOnFirst(scope, cancelOnResult, callback)
 | 
			
		||||
 | 
			
		||||
suspend fun <T> CoroutineScope.firstOf(
 | 
			
		||||
    variants: Iterable<Deferred<T>>,
 | 
			
		||||
    cancelOnResult: Boolean = true
 | 
			
		||||
) = variants.invokeOnFirst(this, cancelOnResult) { it }
 | 
			
		||||
 | 
			
		||||
suspend fun <T> CoroutineScope.firstOf(
 | 
			
		||||
    cancelOnResult: Boolean = true,
 | 
			
		||||
    block: DoWithFirstBuilder<T>.() -> Unit
 | 
			
		||||
) = firstOf(
 | 
			
		||||
    DoWithFirstBuilder<T>(this).apply(block).build(),
 | 
			
		||||
    cancelOnResult
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
suspend fun <T> CoroutineScope.firstOf(
 | 
			
		||||
    vararg variants: Deferred<T>,
 | 
			
		||||
    cancelOnResult: Boolean = true
 | 
			
		||||
) = firstOf(variants.toList(), cancelOnResult)
 | 
			
		||||
 | 
			
		||||
suspend fun <T> List<Deferred<T>>.first(
 | 
			
		||||
    scope: CoroutineScope,
 | 
			
		||||
    cancelOnResult: Boolean = true
 | 
			
		||||
) = scope.firstOf(this, cancelOnResult)
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
@@ -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"}]}}
 | 
			
		||||
{"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"}]}}
 | 
			
		||||
@@ -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 {
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
signing {
 | 
			
		||||
    useGpgCmd()
 | 
			
		||||
    publishing.publications.forEach { sign it }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user