mirror of
				https://github.com/InsanusMokrassar/MicroUtils.git
				synced 2025-10-31 12:10:29 +00:00 
			
		
		
		
	Compare commits
	
		
			8 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 79b30290c0 | |||
| f8b8626859 | |||
| 3870db1c88 | |||
| 1be1070eb4 | |||
| 2696e663cf | |||
| 1e1f7df86d | |||
| 1d8ded8fd3 | |||
| 197825123a | 
							
								
								
									
										10
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								CHANGELOG.md
									
									
									
									
									
								
							| @@ -1,5 +1,15 @@ | |||||||
| # Changelog | # Changelog | ||||||
|  |  | ||||||
|  | ## 0.12.13 | ||||||
|  |  | ||||||
|  | * `Coroutines`: | ||||||
|  |   * Add opportunity to use markers in actors (solution of [#160](https://github.com/InsanusMokrassar/MicroUtils/issues/160)) | ||||||
|  | * `Koin`: | ||||||
|  |   * Module inited :) | ||||||
|  | * `Repos`: | ||||||
|  |   * `Android`: | ||||||
|  |     * Add typealias `KeyValueSPRepo` and opportunity to create shared preferences `KeyValue` repo with `KeyValueStore(...)` (fix of [#155](https://github.com/InsanusMokrassar/MicroUtils/issues/155)) | ||||||
|  |  | ||||||
| ## 0.12.12 | ## 0.12.12 | ||||||
|  |  | ||||||
| * `Common`: | * `Common`: | ||||||
|   | |||||||
| @@ -1,19 +1,15 @@ | |||||||
| package dev.inmo.micro_utils.coroutines | package dev.inmo.micro_utils.coroutines | ||||||
|  |  | ||||||
| import kotlinx.coroutines.CoroutineScope | import kotlinx.coroutines.* | ||||||
| import kotlinx.coroutines.channels.Channel | import kotlinx.coroutines.channels.Channel | ||||||
| import kotlinx.coroutines.launch | import kotlinx.coroutines.flow.consumeAsFlow | ||||||
|  |  | ||||||
| fun <T> CoroutineScope.actor( | fun <T> CoroutineScope.actor( | ||||||
|     channelCapacity: Int = Channel.UNLIMITED, |     channelCapacity: Int = Channel.UNLIMITED, | ||||||
|     block: suspend (T) -> Unit |     block: suspend (T) -> Unit | ||||||
| ): Channel<T> { | ): Channel<T> { | ||||||
|     val channel = Channel<T>(channelCapacity) |     val channel = Channel<T>(channelCapacity) | ||||||
|     launch { |     channel.consumeAsFlow().subscribe(this, block) | ||||||
|         for (data in channel) { |  | ||||||
|             block(data) |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|     return channel |     return channel | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -0,0 +1,30 @@ | |||||||
|  | package dev.inmo.micro_utils.coroutines | ||||||
|  |  | ||||||
|  | import kotlinx.coroutines.* | ||||||
|  | import kotlinx.coroutines.channels.Channel | ||||||
|  | import kotlinx.coroutines.flow.consumeAsFlow | ||||||
|  |  | ||||||
|  | fun <T> CoroutineScope.actorAsync( | ||||||
|  |     channelCapacity: Int = Channel.UNLIMITED, | ||||||
|  |     markerFactory: suspend (T) -> Any? = { null }, | ||||||
|  |     block: suspend (T) -> Unit | ||||||
|  | ): Channel<T> { | ||||||
|  |     val channel = Channel<T>(channelCapacity) | ||||||
|  |     channel.consumeAsFlow().subscribeAsync(this, markerFactory, block) | ||||||
|  |     return channel | ||||||
|  | } | ||||||
|  |  | ||||||
|  | inline fun <T> CoroutineScope.safeActorAsync( | ||||||
|  |     channelCapacity: Int = Channel.UNLIMITED, | ||||||
|  |     noinline onException: ExceptionHandler<Unit> = defaultSafelyExceptionHandler, | ||||||
|  |     noinline markerFactory: suspend (T) -> Any? = { null }, | ||||||
|  |     crossinline block: suspend (T) -> Unit | ||||||
|  | ): Channel<T> = actorAsync( | ||||||
|  |     channelCapacity, | ||||||
|  |     markerFactory | ||||||
|  | ) { | ||||||
|  |     safely(onException) { | ||||||
|  |         block(it) | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| @@ -14,5 +14,5 @@ crypto_js_version=4.1.1 | |||||||
| # Project data | # Project data | ||||||
|  |  | ||||||
| group=dev.inmo | group=dev.inmo | ||||||
| version=0.12.12 | version=0.12.13 | ||||||
| android_code_version=151 | android_code_version=152 | ||||||
|   | |||||||
| @@ -15,6 +15,8 @@ ktor = "2.1.1" | |||||||
|  |  | ||||||
| gh-release = "2.4.1" | gh-release = "2.4.1" | ||||||
|  |  | ||||||
|  | koin = "3.2.0" | ||||||
|  |  | ||||||
| android-gradle = "7.2.2" | android-gradle = "7.2.2" | ||||||
| dexcount = "3.1.0" | dexcount = "3.1.0" | ||||||
|  |  | ||||||
| @@ -31,6 +33,7 @@ android-props-buildTools = "32.0.0" | |||||||
| [libraries] | [libraries] | ||||||
|  |  | ||||||
| kt-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kt" } | kt-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kt" } | ||||||
|  | kt-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kt" } | ||||||
|  |  | ||||||
| kt-serialization = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kt-serialization" } | kt-serialization = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kt-serialization" } | ||||||
| kt-serialization-cbor = { module = "org.jetbrains.kotlinx:kotlinx-serialization-cbor", version.ref = "kt-serialization" } | kt-serialization-cbor = { module = "org.jetbrains.kotlinx:kotlinx-serialization-cbor", version.ref = "kt-serialization" } | ||||||
| @@ -59,6 +62,7 @@ ktor-server-content-negotiation = { module = "io.ktor:ktor-server-content-negoti | |||||||
|  |  | ||||||
| klock = { module = "com.soywiz.korlibs.klock:klock", version.ref = "klock" } | klock = { module = "com.soywiz.korlibs.klock:klock", version.ref = "klock" } | ||||||
| uuid = { module = "com.benasher44:uuid", version.ref = "uuid" } | uuid = { module = "com.benasher44:uuid", version.ref = "uuid" } | ||||||
|  | koin = { module = "io.insert-koin:koin-core", version.ref = "koin" } | ||||||
|  |  | ||||||
|  |  | ||||||
| jb-exposed = { module = "org.jetbrains.exposed:exposed-core", version.ref = "jb-exposed" } | jb-exposed = { module = "org.jetbrains.exposed:exposed-core", version.ref = "jb-exposed" } | ||||||
|   | |||||||
							
								
								
									
										28
									
								
								koin/build.gradle
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								koin/build.gradle
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | plugins { | ||||||
|  |     id "org.jetbrains.kotlin.multiplatform" | ||||||
|  |     id "org.jetbrains.kotlin.plugin.serialization" | ||||||
|  |     id "com.android.library" | ||||||
|  | } | ||||||
|  |  | ||||||
|  | apply from: "$mppProjectWithSerializationPresetPath" | ||||||
|  |  | ||||||
|  | kotlin { | ||||||
|  |     sourceSets { | ||||||
|  |         commonMain { | ||||||
|  |             dependencies { | ||||||
|  |                 api libs.koin | ||||||
|  |                 api libs.uuid | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         jvmMain { | ||||||
|  |             dependencies { | ||||||
|  |                 api libs.kt.reflect | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         androidMain { | ||||||
|  |             dependencies { | ||||||
|  |                 api libs.kt.reflect | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										12
									
								
								koin/src/commonMain/kotlin/FactoryWithRandomQualifier.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								koin/src/commonMain/kotlin/FactoryWithRandomQualifier.kt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | package dev.inmo.micro_utils.koin | ||||||
|  |  | ||||||
|  | import org.koin.core.definition.Definition | ||||||
|  | import org.koin.core.module.Module | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Will be useful in case you need to declare some singles with one type several types, but need to separate them and do | ||||||
|  |  * not care about how :) | ||||||
|  |  */ | ||||||
|  | inline fun <reified T : Any> Module.factoryWithRandomQualifier( | ||||||
|  |     noinline definition: Definition<T> | ||||||
|  | ) = factory(RandomQualifier(), definition) | ||||||
							
								
								
									
										12
									
								
								koin/src/commonMain/kotlin/FactoryWithStringQualifier.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								koin/src/commonMain/kotlin/FactoryWithStringQualifier.kt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | package dev.inmo.micro_utils.koin | ||||||
|  |  | ||||||
|  | import org.koin.core.definition.Definition | ||||||
|  | import org.koin.core.module.Module | ||||||
|  | import org.koin.core.qualifier.StringQualifier | ||||||
|  |  | ||||||
|  | inline fun <reified T : Any> Module.factory( | ||||||
|  |     qualifier: String, | ||||||
|  |     noinline definition: Definition<T> | ||||||
|  | ) = factory(StringQualifier(qualifier), definition) | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										8
									
								
								koin/src/commonMain/kotlin/GetAllDistinct.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								koin/src/commonMain/kotlin/GetAllDistinct.kt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | package dev.inmo.micro_utils.koin | ||||||
|  |  | ||||||
|  | import org.koin.core.Koin | ||||||
|  | import org.koin.core.scope.Scope | ||||||
|  |  | ||||||
|  | inline fun <reified T : Any> Scope.getAllDistinct() = getAll<T>().distinct() | ||||||
|  | inline fun <reified T : Any> Koin.getAllDistinct() = getAll<T>().distinct() | ||||||
|  |  | ||||||
							
								
								
									
										8
									
								
								koin/src/commonMain/kotlin/GetAny.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								koin/src/commonMain/kotlin/GetAny.kt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | package dev.inmo.micro_utils.koin | ||||||
|  |  | ||||||
|  | import org.koin.core.Koin | ||||||
|  | import org.koin.core.scope.Scope | ||||||
|  |  | ||||||
|  | inline fun <reified T : Any> Scope.getAny() = getAll<T>().first() | ||||||
|  | inline fun <reified T : Any> Koin.getAny() = getAll<T>().first() | ||||||
|  |  | ||||||
							
								
								
									
										6
									
								
								koin/src/commonMain/kotlin/RandomQualifier.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								koin/src/commonMain/kotlin/RandomQualifier.kt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | package dev.inmo.micro_utils.koin | ||||||
|  |  | ||||||
|  | import com.benasher44.uuid.uuid4 | ||||||
|  | import org.koin.core.qualifier.StringQualifier | ||||||
|  |  | ||||||
|  | fun RandomQualifier(randomFun: () -> String = { uuid4().toString() }) = StringQualifier(randomFun()) | ||||||
							
								
								
									
										13
									
								
								koin/src/commonMain/kotlin/SingleWithRandomQualifier.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								koin/src/commonMain/kotlin/SingleWithRandomQualifier.kt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | package dev.inmo.micro_utils.koin | ||||||
|  |  | ||||||
|  | import org.koin.core.definition.Definition | ||||||
|  | import org.koin.core.module.Module | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * Will be useful in case you need to declare some singles with one type several types, but need to separate them and do | ||||||
|  |  * not care about how :) | ||||||
|  |  */ | ||||||
|  | inline fun <reified T : Any> Module.singleWithRandomQualifier( | ||||||
|  |     createdAtStart: Boolean = false, | ||||||
|  |     noinline definition: Definition<T> | ||||||
|  | ) = single(RandomQualifier(), createdAtStart, definition) | ||||||
							
								
								
									
										12
									
								
								koin/src/commonMain/kotlin/SingleWithStringQualifier.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								koin/src/commonMain/kotlin/SingleWithStringQualifier.kt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,12 @@ | |||||||
|  | package dev.inmo.micro_utils.koin | ||||||
|  |  | ||||||
|  | import org.koin.core.definition.Definition | ||||||
|  | import org.koin.core.module.Module | ||||||
|  | import org.koin.core.qualifier.StringQualifier | ||||||
|  |  | ||||||
|  | inline fun <reified T : Any> Module.single( | ||||||
|  |     qualifier: String, | ||||||
|  |     createdAtStart: Boolean = false, | ||||||
|  |     noinline definition: Definition<T> | ||||||
|  | ) = single(StringQualifier(qualifier), createdAtStart, definition) | ||||||
|  |  | ||||||
							
								
								
									
										27
									
								
								koin/src/jvmMain/kotlin/FactoryWithBinds.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								koin/src/jvmMain/kotlin/FactoryWithBinds.kt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | package dev.inmo.micro_utils.koin | ||||||
|  |  | ||||||
|  | import org.koin.core.definition.Definition | ||||||
|  | import org.koin.core.instance.InstanceFactory | ||||||
|  | import org.koin.core.module.Module | ||||||
|  | import org.koin.core.qualifier.Qualifier | ||||||
|  | import org.koin.dsl.binds | ||||||
|  | import kotlin.reflect.KClass | ||||||
|  | import kotlin.reflect.full.allSuperclasses | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline fun <reified T : Any> Module.factoryWithBinds( | ||||||
|  |     qualifier: Qualifier? = null, | ||||||
|  |     bindFilter: (KClass<*>) -> Boolean = { true }, | ||||||
|  |     noinline definition: Definition<T> | ||||||
|  | ): Pair<Module, InstanceFactory<*>> { | ||||||
|  |     return factory(qualifier, definition) binds (T::class.allSuperclasses.filter(bindFilter).toTypedArray()) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | inline fun <reified T : Any> Module.factoryWithBinds( | ||||||
|  |     qualifier: String, | ||||||
|  |     bindFilter: (KClass<*>) -> Boolean = { true }, | ||||||
|  |     noinline definition: Definition<T> | ||||||
|  | ): Pair<Module, InstanceFactory<*>> { | ||||||
|  |     return factory(qualifier, definition) binds (T::class.allSuperclasses.filter(bindFilter).toTypedArray()) | ||||||
|  | } | ||||||
|  |  | ||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | package dev.inmo.micro_utils.koin | ||||||
|  |  | ||||||
|  | import org.koin.core.definition.Definition | ||||||
|  | import org.koin.core.instance.InstanceFactory | ||||||
|  | import org.koin.core.module.Module | ||||||
|  | import kotlin.reflect.KClass | ||||||
|  |  | ||||||
|  | inline fun <reified T : Any> Module.factoryWithRandomQualifierAndBinds( | ||||||
|  |     bindFilter: (KClass<*>) -> Boolean = { true }, | ||||||
|  |     noinline definition: Definition<T> | ||||||
|  | ): Pair<Module, InstanceFactory<*>> { | ||||||
|  |     return factoryWithBinds(RandomQualifier(), bindFilter, definition) | ||||||
|  | } | ||||||
							
								
								
									
										30
									
								
								koin/src/jvmMain/kotlin/SignleWithBinds.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								koin/src/jvmMain/kotlin/SignleWithBinds.kt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | |||||||
|  | package dev.inmo.micro_utils.koin | ||||||
|  |  | ||||||
|  | import org.koin.core.definition.Definition | ||||||
|  | import org.koin.core.instance.InstanceFactory | ||||||
|  | import org.koin.core.module.Module | ||||||
|  | import org.koin.core.qualifier.Qualifier | ||||||
|  | import org.koin.dsl.binds | ||||||
|  | import kotlin.reflect.KClass | ||||||
|  | import kotlin.reflect.full.allSuperclasses | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline fun <reified T : Any> Module.singleWithBinds( | ||||||
|  |     qualifier: Qualifier? = null, | ||||||
|  |     createdAtStart: Boolean = false, | ||||||
|  |     bindFilter: (KClass<*>) -> Boolean = { true }, | ||||||
|  |     noinline definition: Definition<T> | ||||||
|  | ): Pair<Module, InstanceFactory<*>> { | ||||||
|  |     return single(qualifier, createdAtStart, definition) binds (T::class.allSuperclasses.filter(bindFilter).toTypedArray()) | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | inline fun <reified T : Any> Module.singleWithBinds( | ||||||
|  |     qualifier: String, | ||||||
|  |     createdAtStart: Boolean = false, | ||||||
|  |     bindFilter: (KClass<*>) -> Boolean = { true }, | ||||||
|  |     noinline definition: Definition<T> | ||||||
|  | ): Pair<Module, InstanceFactory<*>> { | ||||||
|  |     return single(qualifier, createdAtStart, definition) binds (T::class.allSuperclasses.filter(bindFilter).toTypedArray()) | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										14
									
								
								koin/src/jvmMain/kotlin/SingleWithBindsAndRandomQualifier.kt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								koin/src/jvmMain/kotlin/SingleWithBindsAndRandomQualifier.kt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | |||||||
|  | package dev.inmo.micro_utils.koin | ||||||
|  |  | ||||||
|  | import org.koin.core.definition.Definition | ||||||
|  | import org.koin.core.instance.InstanceFactory | ||||||
|  | import org.koin.core.module.Module | ||||||
|  | import kotlin.reflect.KClass | ||||||
|  |  | ||||||
|  | inline fun <reified T : Any> Module.singleWithRandomQualifierAndBinds( | ||||||
|  |     createdAtStart: Boolean = false, | ||||||
|  |     bindFilter: (KClass<*>) -> Boolean = { true }, | ||||||
|  |     noinline definition: Definition<T> | ||||||
|  | ): Pair<Module, InstanceFactory<*>> { | ||||||
|  |     return singleWithBinds(RandomQualifier(), createdAtStart, bindFilter, definition) | ||||||
|  | } | ||||||
							
								
								
									
										1
									
								
								koin/src/main/AndroidManifest.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								koin/src/main/AndroidManifest.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | |||||||
|  | <manifest package="dev.inmo.micro_utils.koin"/> | ||||||
| @@ -17,7 +17,7 @@ fun <T : Any> Context.keyValueStore( | |||||||
| ): KeyValueRepo<String, T> { | ): KeyValueRepo<String, T> { | ||||||
|     @Suppress("UNCHECKED_CAST") |     @Suppress("UNCHECKED_CAST") | ||||||
|     return cache.getOrPut(name) { |     return cache.getOrPut(name) { | ||||||
|         KeyValueStore<T>(this, name, cacheValues) |         KeyValueStore<T>(c = this, preferencesName = name, useCache = cacheValues) | ||||||
|     } as KeyValueStore<T> |     } as KeyValueStore<T> | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -149,6 +149,14 @@ class KeyValueStore<T : Any> internal constructor ( | |||||||
|             _onValueRemovedFlow.emit(it) |             _onValueRemovedFlow.emit(it) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     companion object { | ||||||
|  |         operator fun <T : Any> invoke( | ||||||
|  |             context: Context, | ||||||
|  |             name: String = "default", | ||||||
|  |             cacheValues: Boolean = false | ||||||
|  |         ) = context.keyValueStore<T>(name, cacheValues) | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| inline fun <T : Any> SharedPreferencesKeyValueRepo( | inline fun <T : Any> SharedPreferencesKeyValueRepo( | ||||||
| @@ -156,3 +164,5 @@ inline fun <T : Any> SharedPreferencesKeyValueRepo( | |||||||
|     name: String = "default", |     name: String = "default", | ||||||
|     cacheValues: Boolean = false |     cacheValues: Boolean = false | ||||||
| ) = context.keyValueStore<T>(name, cacheValues) | ) = context.keyValueStore<T>(name, cacheValues) | ||||||
|  |  | ||||||
|  | typealias KeyValueSPRepo<T> = KeyValueStore<T> | ||||||
|   | |||||||
| @@ -5,6 +5,7 @@ String[] includes = [ | |||||||
|     ":common:compose", |     ":common:compose", | ||||||
|     ":matrix", |     ":matrix", | ||||||
|     ":crypto", |     ":crypto", | ||||||
|  |     ":koin", | ||||||
|     ":selector:common", |     ":selector:common", | ||||||
|     ":pagination:common", |     ":pagination:common", | ||||||
|     ":pagination:exposed", |     ":pagination:exposed", | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user