SlideShare a Scribd company logo
1 of 152
Download to read offline
UI Navigation
Mike Nakhimovich
Dispatching State
Mike Nakhimovich
Apps have a UI
Apps have a UI
Search View
Apps have a UI
Search View
ResultsView
Apps have a UI
Search View
ResultsView
ErrorView
Apps have a UI
Search View
ResultsView
ErrorView
LoadingView
Users interact with the UI
Pizza
Interactions lead to State change
Pizza
Pizza
Interactions lead to State change
PizzaPizza
State change need to be rendered
What is state?
A representation of UI
at a certain point in time
What is state?
State determines how the
UI renders & behaves
Android lacks patterns for
working with state & views
How to create state
How to pass state
How to hold state
How do we think about state?
data class ScreenState(
val searchResults:List<Results>,
val searchTerm:String,
val isLoading:Boolean)
Example: state modeled as a single data class
data class ScreenState(
val searchResults:List<Results>,
val searchTerm:String,
val isLoading:Boolean,
val CartItems:List<Items>,
val userId:Long
Example: state modeled as a single growing data class
data class ScreenState(
val searchResults:List<Results>,
val searchTerm:String,
val isLoading:Boolean,
val CartItems:List<Items>,
val userId:Long
State modeled as a God class
Android devs love being reactive,
why not represent state as a stream?
Lately, I’ve been using a
centralized dispatcher to model
state as a reactive stream
What’s a dispatcher?
A dispatcher is an object that receives
and sends messages about state
that the UI reacts to
A dispatcher is an object that receives
and sends messages about state
Why a state dispatcher?
Decouple producers of state
change from its consumers
Why a state dispatcher?
Journey to dispatcher
User types a search term
Pizza
User clicks search
Pizza
Loading should become visible
Pizza
Followed by results
Pizza
Pizza
Proposal 1: Encapsulate Screen
in a ScreenPresenter
How do we tell views what to display?
PizzaScreen Presenter
SearchView ResultsView
Pizza
Proposal 1: Encapsulate Screen
in a ScreenPresenter
How do we tell ResultsViews what to display?
Pizza
But then… Product adds another view
PizzaScreen Presenter
SearchView ResultsViewLoadingView
And then… Product adds 3 more views
Pizza
PizzaScreen Presenter
SearchView ResultsViewLoading
ProfileTab DrawerViewCartView
Proposal 1: Create a ScreenPresenter
which contains both Presenters
How do we tell ResultsView what to display?
Pizza
Not very scalable
How do we tell ResultsView what to display?
Pizza
Proposal 2: Create a Listener
Proposal 2: Create a Listener
Pizza
SearchViewResultsView
Listens To
Proposal 2: Create a Listener
SearchViewResultsView
Listens To
LoadingView
ListensTo
Listens
To
Proposal 2: Create a Listener
Listeners lead to circular dependencies
Last Proposal
Use a centralized dispatcher
for ALL state change
A Dispatcher is responsible for receiving
state changes and emitting them
Use a centralized dispatcher
for ALL state change
Why a state dispatcher?
Views become coupled to the dispatcher not each other
SearchViewResultsView LoadingView
Dispatcher
Reactive state
UI creates new state
Reactive state
UI reacts to new state
Reactive state
With no hard references between UI
elements
Reactive state
Push rather than pull
Implementing reactive state
Reactive state
Sealed class State{
data class ShowingLoading():State
data class ShowingResults(val results:List<String>):State
data class ShowingError(val error:Error):State
}
Represent your state as immutable value objects
Reactive state
Push new state through a reactive stream
Interface Dispatcher
fun dispatch(state: State)
}
interface RxState {
fun <T> ofType(clazz: Class<T>): Observable<T>
}
Sealed class State{
data class ShowingLoading():State
data class ShowingResults(val results:List<String>):State
data class ShowingError(val error:Error):State
}
Reactive state
Anytime UI needs to change, dispatch a new state
dispatcher.dispatch(State.ShowingResults(resultData)
dispatcher.dispatch(State.ShowingLoading()
dispatcher.dispatch(State.ShowingError(errors)
Reactive state
Anytime state changes, react to new state
rxState.ofType(State.Results)
.map{it.data}
.subscribe{ mvpView.updateUI(data) }
Rather than tightly coupling Search & Results
we decouple them with a dispatcher
Reactive state visualized
Dispatcher
Reactive state
ResultsPresenter Subscribes to ShowResults states change
Dispatcher
ResultsPresenter
Reactive state
LoadingPresenter Subscribes to ShowLoading states change
Dispatcher
ResultsPresenter
LoadingPresenter
Reactive state
Dispatcher
SearchPresenterSearchView
SearchTerm
Reactive state
Dispatcher
SearchPresenterSearchView
SearchTerm
ShowingLoading
Reactive state
Dispatcher
SearchPresenterSearchView
SearchTerm
ShowingLoading
Reactive state
Dispatcher
SearchPresenterSearchView
SearchTerm
ShowingLoading
Reactive state
Dispatcher
SearchPresenterSearchView
SearchTerm
ShowingLoading
LoadingPresenter
Reactive state
Dispatcher
SearchPresenterSearchView
SearchTerm
ShowingLoading
LoadingPresenter
Reactive state
Dispatcher
SearchPresenterSearchView
SearchTerm
Reactive state
Search Presenter calls dispatcher.dispatch(State.ShowingResults(resultData)
Dispatcher
SearchPresenterSearchView
SearchTerm
ShowingResults
Reactive state
Dispatcher needs to emit a new State to subscribers
Dispatcher
SearchPresenter
ResultsPresenter
SearchView
SearchTerm
ShowingResults
Reactive state
Dispatcher Emits new ShowingResults State to ResultsPresenter
Dispatcher
SearchPresenter
ResultsPresenter
SearchView
SearchTerm
ShowingResults
Reactive state
Dispatcher Emits new ShowingResults State to subscribers
Dispatcher
SearchPresenterSearchView
SearchTerm
ShowingResults
ResultsPresenter
Reactive state
Dispatcher Emits new ShowingResults State to subscribers
Dispatcher
SearchPresenter
ResultsPresenter
SearchView
SearchTerm
ResultsView
ShowingResults
Reactive state
Multiple Views can listen to same state change Dispatcher
SearchPresenterSearchView
SearchTerm
ResultsPresenterResultsView
LoadingPresenterLoadingView
Reactive state
Dispatcher
SearchPresenterSearchView
ShowingResults
LoadingPresenterLoadingView
ResultsPresenterResultsView
Reactive state
Dispatcher
SearchPresenterSearchView
ShowingResultsShowingResults
LoadingPresenterLoadingView
ResultsPresenterResultsView
Reactive state
Dispatcher
SearchPresenterSearchView
ShowingResults
ShowingResults
LoadingPresenterLoadingView
ResultsPresenterResultsView
Reactive state
Dispatcher
SearchPresenterSearchView
ShowingResults
ShowingResults
LoadingPresenterLoadingView
ResultsPresenterResultsView
Reactive state
Dispatcher
SearchPresenterSearchView
ShowResults
Hide View
LoadingPresenterLoadingView
ResultsPresenterResultsView
Interacting with a dispatcher
Pizza
override fun attachView(view: NearYouMVPView) {
rxState.ofType(State.Results)
.map{it.data}
.subscribe{ mvpView.updateUI(data) }
}
Presenter subscribes on attach
Another presenter dispatches state change
Pizza
fun searchFor(searchTerm:String){
store.getResults(searchTerm)
.subscribe{dispatcher.dispatch(State.Results(data=it.results)}
Dispatcher emits state change
Pizza
fun searchFor(searchTerm:String){
store.getResults(searchTerm)
.subscribe{dispatcher.dispatch(State.Results(data=it.results)}
override fun attachView(view: NearYouMVPView) {
rxState.ofType(State.Results)
.map{it.data}
.subscribe{ mvpView.updateUI(data) }
}
Consumers & Producers of state stay decoupled
Pizza
fun searchFor(searchTerm:String){
store.getResults(searchTerm)
.subscribe{dispatcher.dispatch(State.Results(data=it.results)}
override fun attachView(view: NearYouMVPView) {
rxState.ofType(State.Results)
.map{it.data}
.subscribe{ mvpView.updateUI(data) }
}
How does data flow?
Reactive state
Dispatcher
SearchPresenterSearchView
ResultsPresenterResultsView
Reactive state
Dispatcher
SearchPresenterSearchView
ResultsPresenterResultsView
ShowingResults1
Reactive state
Dispatcher
SearchPresenterSearchView
ResultsPresenterResultsView
ShowingResults1
Reactive state
Dispatcher
SearchPresenterSearchView
ResultsPresenterResultsView
ShowingResults1
Reactive state
Dispatcher
SearchPresenterSearchView
ResultsPresenterResultsView ShowingResults1
Reactive state
Dispatcher
SearchPresenterSearchView
ResultsPresenterResultsView
ShowingResults2
Reactive state
Dispatcher
SearchPresenterSearchView
ResultsPresenterResultsView
ShowingResults2
Reactive state
Dispatcher
SearchPresenterSearchView
ResultsPresenterResultsView
ShowingResults2
Reactive state
Dispatcher
SearchPresenterSearchView
ResultsPresenterResultsView ShowingResults2
Reactive state
Dispatcher
SearchPresenterSearchView
ResultsPresenterResultsView
CartPresenter
More state
Dispatcher
SearchPresenterSearchView
ResultsPresenterResultsView
CartPresenter
Add To Cart
Dispatcher
SearchPresenterSearchView
ResultsPresenterResultsView
CartPresenter
Add To Cart
More state
Dispatcher
SearchPresenterSearchView
ResultsPresenterResultsView
CartPresenter
Add To Cart
More state
Dispatcher
SearchPresenterSearchView
ResultsPresenterResultsView
CartPresenter
Add To Cart
More state
Dispatcher
SearchPresenterSearchView
ResultsPresenterResultsView
CartPresenterCartView
Add To Cart
More state
Dispatcher
SearchPresenterSearchView
ResultsPresenterResultsView
CartPresenterCartView
Add To Cart
More state
Emitting data is nice…
How about showing/hiding views?
When user clicks on cart, we
should show the cart view
HomeScreen
SearchView ResultsViewCartView
How?
We can combine state changes
through composition
Showing states
sealed class State {
object Cart : State()
data class Showing(val state: State) : State()
}
Showing states
dispatcher.dispatch(State.Showing(Cart))
sealed class State {
object Cart : State()
data class Showing(val state: State) : State()
}
Showing states
rxState.showing(Cart::class.java))
.subscribe({
mvpView.showCart()
}))
interface RxState {
fun showingNot(clazz: Class<out Screen>): Observable<Showing>
fun showing(clazz: Class<out Screen>): Observable<Showing>
}
We can show/hide views based on showing states
rxState.showingNot(Cart::class.java))
.subscribe({
mvpView.hide()
}))
rxState.showing(Cart::class.java))
.subscribe({
mvpView.showCart()
}))
Dispatching showing cart
rxState.showingNot(Cart::class.java))
.subscribe({
mvpView.hide()
}))
dispatcher.dispatch(State.Showing(Cart)) rxState.showing(Cart::class.java))
.subscribe({
mvpView.showCart()
}))
Dispatching Showing Checkout
Checkout
rxState.showingNot(Cart::class.java))
.subscribe({
mvpView.hide()
}))
dispatcher.dispatch(State.Showing(Checkout)) rxState.showing(Cart::class.java))
.subscribe({
mvpView.showCart()
}))
Showing/hiding works well
when all views attached
Not very scalable in real apps
Showing/hiding works well
when all views attached
How do we deal with deep flows?
How do we deal with deep flows?
Treat screen creation/routing as a state change
Dispatching screens workflow
Checkout
CartPresenterCartView
Checkout
CartPresenterCartView
Go To Checkout
Checkout
Screen.Checkout
CartPresenterCartView
Checkout
Screen.Checkout
CartPresenterCartView
Checkout
ScreenCreator
CartPresenterCartView
Creating(Screen.Checkout)
Checkout
ScreenCreator
CartPresenterCartView
Creating(Screen.Checkout)
Hidden CheckoutVIew
CartPresenterCartView
Screen.Checkout
ScreenCreator
CheckoutPresenter
CheckoutView
Hidden CheckoutVIew
CartPresenterCartView
Showing(Screen.Checkout)
ScreenCreator
CheckoutPresenter
CheckoutView
Hidden CheckoutVIew
CartPresenterCartView
Showing(Screen.Checkout)
ScreenCreator
CheckoutPresenter
CheckoutView
Hidden CheckoutVIew
CartPresenterCartView
Showing(Screen.Checkout)
ScreenCreator
CheckoutPresenter
CheckoutView
CheckoutView
With Data
CartPresenterCartView
Showing(Screen.Checkout)
ScreenCreator
CheckoutPresenter
CheckoutView
View tells presenter to go to new screen
presenter.openCart()
Presenter dispatches new screen state
sealed class Screen : State() {
data class Checkout(val payload:String) : Screen()
}
dispatcher.dispatch(Screen.Checkout)
Dispatcher encapsulates in a creating state
dispatcher.dispatch(Creating(Screen.Checkout))
Screen creator creates view/presenter
rxState.creating()
.subscribe({
createScreen(it)
})
Dispatches a showing state
rxState.creating()
.subscribe({
createScreen(it)
dispatcher.dispatch(Showing(it.screen))
})
Dispatcher adds each showing event to a back stack
override fun dispatch(state: State) {
when (state) {
is Showing->{
backstack.push(state)
rxState.push(state)
}
else -> rxState.push(state)
}
}
Dispatcher adds each showing event to a back stack
override fun dispatch(state: State) {
when (state) {
is Showing->{
backstack.push(state)
rxState.push(state)
}
else -> rxState.push(state)
}
}
val backstack: Stack<Showing> = Stack()
Dispatcher pushes new state to subscribers
override fun dispatch(state: State) {
when (state) {
is Showing->{
backstack.push(state)
rxState.push(state)
}
else -> rxState.push(state)
}
}
Presenter reacts to the showing state
override fun attachView(mvpView: CheckoutMVPView) {
rxState.showing(Screen.Checkout::class.java)
.observeOn(AndroidSchedulers.mainThread())
.subscribe { mvpView.show() }
Screens = States
sealed class Screen : State() {
object Search : Screen()
object Cart:Screen()
Data class Checkout(val items:List<Item>) : Screen()
data class Payment(val items:List<Item>) : Screen()
}
Routing becomes a state change
sealed class Screen : State() {
object Search : Screen()
object Cart:Screen()
Data class Checkout(val items:List<Item>) : Screen()
data class Payment(val items:List<Item>) : Screen()
}
fun goToSearch() {dispatcher.dispatch(Screen.Search)}
fun openCart() { dispatcher.dispatch(Screen.Cart) }
fun submitNames(firstName: String, lastName: String) {
userRepository.update(firstName, lastName)
.subscribe { dispatcher.dispatch(Screen.CheckoutPayment(cartItems)) }
}
Need to go back?
Dispatcher.goBack()
override fun onBackPressed() {
dispatcher.goBack()
}
interface Dispatcher {
fun dispatch(state: State)
fun goBack()
}
Dispatcher.goBack()
Dispatcher will pop current showing state and
dispatch previous one again
interface Dispatcher {
fun dispatch(state: State)
fun goBack()
}
override fun onBackPressed() {
dispatcher.goBack()
}
State Stack = Back Stack
override fun onBackPressed() {
dispatcher.goBack()
}
interface Dispatcher {
fun dispatch(state: State)
fun goBack()
}
Back Stack = State Stack
interface Dispatcher {
fun dispatch(state: State)
fun goBack()
}
override fun onBackPressed() {
dispatcher.goBack()
}
Routing becomes a state change
Every view interaction becomes a state change
Your UI becomes a representation
of dispatched state
Which is dispatched by your UI
TLDR: Your app becomes a cycle
TLDR: Your app becomes a cycle
User interacts with view
TLDR: Your app becomes a cycle
User interacts with view
View dispatches state change
TLDR: Your app becomes a cycle
User interacts with view
View dispatches state change
View reacts to state change
TLDR: Your app becomes a cycle
User interacts with view
View dispatches state change
View reacts to state change
User interacts with view
github.com/
digitalbuddha/Dispatcher
Big thank you to Efeturi
Money for the UI

More Related Content

Similar to Dispatching Reactive State

Clean VIP (Clean Swift) architecture
Clean VIP (Clean Swift) architectureClean VIP (Clean Swift) architecture
Clean VIP (Clean Swift) architectureJianbin LIN
 
ReSwift & Machine Learning
ReSwift & Machine LearningReSwift & Machine Learning
ReSwift & Machine LearningRodrigo Leite
 
Ph d defense_Department of Information Technology, Uppsala University, Sweden
Ph d defense_Department of Information Technology, Uppsala University, SwedenPh d defense_Department of Information Technology, Uppsala University, Sweden
Ph d defense_Department of Information Technology, Uppsala University, SwedenSabesan Manivasakan
 
Four Steps Toward a Safer Continuous Delivery Practice (Hint: Add Monitoring)
Four Steps Toward a Safer Continuous Delivery Practice (Hint: Add Monitoring)Four Steps Toward a Safer Continuous Delivery Practice (Hint: Add Monitoring)
Four Steps Toward a Safer Continuous Delivery Practice (Hint: Add Monitoring)VMware Tanzu
 
Reduxing UI: Borrowing the Best of Web to Make Android Better
Reduxing UI: Borrowing the Best of Web to Make Android BetterReduxing UI: Borrowing the Best of Web to Make Android Better
Reduxing UI: Borrowing the Best of Web to Make Android BetterChristina Lee
 
Chapter 4: Financial Statement Analysis
Chapter 4: Financial Statement AnalysisChapter 4: Financial Statement Analysis
Chapter 4: Financial Statement AnalysisNada G.Youssef
 
Everything to Know About React Re-Rendering: A Comprehensive Guide
Everything to Know About React Re-Rendering: A Comprehensive GuideEverything to Know About React Re-Rendering: A Comprehensive Guide
Everything to Know About React Re-Rendering: A Comprehensive GuideBOSC Tech Labs
 
Financial Statement Analysis
Financial Statement AnalysisFinancial Statement Analysis
Financial Statement AnalysisFaisal Hayat
 
Making design decisions in React-based ClojureScript web applications
Making design decisions in React-based ClojureScript web applicationsMaking design decisions in React-based ClojureScript web applications
Making design decisions in React-based ClojureScript web applicationsFalko Riemenschneider
 
Oracle business rules
Oracle business rulesOracle business rules
Oracle business rulesxavier john
 
Windows Phone 7 Unleashed Session 2
Windows Phone 7 Unleashed Session 2Windows Phone 7 Unleashed Session 2
Windows Phone 7 Unleashed Session 2Wes Yanaga
 
Week 8
Week 8Week 8
Week 8A VD
 
Whitepaper: Measuring Engagement in Native Advertising
Whitepaper:  Measuring Engagement in Native AdvertisingWhitepaper:  Measuring Engagement in Native Advertising
Whitepaper: Measuring Engagement in Native AdvertisingMissy Steiner
 
Introduction To ReqPro
Introduction To ReqProIntroduction To ReqPro
Introduction To ReqProLeslie Munday
 

Similar to Dispatching Reactive State (20)

Double Loop
Double LoopDouble Loop
Double Loop
 
Clean VIP (Clean Swift) architecture
Clean VIP (Clean Swift) architectureClean VIP (Clean Swift) architecture
Clean VIP (Clean Swift) architecture
 
ReSwift & Machine Learning
ReSwift & Machine LearningReSwift & Machine Learning
ReSwift & Machine Learning
 
SEMrush 2
SEMrush 2SEMrush 2
SEMrush 2
 
Ph d defense_Department of Information Technology, Uppsala University, Sweden
Ph d defense_Department of Information Technology, Uppsala University, SwedenPh d defense_Department of Information Technology, Uppsala University, Sweden
Ph d defense_Department of Information Technology, Uppsala University, Sweden
 
Four Steps Toward a Safer Continuous Delivery Practice (Hint: Add Monitoring)
Four Steps Toward a Safer Continuous Delivery Practice (Hint: Add Monitoring)Four Steps Toward a Safer Continuous Delivery Practice (Hint: Add Monitoring)
Four Steps Toward a Safer Continuous Delivery Practice (Hint: Add Monitoring)
 
Reduxing UI: Borrowing the Best of Web to Make Android Better
Reduxing UI: Borrowing the Best of Web to Make Android BetterReduxing UI: Borrowing the Best of Web to Make Android Better
Reduxing UI: Borrowing the Best of Web to Make Android Better
 
Chapter 4: Financial Statement Analysis
Chapter 4: Financial Statement AnalysisChapter 4: Financial Statement Analysis
Chapter 4: Financial Statement Analysis
 
Everything to Know About React Re-Rendering: A Comprehensive Guide
Everything to Know About React Re-Rendering: A Comprehensive GuideEverything to Know About React Re-Rendering: A Comprehensive Guide
Everything to Know About React Re-Rendering: A Comprehensive Guide
 
Financial Statement Analysis
Financial Statement AnalysisFinancial Statement Analysis
Financial Statement Analysis
 
Making design decisions in React-based ClojureScript web applications
Making design decisions in React-based ClojureScript web applicationsMaking design decisions in React-based ClojureScript web applications
Making design decisions in React-based ClojureScript web applications
 
Rpt ppt
Rpt pptRpt ppt
Rpt ppt
 
Oracle business rules
Oracle business rulesOracle business rules
Oracle business rules
 
ReactJs
ReactJsReactJs
ReactJs
 
Windows Phone 7 Unleashed Session 2
Windows Phone 7 Unleashed Session 2Windows Phone 7 Unleashed Session 2
Windows Phone 7 Unleashed Session 2
 
Week 8
Week 8Week 8
Week 8
 
Whitepaper: Measuring Engagement in Native Advertising
Whitepaper:  Measuring Engagement in Native AdvertisingWhitepaper:  Measuring Engagement in Native Advertising
Whitepaper: Measuring Engagement in Native Advertising
 
Introduction To ReqPro
Introduction To ReqProIntroduction To ReqPro
Introduction To ReqPro
 
Build Restful Service using ADFBC
Build Restful Service using ADFBCBuild Restful Service using ADFBC
Build Restful Service using ADFBC
 
Oracle OSB Tutorial 1
Oracle OSB Tutorial 1Oracle OSB Tutorial 1
Oracle OSB Tutorial 1
 

More from Mike Nakhimovich

Intro to GraphQL on Android with Apollo DroidconNYC 2017
Intro to GraphQL on Android with Apollo DroidconNYC 2017Intro to GraphQL on Android with Apollo DroidconNYC 2017
Intro to GraphQL on Android with Apollo DroidconNYC 2017Mike Nakhimovich
 
Data Loading Made Easy with Mike Nakhimovich DroidCon Italy 2017
Data Loading Made Easy with Mike Nakhimovich DroidCon Italy 2017Data Loading Made Easy with Mike Nakhimovich DroidCon Italy 2017
Data Loading Made Easy with Mike Nakhimovich DroidCon Italy 2017Mike Nakhimovich
 
Advanced Dagger talk from 360andev
Advanced Dagger talk from 360andevAdvanced Dagger talk from 360andev
Advanced Dagger talk from 360andevMike Nakhimovich
 
Sword fighting with Dagger GDG-NYC Jan 2016
 Sword fighting with Dagger GDG-NYC Jan 2016 Sword fighting with Dagger GDG-NYC Jan 2016
Sword fighting with Dagger GDG-NYC Jan 2016Mike Nakhimovich
 
Intro to Functional Programming with RxJava
Intro to Functional Programming with RxJavaIntro to Functional Programming with RxJava
Intro to Functional Programming with RxJavaMike Nakhimovich
 

More from Mike Nakhimovich (7)

meetstore5.pdf
meetstore5.pdfmeetstore5.pdf
meetstore5.pdf
 
Intro to GraphQL on Android with Apollo DroidconNYC 2017
Intro to GraphQL on Android with Apollo DroidconNYC 2017Intro to GraphQL on Android with Apollo DroidconNYC 2017
Intro to GraphQL on Android with Apollo DroidconNYC 2017
 
Data Loading Made Easy with Mike Nakhimovich DroidCon Italy 2017
Data Loading Made Easy with Mike Nakhimovich DroidCon Italy 2017Data Loading Made Easy with Mike Nakhimovich DroidCon Italy 2017
Data Loading Made Easy with Mike Nakhimovich DroidCon Italy 2017
 
Open sourcing the store
Open sourcing the storeOpen sourcing the store
Open sourcing the store
 
Advanced Dagger talk from 360andev
Advanced Dagger talk from 360andevAdvanced Dagger talk from 360andev
Advanced Dagger talk from 360andev
 
Sword fighting with Dagger GDG-NYC Jan 2016
 Sword fighting with Dagger GDG-NYC Jan 2016 Sword fighting with Dagger GDG-NYC Jan 2016
Sword fighting with Dagger GDG-NYC Jan 2016
 
Intro to Functional Programming with RxJava
Intro to Functional Programming with RxJavaIntro to Functional Programming with RxJava
Intro to Functional Programming with RxJava
 

Recently uploaded

eSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration toolseSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration toolsosttopstonverter
 
VK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web DevelopmentVK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web Developmentvyaparkranti
 
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdfEnhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdfRTS corp
 
Large Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and RepairLarge Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and RepairLionel Briand
 
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptxReal-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptxRTS corp
 
Best Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITBest Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITmanoharjgpsolutions
 
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...Bert Jan Schrijver
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfMarharyta Nedzelska
 
Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonLeveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonApplitools
 
Osi security architecture in network.pptx
Osi security architecture in network.pptxOsi security architecture in network.pptx
Osi security architecture in network.pptxVinzoCenzo
 
VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024VictoriaMetrics
 
Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalLionel Briand
 
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptxThe Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptxRTS corp
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsChristian Birchler
 
Keeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldKeeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldRoberto Pérez Alcolea
 
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingOpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingShane Coughlan
 
Amazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilitiesAmazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilitiesKrzysztofKkol1
 
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...OnePlan Solutions
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationBradBedford3
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtimeandrehoraa
 

Recently uploaded (20)

eSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration toolseSoftTools IMAP Backup Software and migration tools
eSoftTools IMAP Backup Software and migration tools
 
VK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web DevelopmentVK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web Development
 
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdfEnhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
Enhancing Supply Chain Visibility with Cargo Cloud Solutions.pdf
 
Large Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and RepairLarge Language Models for Test Case Evolution and Repair
Large Language Models for Test Case Evolution and Repair
 
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptxReal-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
Real-time Tracking and Monitoring with Cargo Cloud Solutions.pptx
 
Best Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh ITBest Angular 17 Classroom & Online training - Naresh IT
Best Angular 17 Classroom & Online training - Naresh IT
 
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
JavaLand 2024 - Going serverless with Quarkus GraalVM native images and AWS L...
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdf
 
Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + KobitonLeveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
Leveraging AI for Mobile App Testing on Real Devices | Applitools + Kobiton
 
Osi security architecture in network.pptx
Osi security architecture in network.pptxOsi security architecture in network.pptx
Osi security architecture in network.pptx
 
VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024VictoriaMetrics Anomaly Detection Updates: Q1 2024
VictoriaMetrics Anomaly Detection Updates: Q1 2024
 
Precise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive GoalPrecise and Complete Requirements? An Elusive Goal
Precise and Complete Requirements? An Elusive Goal
 
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptxThe Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
The Role of IoT and Sensor Technology in Cargo Cloud Solutions.pptx
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
 
Keeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository worldKeeping your build tool updated in a multi repository world
Keeping your build tool updated in a multi repository world
 
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full RecordingOpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
OpenChain Education Work Group Monthly Meeting - 2024-04-10 - Full Recording
 
Amazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilitiesAmazon Bedrock in Action - presentation of the Bedrock's capabilities
Amazon Bedrock in Action - presentation of the Bedrock's capabilities
 
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
Revolutionizing the Digital Transformation Office - Leveraging OnePlan’s AI a...
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion Application
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtime
 

Dispatching Reactive State