Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@Laimiux
Last active April 9, 2018 17:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Laimiux/95ebed92db9cb9edd6321985dc9feaca to your computer and use it in GitHub Desktop.
Save Laimiux/95ebed92db9cb9edd6321985dc9feaca to your computer and use it in GitHub Desktop.
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