Этот комбинатор уже существует где-то в lens
или в другой библиотеке?
filteredHas :: Lens.Fold s i -> Lens.IndexedTraversal' i s s
filteredHas fold f val =
case val ^? fold of
Nothing -> pure val
Just proof -> Lens.indexed f proof val
Это полезно в тех случаях, когда можно изменить значение, только если оно имеетопределенное вспомогательное значение.
, т. е. он может заменить код типа
Lens.filtered (Lens.has part) %~ \x -> something (x ^?! part) x
на filteredHas part %@~ something
.