Last active
April 9, 2018 17:49
-
-
Save Laimiux/95ebed92db9cb9edd6321985dc9feaca to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
fun reduce(event: TextChangedEvent): (CommentFormData) -> CommentFormData { | |
// implementation | |
return { state -> | |
// Let's check comment validity | |
val isValid = event.enteredText.length > 5 | |
// Update the current state with the changes | |
return state.copy(comment = event.enteredText, isCommentValid = isValid) | |
} | |
} | |
fun reduce(event: Lce<Comment>): (CommentFormData) -> CommentFormData { | |
// Update the submit request | |
return { state -> state.copy(submitRequest = event) } | |
} | |
fun formState( | |
textChangedEvents: Observable<TextChangedEvent>, | |
submitEvents: Observable<SubmitCommentEvent> | |
) : Observable<CommentFormData> { | |
val textChangedReducer: Observable<(CommentFormData) -> CommentFormData> = textChangedEvents.map { textEvent -> reduce(textEvent) } | |
// Explicitly declaring the type, for clarity sake | |
val requestStateReducer: Observable<(CommentFormData) -> CommentFormData> = submitEvents | |
.switchMap { event -> commentRepo.submit(event.comment) } | |
.map { lceEvent -> reduce(lceEvent) } | |
// We now have a clear common type (which happens to be a lambda) | |
val reducers: Observable<(CommentFormData) -> CommentFormData> = Observable.merge(textChangedReducer, requestStateReducer) | |
// And to finish this | |
return reducers.scan(initialState) { reducer, state -> reducer.invoke(state) } | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment