Jannis
03/10/2020, 1:24 PMrelease
outside of bracket you cannot do that with IO
you can only access it as @pakoito showed with the two examples. If you want the monadic state accessible you can however use EitherT
with can do that: bracketCase({ e -> if (e is ExitCase.Error) EitherT(abort().attempt()) }, use)
will wrap the error in EitherT
and the bracket instance for EitherT
will restore this error after bracketCase(...)
completed, so if it failed with an error you have the error in the left part of the EitherT
. With only IO
this is not possible because the monadic state of IO
is infinite (state of the world theoretically), but `EitherT`'s state is not (it is just an either wrapped in F
). You need mtl for that and that is in incubator. The behavior here is a bit brittle and currently implemented by hand but it should work. You will also need to lift the acquire and use step to eitherT, but that can be done with just EitherT.lift
. The implementation for monad-transformers will get a lot simpler and easier to use soon-ish