@@ -25,6 +25,8 @@ module Text.XML.Lens (
25 -- ** Attributes
25 -- ** Attributes
26 , attributeIs
26 , attributeIs
27 , attributeSatisfies
27 , attributeSatisfies
28+ , attributeSatisfies'
29 , attribute
31 , attribute
@@ -62,6 +64,7 @@ import Data.Text (Text)
62import Data.Map (Map)
64import Data.Map (Map)
63import Control.Applicative
65import Control.Applicative
64import qualified Data.CaseInsensitive as CI
66import qualified Data.CaseInsensitive as CI
67+import Data.Maybe (isNothing)
66infixr 9 ./
69infixr 9 ./
@@ -171,7 +174,13 @@ el n f s
171 | otherwise = pure s
174 | otherwise = pure s
173attributeSatisfies :: Name -> (Text -> Bool) -> Traversal' Element Element
176attributeSatisfies :: Name -> (Text -> Bool) -> Traversal' Element Element
174−attributeSatisfies n p = filtered (maybe False p . preview (attrs . ix n))
177+attributeSatisfies n p = attributeSatisfies' n (maybe False p)
179+attributeSatisfies' :: Name -> (Maybe Text -> Bool) -> Traversal' Element Element
180+attributeSatisfies' n p = filtered (p . preview (attrs . ix n))
182+withoutAttribute :: Name -> Traversal' Element Element
183+withoutAttribute n = attributeSatisfies' n isNothing
176attributeIs :: Name -> Text -> Traversal' Element Element
185attributeIs :: Name -> Text -> Traversal' Element Element
177attributeIs n v = attributeSatisfies n (==v)
186attributeIs n v = attributeSatisfies n (==v)