Skip to content

Commit

Permalink
0.8.5 - add actor based ViewModel by default
Browse files Browse the repository at this point in the history
  • Loading branch information
arnaudgiuliani committed Oct 17, 2019
1 parent 3c026e9 commit 27349ce
Show file tree
Hide file tree
Showing 7 changed files with 65 additions and 59 deletions.
12 changes: 12 additions & 0 deletions Changelog.md
@@ -0,0 +1,12 @@

# Uniflow 馃- Simple Unidirectionnel Data Flow for Android & Kotlin, using Kotlin coroutines and open to functional programming

## Changelog

### 0.8.x

#### 0.8.5

- merge `AndroidDataFlow` and `AndroidActorFlow` classes in both Android libs to provide an actor based ViewModel by default, to ensure event scheduling ordered.


2 changes: 1 addition & 1 deletion README.md
Expand Up @@ -3,7 +3,7 @@

## Setup

#### Current version is `0.8.4`
#### Current version is `0.8.5`

Choose one of the following dependency:

Expand Down
2 changes: 1 addition & 1 deletion gradle/versions.gradle
@@ -1,6 +1,6 @@
ext {
// Koin
uniflow_version = '0.8.4'
uniflow_version = '0.8.5'

// Kotlin
kotlin_version = '1.3.50'
Expand Down
Expand Up @@ -15,37 +15,13 @@
*/
package io.uniflow.android.flow

import io.uniflow.core.dispatcher.UniFlowDispatcher
import io.uniflow.core.flow.ActorFlow
import io.uniflow.core.flow.StateAction
import io.uniflow.core.logger.UniFlowLogger
import io.uniflow.core.threading.onIO
import kotlinx.coroutines.channels.actor
import kotlinx.coroutines.isActive

/**
* AndroidDataFlow
* Unidirectional dataflow with states & events
*
* @author Arnaud Giuliani
*/
abstract class AndroidActorFlow : AndroidDataFlow(), ActorFlow {

override val actorFlow = coroutineScope.actor<StateAction>(UniFlowDispatcher.dispatcher.default(), capacity = 10) {
for (action in channel) {
if (coroutineScope.isActive) {
UniFlowLogger.log("AndroidActorFlow run action $action")
onIO {
proceedAction(action)
}
} else {
UniFlowLogger.log("AndroidActorFlow action cancelled")
}
}
}

override fun onCleared() {
super.onCleared()
actorFlow.close()
}
}
@Deprecated("AndroidActorFlow has been merged into AndroidDataFlow", level = DeprecationLevel.ERROR)
abstract class AndroidActorFlow : AndroidDataFlow(), ActorFlow
Expand Up @@ -18,17 +18,18 @@ package io.uniflow.android.flow
import android.arch.lifecycle.LiveData
import android.arch.lifecycle.MutableLiveData
import android.arch.lifecycle.ViewModel
import io.uniflow.core.flow.DataFlow
import io.uniflow.core.flow.Event
import io.uniflow.core.flow.UIEvent
import io.uniflow.core.flow.UIState
import io.uniflow.core.dispatcher.UniFlowDispatcher
import io.uniflow.core.flow.*
import io.uniflow.core.logger.UniFlowLogger
import io.uniflow.core.threading.onIO
import io.uniflow.core.threading.onMain
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.SupervisorJob
import kotlinx.coroutines.channels.actor
import kotlinx.coroutines.isActive

abstract class AndroidDataFlow : ViewModel(), DataFlow {
abstract class AndroidDataFlow : ViewModel(), ActorFlow {

private val viewModelJob = SupervisorJob()
override val coroutineScope: CoroutineScope = CoroutineScope(Dispatchers.Main + viewModelJob)
Expand Down Expand Up @@ -58,8 +59,26 @@ abstract class AndroidDataFlow : ViewModel(), DataFlow {

override fun getCurrentState(): UIState? = _states.value

override val actorFlow = coroutineScope.actor<StateAction>(UniFlowDispatcher.dispatcher.default(), capacity = CAPACITY) {
for (action in channel) {
if (coroutineScope.isActive) {
UniFlowLogger.log("AndroidActorFlow run action $action")
onIO {
proceedAction(action)
}
} else {
UniFlowLogger.log("AndroidActorFlow action cancelled")
}
}
}

override fun onCleared() {
super.onCleared()
viewModelJob.cancel()
actorFlow.close()
}

companion object {
var CAPACITY = 10
}
}
Expand Up @@ -15,32 +15,13 @@
*/
package io.uniflow.androidx.flow

import io.uniflow.core.dispatcher.UniFlowDispatcher
import io.uniflow.core.flow.ActorFlow
import io.uniflow.core.flow.StateAction
import io.uniflow.core.logger.UniFlowLogger
import io.uniflow.core.threading.onIO
import kotlinx.coroutines.channels.actor
import kotlinx.coroutines.isActive

/**
* AndroidDataFlow
* Unidirectional dataflow with states & events
*
* @author Arnaud Giuliani
*/
abstract class AndroidActorFlow : AndroidDataFlow(), ActorFlow {

override val actorFlow = coroutineScope.actor<StateAction>(UniFlowDispatcher.dispatcher.default(), capacity = 10) {
for (action in channel) {
if (coroutineScope.isActive) {
UniFlowLogger.log("AndroidActorFlow run action $action")
onIO {
proceedAction(action)
}
} else {
UniFlowLogger.log("AndroidActorFlow action cancelled")
}
}
}
}
@Deprecated("AndroidActorFlow has been merged into AndroidDataFlow", level = DeprecationLevel.ERROR)
abstract class AndroidActorFlow : AndroidDataFlow(), ActorFlow
Expand Up @@ -19,15 +19,16 @@ import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import io.uniflow.core.flow.DataFlow
import io.uniflow.core.flow.Event
import io.uniflow.core.flow.UIEvent
import io.uniflow.core.flow.UIState
import io.uniflow.core.dispatcher.UniFlowDispatcher
import io.uniflow.core.flow.*
import io.uniflow.core.logger.UniFlowLogger
import io.uniflow.core.threading.onIO
import io.uniflow.core.threading.onMain
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.actor
import kotlinx.coroutines.isActive

abstract class AndroidDataFlow : ViewModel(), DataFlow {
abstract class AndroidDataFlow : ViewModel(), ActorFlow {

override val coroutineScope: CoroutineScope = viewModelScope

Expand Down Expand Up @@ -55,4 +56,21 @@ abstract class AndroidDataFlow : ViewModel(), DataFlow {
}

override fun getCurrentState(): UIState? = _states.value

override val actorFlow = coroutineScope.actor<StateAction>(UniFlowDispatcher.dispatcher.default(), capacity = CAPACITY) {
for (action in channel) {
if (coroutineScope.isActive) {
UniFlowLogger.log("AndroidActorFlow run action $action")
onIO {
proceedAction(action)
}
} else {
UniFlowLogger.log("AndroidActorFlow action cancelled")
}
}
}

companion object {
var CAPACITY = 10
}
}

0 comments on commit 27349ce

Please sign in to comment.