simon.vergauwen
07/22/2019, 8:33 AMsimon.vergauwen
07/22/2019, 8:33 AMsimon.vergauwen
07/22/2019, 8:35 AMMainScreen
, UserRepo
and AndroidDispatchers
together to have a testable architecture.simon.vergauwen
07/22/2019, 8:35 AMfx
part, and specifically into the cancelation.simon.vergauwen
07/22/2019, 8:35 AMfun mainUseCase(screen: MainScreen,
repo: UserRepo,
dispatchers: AndroidDispatchers): IO<Unit> = IO.fx {
continueOn(dispatchers.main())
!screen.renderEmpty()
continueOn(dispatchers.default())
val user = !repo.getUser()
continueOn(dispatchers.main())
!screen.renderUser(user)
}
simon.vergauwen
07/22/2019, 8:38 AMfx
introduces a cancelation point, and this is because we “bind” to each operation. Binding is simply semantically extracting the value, because even if you call this function and get the resulting IO
nothing happens until you call unsafeRunXXX
.simon.vergauwen
07/22/2019, 8:39 AMval user = repo.getUser().bind()
- val user = !repo.getUser()
- val (user) = repo.getUser()
simon.vergauwen
07/22/2019, 8:40 AMunsafeRunAsyncCancellable
we get back a Disposable
which is typealias Disposable = () -> Unit
. So when we trigger it after 500ms, we call the network request. So upon !
it will get cancelled.simon.vergauwen
07/22/2019, 8:41 AMfun mainUseCase(screen: MainScreen,
repo: UserRepo,
dispatchers: AndroidDispatchers): IO<Unit> = IO.fx {
continueOn(dispatchers.main())
!screen.renderEmpty()
continueOn(dispatchers.default())
val user = !repo.getUser()
<-- Never reached this point due to cancelation
continueOn(dispatchers.main())
!screen.renderUser(user)
}
simon.vergauwen
07/22/2019, 8:41 AMtypealias Disposable = () -> Unit
to the lifecyclesimon.vergauwen
07/22/2019, 8:41 AMsimon.vergauwen
07/22/2019, 8:45 AMsuspend fun <A> IOOf<A>.suspendCancellable(): A = suspendCancellableCoroutine { cont ->
val disposable = fix().unsafeRunAsyncCancellable { result ->
result.fold(cont::tryResumeWithException, cont::tryResume)
}
cont.invokeOnCancellation { disposable.invoke() }
}
carbaj0
07/22/2019, 8:50 AMcarbaj0
07/22/2019, 8:51 AMkitttn
07/22/2019, 11:26 AMkitttn
07/22/2019, 11:27 AMsimon.vergauwen
07/22/2019, 11:27 AMsimon.vergauwen
07/22/2019, 11:29 AMsimon.vergauwen
07/22/2019, 11:30 AM