Skip to content

Commit d88844e

Browse files
committed
refactor: sealed interface
1 parent b5e955c commit d88844e

File tree

2 files changed

+48
-36
lines changed

2 files changed

+48
-36
lines changed

feature-add/src/main/java/com/hoc/flowmvi/ui/add/AddContract.kt

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import com.hoc.flowmvi.mvi_base.MviIntent
1010
import com.hoc.flowmvi.mvi_base.MviSingleEvent
1111
import com.hoc.flowmvi.mvi_base.MviViewState
1212
import kotlinx.collections.immutable.PersistentSet
13+
import kotlinx.collections.immutable.mutate
1314
import kotlinx.collections.immutable.persistentHashSetOf
1415
import kotlinx.parcelize.Parceler
1516
import kotlinx.parcelize.Parcelize
@@ -18,9 +19,9 @@ import kotlinx.parcelize.TypeParceler
1819
internal object UserValidationErrorPersistentSetParceler :
1920
Parceler<PersistentSet<UserValidationError>> {
2021
override fun create(parcel: Parcel) =
21-
persistentHashSetOf<UserValidationError>().apply {
22+
persistentHashSetOf<UserValidationError>().mutate { errors ->
2223
repeat(parcel.readInt()) {
23-
add(UserValidationError.valueOf(parcel.readString()!!))
24+
errors.add(UserValidationError.valueOf(parcel.readString()!!))
2425
}
2526
}
2627

@@ -59,6 +60,7 @@ data class ViewState(
5960
}
6061
}
6162

63+
@Immutable
6264
sealed interface ViewIntent : MviIntent {
6365
data class EmailChanged(val email: String) : ViewIntent
6466
data class FirstNameChanged(val firstName: String) : ViewIntent
@@ -76,10 +78,10 @@ internal sealed interface PartialStateChange {
7678
else viewState.copy(errors = errors)
7779
}
7880

79-
sealed class AddUser : PartialStateChange {
80-
object Loading : AddUser()
81-
data class AddUserSuccess(val user: User) : AddUser()
82-
data class AddUserFailure(val user: User, val error: UserError) : AddUser()
81+
sealed interface AddUser : PartialStateChange {
82+
object Loading : AddUser
83+
data class AddUserSuccess(val user: User) : AddUser
84+
data class AddUserFailure(val user: User, val error: UserError) : AddUser
8385

8486
override fun reduce(viewState: ViewState): ViewState {
8587
return when (this) {
@@ -90,21 +92,30 @@ internal sealed interface PartialStateChange {
9092
}
9193
}
9294

93-
sealed class FirstChange : PartialStateChange {
94-
object EmailChangedFirstTime : FirstChange()
95-
object FirstNameChangedFirstTime : FirstChange()
96-
object LastNameChangedFirstTime : FirstChange()
95+
sealed interface FirstChange : PartialStateChange {
96+
object EmailChangedFirstTime : FirstChange
97+
object FirstNameChangedFirstTime : FirstChange
98+
object LastNameChangedFirstTime : FirstChange
9799

98100
override fun reduce(viewState: ViewState): ViewState {
99101
return when (this) {
100-
EmailChangedFirstTime -> viewState.copy(emailChanged = true)
101-
FirstNameChangedFirstTime -> viewState.copy(firstNameChanged = true)
102-
LastNameChangedFirstTime -> viewState.copy(lastNameChanged = true)
102+
EmailChangedFirstTime -> {
103+
if (viewState.emailChanged) viewState
104+
else viewState.copy(emailChanged = true)
105+
}
106+
FirstNameChangedFirstTime -> {
107+
if (viewState.firstNameChanged) viewState
108+
else viewState.copy(firstNameChanged = true)
109+
}
110+
LastNameChangedFirstTime -> {
111+
if (viewState.lastNameChanged) viewState
112+
else viewState.copy(lastNameChanged = true)
113+
}
103114
}
104115
}
105116
}
106117

107-
sealed class FormValue : PartialStateChange {
118+
sealed interface FormValue : PartialStateChange {
108119
override fun reduce(viewState: ViewState): ViewState {
109120
return when (this) {
110121
is EmailChanged -> {
@@ -122,9 +133,9 @@ internal sealed interface PartialStateChange {
122133
}
123134
}
124135

125-
data class EmailChanged(val email: String?) : FormValue()
126-
data class FirstNameChanged(val firstName: String?) : FormValue()
127-
data class LastNameChanged(val lastName: String?) : FormValue()
136+
data class EmailChanged(val email: String?) : FormValue
137+
data class FirstNameChanged(val firstName: String?) : FormValue
138+
data class LastNameChanged(val lastName: String?) : FormValue
128139
}
129140
}
130141

feature-main/src/main/java/com/hoc/flowmvi/ui/main/MainContract.kt

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ data class UserItem(
4141
).toEither().mapLeft { UserError.ValidationFailed(it.toSet()) }
4242
}
4343

44+
@Immutable
4445
sealed interface ViewIntent : MviIntent {
4546
object Initial : ViewIntent
4647
object Refresh : ViewIntent
@@ -68,7 +69,7 @@ data class ViewState(
6869
internal sealed interface PartialStateChange {
6970
fun reduce(viewState: ViewState): ViewState
7071

71-
sealed class Users : PartialStateChange {
72+
sealed interface Users : PartialStateChange {
7273
override fun reduce(viewState: ViewState): ViewState {
7374
return when (this) {
7475
Loading -> viewState.copy(
@@ -87,12 +88,12 @@ internal sealed interface PartialStateChange {
8788
}
8889
}
8990

90-
object Loading : Users()
91-
data class Data(val users: List<UserItem>) : Users()
92-
data class Error(val error: UserError) : Users()
91+
object Loading : Users
92+
data class Data(val users: List<UserItem>) : Users
93+
data class Error(val error: UserError) : Users
9394
}
9495

95-
sealed class Refresh : PartialStateChange {
96+
sealed interface Refresh : PartialStateChange {
9697
override fun reduce(viewState: ViewState): ViewState {
9798
return when (this) {
9899
is Success -> viewState.copy(isRefreshing = false)
@@ -101,15 +102,15 @@ internal sealed interface PartialStateChange {
101102
}
102103
}
103104

104-
object Loading : Refresh()
105-
object Success : Refresh()
106-
data class Failure(val error: UserError) : Refresh()
105+
object Loading : Refresh
106+
object Success : Refresh
107+
data class Failure(val error: UserError) : Refresh
107108
}
108109

109-
sealed class RemoveUser : PartialStateChange {
110-
data class Loading(val user: UserItem) : RemoveUser()
111-
data class Success(val user: UserItem) : RemoveUser()
112-
data class Failure(val user: UserItem, val error: Throwable) : RemoveUser()
110+
sealed interface RemoveUser : PartialStateChange {
111+
data class Loading(val user: UserItem) : RemoveUser
112+
data class Success(val user: UserItem) : RemoveUser
113+
data class Failure(val user: UserItem, val error: UserError) : RemoveUser
113114

114115
override fun reduce(viewState: ViewState) = when (this) {
115116
is Failure -> {
@@ -140,15 +141,15 @@ internal sealed interface PartialStateChange {
140141
}
141142

142143
sealed interface SingleEvent : MviSingleEvent {
143-
sealed class Refresh : SingleEvent {
144-
object Success : Refresh()
145-
data class Failure(val error: Throwable) : Refresh()
144+
sealed interface Refresh : SingleEvent {
145+
object Success : Refresh
146+
data class Failure(val error: UserError) : Refresh
146147
}
147148

148-
data class GetUsersError(val error: Throwable) : SingleEvent
149+
data class GetUsersError(val error: UserError) : SingleEvent
149150

150-
sealed class RemoveUser : SingleEvent {
151-
data class Success(val user: UserItem) : RemoveUser()
152-
data class Failure(val user: UserItem, val error: Throwable) : RemoveUser()
151+
sealed interface RemoveUser : SingleEvent {
152+
data class Success(val user: UserItem) : RemoveUser
153+
data class Failure(val user: UserItem, val error: UserError) : RemoveUser
153154
}
154155
}

0 commit comments

Comments
 (0)