Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
Artur Artikov committed Oct 13, 2021
2 parents b7ebf05 + e499c1f commit 46cca40
Show file tree
Hide file tree
Showing 7 changed files with 288 additions and 19 deletions.
16 changes: 8 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,14 @@ Sesame components are separate modules. Use only that you like.
## Gradle Setup
```gradle
dependencies {
implementation 'com.github.aartikov:sesame-property:1.1.0-beta1'
implementation 'com.github.aartikov:sesame-dialog:1.1.0-beta1'
implementation 'com.github.aartikov:sesame-navigation:1.1.0-beta1'
implementation 'com.github.aartikov:sesame-activable:1.1.0-beta1'
implementation 'com.github.aartikov:sesame-loading:1.1.0-beta1'
implementation 'com.github.aartikov:sesame-loop:1.1.0-beta1'
implementation 'com.github.aartikov:sesame-localized-string:1.1.0-beta1'
implementation 'com.github.aartikov:sesame-form:1.1.0-beta1'
implementation 'com.github.aartikov:sesame-property:1.2.0-beta1'
implementation 'com.github.aartikov:sesame-dialog:1.2.0-beta1'
implementation 'com.github.aartikov:sesame-navigation:1.2.0-beta1'
implementation 'com.github.aartikov:sesame-activable:1.2.0-beta1'
implementation 'com.github.aartikov:sesame-loading:1.2.0-beta1'
implementation 'com.github.aartikov:sesame-loop:1.2.0-beta1'
implementation 'com.github.aartikov:sesame-localized-string:1.2.0-beta1'
implementation 'com.github.aartikov:sesame-form:1.2.0-beta1'
}
```

Expand Down
2 changes: 1 addition & 1 deletion publish.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ apply plugin: 'org.jetbrains.dokka'

ext {
PUBLISH_GROUP_ID = 'com.github.aartikov'
PUBLISH_VERSION = '1.1.0-beta1'
PUBLISH_VERSION = '1.2.0-beta1'
DESCRIPTION = 'Sesame is a set of architecture components for Android development'

GITHUB_USER = 'aartikov'
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import me.aartikov.sesame.loading.paged.DataMerger
import me.aartikov.sesame.loading.paged.PagedLoader
import me.aartikov.sesame.loading.paged.PagedLoading
import me.aartikov.sesame.loading.paged.PagedLoading.Event
import me.aartikov.sesame.loading.paged.PagedLoading.State
import me.aartikov.sesame.loop.startIn

internal class PagedLoadingImpl<T : Any>(
scope: CoroutineScope,
Expand Down Expand Up @@ -39,9 +39,7 @@ internal class PagedLoadingImpl<T : Any>(
get() = mutableEventFlow

init {
scope.launch {
loop.start()
}
loop.startIn(scope)
}

override fun loadFirstPage(fresh: Boolean, reset: Boolean) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@ import kotlinx.coroutines.channels.BufferOverflow
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.launch
import me.aartikov.sesame.loading.simple.Loading
import me.aartikov.sesame.loading.simple.Loading.Event
import me.aartikov.sesame.loading.simple.Loading.State
import me.aartikov.sesame.loop.ActionSource
import me.aartikov.sesame.loop.EffectHandler
import me.aartikov.sesame.loop.startIn

internal class LoadingImpl<T : Any>(
scope: CoroutineScope,
Expand Down Expand Up @@ -42,9 +42,7 @@ internal class LoadingImpl<T : Any>(
get() = mutableEventFlow

init {
scope.launch {
loop.start()
}
loop.startIn(scope)
}

override fun load(fresh: Boolean, reset: Boolean) {
Expand Down
5 changes: 3 additions & 2 deletions sesame-loop/src/main/kotlin/me/aartikov/sesame/loop/Loop.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package me.aartikov.sesame.loop

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.MutableStateFlow
Expand Down Expand Up @@ -107,8 +108,8 @@ open class Loop<StateT, ActionT, EffectT>(
/**
* A helper method to start [Loop] in a [scope].
*/
fun <StateT, ActionT, EffectT> Loop<StateT, ActionT, EffectT>.startIn(scope: CoroutineScope) {
scope.launch {
fun <StateT, ActionT, EffectT> Loop<StateT, ActionT, EffectT>.startIn(scope: CoroutineScope): Job {
return scope.launch {
start()
}
}
158 changes: 158 additions & 0 deletions sesame-property/src/main/kotlin/me/aartikov/sesame/property/Autorun.kt
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,164 @@ fun <T1, T2, T3, T4, T5> PropertyHost.autorun(
}
}

/**
* Runs a [block] whenever any of the given observable properties is changed.
* @param debounceTimeoutMillis optional debounce setting.
*/
@Suppress("UNCHECKED_CAST")
fun <T1, T2, T3, T4, T5, T6> PropertyHost.autorun(
property1: KProperty0<T1>,
property2: KProperty0<T2>,
property3: KProperty0<T3>,
property4: KProperty0<T4>,
property5: KProperty0<T5>,
property6: KProperty0<T6>,
debounceTimeoutMillis: Long? = null,
block: (T1, T2, T3, T4, T5, T6) -> Unit
) {
autorunImpl(
property1,
property2,
property3,
property4,
property5,
property6,
debounceTimeoutMillis = debounceTimeoutMillis
) { args: List<*> ->
block(
args[0] as T1,
args[1] as T2,
args[2] as T3,
args[3] as T4,
args[4] as T5,
args[5] as T6
)
}
}

/**
* Runs a [block] whenever any of the given observable properties is changed.
* @param debounceTimeoutMillis optional debounce setting.
*/
@Suppress("UNCHECKED_CAST")
fun <T1, T2, T3, T4, T5, T6, T7> PropertyHost.autorun(
property1: KProperty0<T1>,
property2: KProperty0<T2>,
property3: KProperty0<T3>,
property4: KProperty0<T4>,
property5: KProperty0<T5>,
property6: KProperty0<T6>,
property7: KProperty0<T7>,
debounceTimeoutMillis: Long? = null,
block: (T1, T2, T3, T4, T5, T6, T7) -> Unit
) {
autorunImpl(
property1,
property2,
property3,
property4,
property5,
property6,
property7,
debounceTimeoutMillis = debounceTimeoutMillis
) { args: List<*> ->
block(
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
)
}
}

/**
* Runs a [block] whenever any of the given observable properties is changed.
* @param debounceTimeoutMillis optional debounce setting.
*/
@Suppress("UNCHECKED_CAST")
fun <T1, T2, T3, T4, T5, T6, T7, T8> PropertyHost.autorun(
property1: KProperty0<T1>,
property2: KProperty0<T2>,
property3: KProperty0<T3>,
property4: KProperty0<T4>,
property5: KProperty0<T5>,
property6: KProperty0<T6>,
property7: KProperty0<T7>,
property8: KProperty0<T8>,
debounceTimeoutMillis: Long? = null,
block: (T1, T2, T3, T4, T5, T6, T7, T8) -> Unit
) {
autorunImpl(
property1,
property2,
property3,
property4,
property5,
property6,
property7,
property8,
debounceTimeoutMillis = debounceTimeoutMillis
) { args: List<*> ->
block(
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
)
}
}

/**
* Runs a [block] whenever any of the given observable properties is changed.
* @param debounceTimeoutMillis optional debounce setting.
*/
@Suppress("UNCHECKED_CAST")
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9> PropertyHost.autorun(
property1: KProperty0<T1>,
property2: KProperty0<T2>,
property3: KProperty0<T3>,
property4: KProperty0<T4>,
property5: KProperty0<T5>,
property6: KProperty0<T6>,
property7: KProperty0<T7>,
property8: KProperty0<T8>,
property9: KProperty0<T9>,
debounceTimeoutMillis: Long? = null,
block: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> Unit
) {
autorunImpl(
property1,
property2,
property3,
property4,
property5,
property6,
property7,
property8,
property9,
debounceTimeoutMillis = debounceTimeoutMillis
) { args: List<*> ->
block(
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
)
}
}

private inline fun <T> PropertyHost.autorunImpl(
vararg properties: KProperty0<T>,
debounceTimeoutMillis: Long?,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,120 @@ fun <T1, T2, T3, T4, T5, R> PropertyHost.computed(
}
}

/**
* Creates a read-only observable property that is automatically kept in sync with the other observable properties.
*/
@Suppress("UNCHECKED_CAST")
fun <T1, T2, T3, T4, T5, T6, R> PropertyHost.computed(
property1: KProperty0<T1>,
property2: KProperty0<T2>,
property3: KProperty0<T3>,
property4: KProperty0<T4>,
property5: KProperty0<T5>,
property6: KProperty0<T6>,
transform: (T1, T2, T3, T4, T5, T6) -> R
): StateDelegate<R> {
return computedImpl(property1, property2, property3, property4, property5, property6) { args: List<*> ->
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
)
}
}

/**
* Creates a read-only observable property that is automatically kept in sync with the other observable properties.
*/
@Suppress("UNCHECKED_CAST")
fun <T1, T2, T3, T4, T5, T6, T7, R> PropertyHost.computed(
property1: KProperty0<T1>,
property2: KProperty0<T2>,
property3: KProperty0<T3>,
property4: KProperty0<T4>,
property5: KProperty0<T5>,
property6: KProperty0<T6>,
property7: KProperty0<T7>,
transform: (T1, T2, T3, T4, T5, T6, T7) -> R
): StateDelegate<R> {
return computedImpl(property1, property2, property3, property4, property5, property6, property7) { args: List<*> ->
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
)
}
}

/**
* Creates a read-only observable property that is automatically kept in sync with the other observable properties.
*/
@Suppress("UNCHECKED_CAST")
fun <T1, T2, T3, T4, T5, T6, T7, T8, R> PropertyHost.computed(
property1: KProperty0<T1>,
property2: KProperty0<T2>,
property3: KProperty0<T3>,
property4: KProperty0<T4>,
property5: KProperty0<T5>,
property6: KProperty0<T6>,
property7: KProperty0<T7>,
property8: KProperty0<T8>,
transform: (T1, T2, T3, T4, T5, T6, T7, T8) -> R
): StateDelegate<R> {
return computedImpl(property1, property2, property3, property4, property5,
property6, property7, property8) { args: List<*> ->
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
)
}
}

/**
* Creates a read-only observable property that is automatically kept in sync with the other observable properties.
*/
@Suppress("UNCHECKED_CAST")
fun <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> PropertyHost.computed(
property1: KProperty0<T1>,
property2: KProperty0<T2>,
property3: KProperty0<T3>,
property4: KProperty0<T4>,
property5: KProperty0<T5>,
property6: KProperty0<T6>,
property7: KProperty0<T7>,
property8: KProperty0<T8>,
property9: KProperty0<T9>,
transform: (T1, T2, T3, T4, T5, T6, T7, T8, T9) -> R
): StateDelegate<R> {
return computedImpl(property1, property2, property3, property4, property5,
property6, property7, property8, property9) { args: List<*> ->
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
)
}
}

private inline fun <T, R> PropertyHost.computedImpl(
vararg properties: KProperty0<T>,
crossinline transform: (List<T>) -> R
Expand Down

0 comments on commit 46cca40

Please # to comment.