I currently have code that looks like this:
do
x <- use foo
foo <~ runFoo x
where foo is a Lens to a Foo field and runFoo :: MonadState m => Foo -> m Foo
I think there should be a way to do this operation in one line, but I cannot find it. I think it ought to have a comment like:
(????) :: MonadState s m => Lens' s a -> (a -> m a) -> m a
Questions:
lens doesn't offer such a combinator in a ready-made form. If instead of runFoo you had some g :: a -> a function, you would be able to use (%=), which is to over what use is to view, and write simply foo %= g. Your desired functionality, though, involves interleaving the m effects introduced by runFoo in between the getting and setting, which precludes a solution this straightforward.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With