module Text.XML.Basic.Utility where import Data.List.HT (switchL, break, ) import Data.Tuple.HT (mapSnd, ) import Prelude hiding (break, ) {- | Needs 'break' from utility-ht in order to be as lazy as 'updateAppend''. -} updateAppend :: (a -> Bool) -> a -> (a -> a) -> [a] -> [a] updateAppend p deflt f = uncurry (++) . mapSnd (uncurry (:) . switchL (deflt,[]) ((,) . f)) . break p {- | Apply @f@ to the first element, where @p@ holds. If no such element exists, append the default value @deflt@ to the list. -} updateAppend' :: (a -> Bool) -> a -> (a -> a) -> [a] -> [a] updateAppend' p deflt f = let recourse xt = uncurry (:) $ case xt of [] -> (deflt,[]) (x:xs) -> if p x then (f x, xs) else (x, recourse xs) in recourse