diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a6dc0681..82483277 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,6 +15,7 @@ ax_lifecycle = "2.5.1" ax_testing = "2.1.0" ax_runner = "1.5.0" robolectric = "4.9" +immutable_collections = "0.3.5" [plugins] multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } @@ -26,6 +27,7 @@ ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } [libraries] coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" } coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" } +immutableCollections = { module = "org.jetbrains.kotlinx:kotlinx-collections-immutable", version.ref = "immutable_collections" } atomicfu = { module = "org.jetbrains.kotlinx:atomicfu", version.ref = "atomicfu" } atomicfu-plugin = { module = "org.jetbrains.kotlinx:atomicfu-gradle-plugin", version.ref = "atomicfu" } agp = { module = "com.android.tools.build:gradle", version.ref = "agp" } diff --git a/mobiuskt-core/build.gradle.kts b/mobiuskt-core/build.gradle.kts index 45070e8b..55d2c801 100644 --- a/mobiuskt-core/build.gradle.kts +++ b/mobiuskt-core/build.gradle.kts @@ -91,6 +91,7 @@ kotlin { val commonMain by getting { dependencies { implementation(libs.atomicfu) + implementation(libs.immutableCollections) } } diff --git a/mobiuskt-core/src/commonMain/kotlin/Effects.kt b/mobiuskt-core/src/commonMain/kotlin/Effects.kt index 533ba3c0..f4406d09 100644 --- a/mobiuskt-core/src/commonMain/kotlin/Effects.kt +++ b/mobiuskt-core/src/commonMain/kotlin/Effects.kt @@ -1,5 +1,6 @@ package kt.mobius +import kotlinx.collections.immutable.persistentHashSetOf import kotlin.js.JsExport import kotlin.js.JsName import kotlin.jvm.JvmStatic @@ -21,6 +22,6 @@ public object Effects { @JvmStatic @JsName("effects") public fun effects(vararg effects: G): Set { - return hashSetOf(*effects.copyOf()) + return persistentHashSetOf(*effects) } } diff --git a/mobiuskt-core/src/commonMain/kotlin/First.kt b/mobiuskt-core/src/commonMain/kotlin/First.kt index 75db8367..45219d5f 100644 --- a/mobiuskt-core/src/commonMain/kotlin/First.kt +++ b/mobiuskt-core/src/commonMain/kotlin/First.kt @@ -1,5 +1,6 @@ package kt.mobius +import kotlinx.collections.immutable.persistentSetOf import kotlin.js.JsExport import kotlin.js.JsName import kotlin.jvm.JvmOverloads @@ -58,7 +59,7 @@ public data class First internal constructor( */ @JvmStatic public fun first(model: M, vararg effects: F): First { - return First(model, effects.toSet()) + return First(model, persistentSetOf(*effects)) } } } diff --git a/mobiuskt-core/src/commonMain/kotlin/Next.kt b/mobiuskt-core/src/commonMain/kotlin/Next.kt index 48214036..48dcbd5b 100644 --- a/mobiuskt-core/src/commonMain/kotlin/Next.kt +++ b/mobiuskt-core/src/commonMain/kotlin/Next.kt @@ -1,5 +1,7 @@ package kt.mobius +import kotlinx.collections.immutable.persistentSetOf +import kotlinx.collections.immutable.toImmutableSet import kt.mobius.functions.Consumer import kotlin.js.JsExport import kotlin.js.JsName @@ -92,33 +94,33 @@ public class Next internal constructor( @JvmOverloads @JsName("nextWithSet") public fun next(model: M, effects: Set = emptySet()): Next { - return Next(model, effects.toSet()) + return Next(model, effects.toImmutableSet()) } /** Create a Next that updates the model and dispatches the optional effects. */ @JvmStatic @JsName("next") public fun next(model: M, vararg effects: F): Next { - return Next(model, effects.toSet()) + return Next(model, persistentSetOf(*effects)) } /** Create a Next that doesn't update the model but dispatches the supplied effects. */ @JvmStatic @JsName("dispatchWithSet") public fun dispatch(effects: Set): Next { - return Next(null, effects) + return Next(null, effects.toImmutableSet()) } /** Create a Next that doesn't update the model but dispatches the supplied effects. */ @JvmStatic public fun dispatch(vararg effects: F): Next { - return Next(null, effects.toSet()) + return Next(null, persistentSetOf(*effects)) } /** Create an empty Next that doesn't update the model or dispatch effects. */ @JvmStatic public fun noChange(): Next { - return Next(null, emptySet()) + return Next(null, persistentSetOf()) } } } diff --git a/mobiuskt-coroutines/build.gradle.kts b/mobiuskt-coroutines/build.gradle.kts index 3f54f079..99ccf6b7 100644 --- a/mobiuskt-coroutines/build.gradle.kts +++ b/mobiuskt-coroutines/build.gradle.kts @@ -62,6 +62,7 @@ kotlin { implementation(projects.mobiusktCore) implementation(libs.coroutines.core) implementation(libs.atomicfu) + implementation(libs.immutableCollections) } } diff --git a/mobiuskt-coroutines/src/commonMain/kotlin/SubtypeEffectHandler.kt b/mobiuskt-coroutines/src/commonMain/kotlin/SubtypeEffectHandler.kt index e045a240..38de96ed 100644 --- a/mobiuskt-coroutines/src/commonMain/kotlin/SubtypeEffectHandler.kt +++ b/mobiuskt-coroutines/src/commonMain/kotlin/SubtypeEffectHandler.kt @@ -1,5 +1,7 @@ package kt.mobius.flow +import kotlinx.collections.immutable.toImmutableList +import kotlinx.collections.immutable.toImmutableSet import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.* import kotlinx.coroutines.flow.transform @@ -103,7 +105,7 @@ public class SubtypeEffectHandlerBuilder { public fun build(): FlowTransformer = MobiusEffectRouter( - effectClasses = effectPerformerMap.keys.toSet(), - effectPerformers = effectPerformerMap.values.toList() + effectClasses = effectPerformerMap.keys.toImmutableSet(), + effectPerformers = effectPerformerMap.values.toImmutableList() ) } diff --git a/mobiuskt-extras/build.gradle.kts b/mobiuskt-extras/build.gradle.kts index 36e881a7..75c9ecd6 100644 --- a/mobiuskt-extras/build.gradle.kts +++ b/mobiuskt-extras/build.gradle.kts @@ -42,6 +42,7 @@ kotlin { dependencies { implementation(projects.mobiusktCore) implementation(libs.atomicfu) + implementation(libs.immutableCollections) } } diff --git a/mobiuskt-extras/src/commonMain/kotlin/CompositeLogger.kt b/mobiuskt-extras/src/commonMain/kotlin/CompositeLogger.kt index 6b74339c..3439320a 100644 --- a/mobiuskt-extras/src/commonMain/kotlin/CompositeLogger.kt +++ b/mobiuskt-extras/src/commonMain/kotlin/CompositeLogger.kt @@ -1,5 +1,6 @@ package kt.mobius.extras +import kotlinx.collections.immutable.persistentListOf import kt.mobius.First import kt.mobius.MobiusLoop.Logger import kt.mobius.Next @@ -51,7 +52,7 @@ public class CompositeLogger private constructor( @JvmStatic @JsName("from") public fun from(vararg loggers: Logger): Logger { - return CompositeLogger(loggers.toList()) + return CompositeLogger(persistentListOf(*loggers)) } } } diff --git a/mobiuskt-extras/src/commonMain/kotlin/patterns/InnerUpdate.kt b/mobiuskt-extras/src/commonMain/kotlin/patterns/InnerUpdate.kt index e9964bdf..8875d2cf 100644 --- a/mobiuskt-extras/src/commonMain/kotlin/patterns/InnerUpdate.kt +++ b/mobiuskt-extras/src/commonMain/kotlin/patterns/InnerUpdate.kt @@ -1,5 +1,6 @@ package kt.mobius.extras.patterns +import kotlinx.collections.immutable.toImmutableSet import kt.mobius.Next import kt.mobius.Next.Companion.dispatch import kt.mobius.Next.Companion.next @@ -168,7 +169,7 @@ public object InnerEffectHandlers { if (modelUpdated) next(model) else noChange() } else { - val effects = innerEffects.map(f::apply).toSet() + val effects = innerEffects.map(f::apply).toImmutableSet() if (modelUpdated) next(model, effects) else dispatch(effects) } diff --git a/mobiuskt-test/build.gradle.kts b/mobiuskt-test/build.gradle.kts index f50b2b0a..032e3518 100644 --- a/mobiuskt-test/build.gradle.kts +++ b/mobiuskt-test/build.gradle.kts @@ -40,6 +40,7 @@ kotlin { dependencies { implementation(projects.mobiusktCore) implementation(libs.atomicfu) + implementation(libs.immutableCollections) implementation(kotlin("test-common")) implementation(kotlin("test-annotations-common")) } diff --git a/mobiuskt-test/src/commonMain/kotlin/UpdateSpec.kt b/mobiuskt-test/src/commonMain/kotlin/UpdateSpec.kt index 1a22c5d4..317f4a25 100644 --- a/mobiuskt-test/src/commonMain/kotlin/UpdateSpec.kt +++ b/mobiuskt-test/src/commonMain/kotlin/UpdateSpec.kt @@ -1,5 +1,6 @@ package kt.mobius.test +import kotlinx.collections.immutable.persistentListOf import kt.mobius.Next import kt.mobius.Update import kt.mobius.test.matcher.Matcher @@ -107,7 +108,7 @@ public class UpdateSpec( init { this.events = ArrayList(events.size + 1) this.events.add(event) - this.events.addAll(events.toList()) + this.events.addAll(persistentListOf(*events)) } override fun then(assertion: Assert) {