Can I use a monadic action to filter Fold from Control.Lens?

haskell, haskell-lens, lenses

Solution

why not

mapM_ actionM <=< filterM predM $ toListOf YOUR_LENS_HERE YOUR_OBJECT_HERE

or just

mapM_ actionM <=< filterM predM $ xs

if you really only need to work on a list

Problem

Control.Lens.Fold contains `filtered`, which I could use to filter a list before applying some monadic action. There doesn't seem to be a corresponding `filteredM` - but is there a way to get that effect? To be clear, say I have ``` xs :: [ MyType ] predM :: MyType -> MyMonad Bool actionM :: MyType -> MyMonad () ``` how can I apply `actionM` to each element of `xs` for which `predM` returns `True`? An important constraint is that I want to sequence all invocations of `predM` before the first invocation of `actionM` - so I need a way to make two passes over the list. I can't just combine `predM` and `actionM` into a single function.

Original source