-- |
-- Examples:
-- >>> x = (["a.b", "c.d"], 10)
-- >>> x & _1 %~ (>>= splitOn ".")
-- (["a", "b", "c", "d"], 10)
-- >>> x & _1 . bound %~ splitOn "."
-- (["a", "b", "c", "d"], 10)
bound :: Monad m => Setter (m a) (m b) a (m b)
bound = sets (=<<)
-- |
-- Examples:
-- >>> "abc" ^? prefixed "a"
-- Just "bc"
-- >>> "Abc" ^? prefixed "a"
-- Nothing
-- >>> "abc" & prefixed "a" %~ Text.toUpper
-- "aBC"
-- >>> "Abc" & prefixed "a" %~ Text.toUpper
-- "abc"
prefixed :: Text -> Traversal' Text Text
prefixed prefix next text =
case Text.stripPrefix prefix text of
Just suffix -> liftA2 (<>) (pure prefix) (next suffix)
Nothing -> pure text
-- |
-- Examples:
-- >>> Map.fromList [("a", 1), ("b", 2), ("c", 3)] ^.. ixes (Set.fromList ["a", "b", "d"])
-- [1, 2]
ixes :: (Monoid r, Ixed s, Foldable t) => t (Index s) -> Getting r s (IxValue s)
ixes = foldMap ix