xml-lens 0.1.4 → 0.1.5
raw patch · 2 files changed
+213/−213 lines, 2 filesdep ~lensPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: lens
API changes (from Hackage documentation)
- Text.XML.Lens: attr :: Name -> IndexedTraversal' Name Element Text
+ Text.XML.Lens: attr :: Name -> Traversal' Element Text
- Text.XML.Lens: attribute :: Name -> IndexedLens' Name Element (Maybe Text)
+ Text.XML.Lens: attribute :: Name -> Lens' Element (Maybe Text)
Files
- Text/XML/Lens.hs +190/−190
- xml-lens.cabal +23/−23
Text/XML/Lens.hs view
@@ -1,191 +1,191 @@-{-# LANGUAGE Rank2Types, FlexibleContexts #-}-{-# OPTIONS_GHC -fno-warn-orphans #-}--------------------------------------------------------------------------------- |--- Module : Text.XML.Lens--- Copyright : (C) 2013 Fumiaki Kinoshita--- License : BSD-style (see the file LICENSE)------ Maintainer : Fumiaki Kinoshita <fumiexcel@gmail.com>--- Stability : experimental--- Portability : non-portable--- Useful traversals inspired by XPath------------------------------------------------------------------------------module Text.XML.Lens (- -- * Lenses, traversals for 'Element'- Element(..)- , (./)- -- ** Names- , name- , localName- , el- , ell- -- ** Attributes- , attributeIs- , attributeSatisfies- , attr- , attribute- , attrs- -- ** Contents- , text- , comment- -- ** Children- , entire- , nodes- -- * Prisms for 'Node'- , Node(..)- , _Element- , _Content- , AsInstruction(..)- , AsComment(..)- -- * Lenses for 'Document'- , Document(..)- , root- , prologue- , epilogue- , doctype- -- * Lenses for 'Name'- , Name(..)- , _nameLocalName- , _nameNamespace- , _namePrefix- -- * Lenses for 'Instruction'- , Instruction(..)- , _instructionTarget- , _instructionData- -- * Reexport- , module Control.Lens- ) where-import Text.XML-import Control.Lens-import Data.Text (Text)-import Data.Map (Map)-import Control.Applicative--infixr 9 ./--prologue :: Lens' Document Prologue-prologue f doc = fmap (\p -> doc { documentPrologue = p} ) $ f $ documentPrologue doc---- | The root element of the document.-root :: Lens' Document Element-root f doc = fmap (\p -> doc { documentRoot = p} ) $ f $ documentRoot doc--epilogue :: Lens' Document [Miscellaneous]-epilogue f doc = fmap (\p -> doc { documentEpilogue = p} ) $ f $ documentEpilogue doc--doctype :: Lens' Prologue (Maybe Doctype)-doctype f doc = fmap (\p -> doc { prologueDoctype = p} ) $ f $ prologueDoctype doc--class AsInstruction t where- _Instruction :: Prism' t Instruction--_instructionTarget :: Lens' Instruction Text-_instructionTarget f (Instruction t d) = f t <&> \t' -> Instruction t' d--_instructionData :: Lens' Instruction Text-_instructionData f (Instruction t d) = f d <&> \d' -> Instruction t d'--instance AsInstruction Node where- _Instruction = prism' NodeInstruction $ \s -> case s of- NodeInstruction e -> Just e- _ -> Nothing--instance AsInstruction Miscellaneous where- _Instruction = prism' MiscInstruction $ \s -> case s of- MiscInstruction e -> Just e- _ -> Nothing--class AsComment t where- _Comment :: Prism' t Text--instance AsComment Node where- _Comment = prism' NodeComment $ \s -> case s of- NodeComment e -> Just e- _ -> Nothing--instance AsComment Miscellaneous where- _Comment = prism' MiscComment $ \s -> case s of- MiscComment e -> Just e- _ -> Nothing--_nameLocalName :: Lens' Name Text-_nameLocalName f n = f (nameLocalName n) <&> \x -> n { nameLocalName = x }--_nameNamespace :: Lens' Name (Maybe Text)-_nameNamespace f n = f (nameNamespace n) <&> \x -> n { nameNamespace = x }--_namePrefix :: Lens' Name (Maybe Text)-_namePrefix f n = f (namePrefix n) <&> \x -> n { namePrefix = x }--_Element :: Prism' Node Element-_Element = prism' NodeElement $ \s -> case s of- NodeElement e -> Just e- _ -> Nothing--_Content :: Prism' Node Text-_Content = prism' NodeContent $ \s -> case s of- NodeContent e -> Just e- _ -> Nothing--name :: Lens' Element Name-name f e = f (elementName e) <&> \x -> e { elementName = x }--localName :: Lens' Element Text-localName = name . _nameLocalName-{-# INLINE localName #-}--attrs :: Lens' Element (Map Name Text)-attrs f e = fmap (\x -> e { elementAttributes = x }) $ f $ elementAttributes e--nodes :: Lens' Element [Node]-nodes f e = fmap (\x -> e { elementNodes = x }) $ f $ elementNodes e--attr :: Name -> IndexedTraversal' Name Element Text-attr n = attrs . ix n--attribute :: Name -> IndexedLens' Name Element (Maybe Text)-attribute n = attrs . at n---- | Traverse itself with its all children. Rewriting subnodes of each children will break a traversal law.-entire :: Traversal' Element Element-entire f e@(Element _ _ ns) = com <$> f e <*> traverse (_Element (entire f)) ns where- com (Element n a _) = Element n a---- | Traverse elements which has the specified name.-el :: Name -> Traversal' Element Element-el n f s- | elementName s == n = f s- | otherwise = pure s---- | Traverse elements which has the specified *local* name. -ell :: Text -> Traversal' Element Element-ell n f s- | nameLocalName (elementName s) == n = f s- | otherwise = pure s--attributeSatisfies :: Name -> (Text -> Bool) -> Traversal' Element Element-attributeSatisfies n p = filtered (maybe False p . preview (attrs . ix n))--attributeIs :: Name -> Text -> Traversal' Element Element-attributeIs n v = attributeSatisfies n (==v)---- | Traverse all contents of the element.-text :: Traversal' Element Text-text = nodes . traverse . _Content---- | Traverse all comments of the element.-comment :: Traversal' Element Text-comment = nodes . traverse . _Comment--instance Plated Element where- plate = nodes . traverse . _Element---- | Combine two 'Traversal's just like XPath's slash.--- --- @ --- l ./ m ≡ l . 'plate' . m--- @-(./) :: Plated a => Traversal s t a a -> Traversal a a u v -> Traversal s t u v-l ./ m = l . plate . m+{-# LANGUAGE Rank2Types, FlexibleContexts #-} +{-# OPTIONS_GHC -fno-warn-orphans #-} +----------------------------------------------------------------------------- +-- | +-- Module : Text.XML.Lens +-- Copyright : (C) 2013 Fumiaki Kinoshita +-- License : BSD-style (see the file LICENSE) +-- +-- Maintainer : Fumiaki Kinoshita <fumiexcel@gmail.com> +-- Stability : experimental +-- Portability : non-portable +-- Useful traversals inspired by XPath +---------------------------------------------------------------------------- +module Text.XML.Lens ( + -- * Lenses, traversals for 'Element' + Element(..) + , (./) + -- ** Names + , name + , localName + , el + , ell + -- ** Attributes + , attributeIs + , attributeSatisfies + , attr + , attribute + , attrs + -- ** Contents + , text + , comment + -- ** Children + , entire + , nodes + -- * Prisms for 'Node' + , Node(..) + , _Element + , _Content + , AsInstruction(..) + , AsComment(..) + -- * Lenses for 'Document' + , Document(..) + , root + , prologue + , epilogue + , doctype + -- * Lenses for 'Name' + , Name(..) + , _nameLocalName + , _nameNamespace + , _namePrefix + -- * Lenses for 'Instruction' + , Instruction(..) + , _instructionTarget + , _instructionData + -- * Reexport + , module Control.Lens + ) where +import Text.XML +import Control.Lens +import Data.Text (Text) +import Data.Map (Map) +import Control.Applicative + +infixr 9 ./ + +prologue :: Lens' Document Prologue +prologue f doc = fmap (\p -> doc { documentPrologue = p} ) $ f $ documentPrologue doc + +-- | The root element of the document. +root :: Lens' Document Element +root f doc = fmap (\p -> doc { documentRoot = p} ) $ f $ documentRoot doc + +epilogue :: Lens' Document [Miscellaneous] +epilogue f doc = fmap (\p -> doc { documentEpilogue = p} ) $ f $ documentEpilogue doc + +doctype :: Lens' Prologue (Maybe Doctype) +doctype f doc = fmap (\p -> doc { prologueDoctype = p} ) $ f $ prologueDoctype doc + +class AsInstruction t where + _Instruction :: Prism' t Instruction + +_instructionTarget :: Lens' Instruction Text +_instructionTarget f (Instruction t d) = f t <&> \t' -> Instruction t' d + +_instructionData :: Lens' Instruction Text +_instructionData f (Instruction t d) = f d <&> \d' -> Instruction t d' + +instance AsInstruction Node where + _Instruction = prism' NodeInstruction $ \s -> case s of + NodeInstruction e -> Just e + _ -> Nothing + +instance AsInstruction Miscellaneous where + _Instruction = prism' MiscInstruction $ \s -> case s of + MiscInstruction e -> Just e + _ -> Nothing + +class AsComment t where + _Comment :: Prism' t Text + +instance AsComment Node where + _Comment = prism' NodeComment $ \s -> case s of + NodeComment e -> Just e + _ -> Nothing + +instance AsComment Miscellaneous where + _Comment = prism' MiscComment $ \s -> case s of + MiscComment e -> Just e + _ -> Nothing + +_nameLocalName :: Lens' Name Text +_nameLocalName f n = f (nameLocalName n) <&> \x -> n { nameLocalName = x } + +_nameNamespace :: Lens' Name (Maybe Text) +_nameNamespace f n = f (nameNamespace n) <&> \x -> n { nameNamespace = x } + +_namePrefix :: Lens' Name (Maybe Text) +_namePrefix f n = f (namePrefix n) <&> \x -> n { namePrefix = x } + +_Element :: Prism' Node Element +_Element = prism' NodeElement $ \s -> case s of + NodeElement e -> Just e + _ -> Nothing + +_Content :: Prism' Node Text +_Content = prism' NodeContent $ \s -> case s of + NodeContent e -> Just e + _ -> Nothing + +name :: Lens' Element Name +name f e = f (elementName e) <&> \x -> e { elementName = x } + +localName :: Lens' Element Text +localName = name . _nameLocalName +{-# INLINE localName #-} + +attrs :: Lens' Element (Map Name Text) +attrs f e = fmap (\x -> e { elementAttributes = x }) $ f $ elementAttributes e + +nodes :: Lens' Element [Node] +nodes f e = fmap (\x -> e { elementNodes = x }) $ f $ elementNodes e + +attr :: Name -> Traversal' Element Text +attr n = attrs . ix n + +attribute :: Name -> Lens' Element (Maybe Text) +attribute n = attrs . at n + +-- | Traverse itself with its all children. Rewriting subnodes of each children will break a traversal law. +entire :: Traversal' Element Element +entire f e@(Element _ _ ns) = com <$> f e <*> traverse (_Element (entire f)) ns where + com (Element n a _) = Element n a + +-- | Traverse elements which has the specified name. +el :: Name -> Traversal' Element Element +el n f s + | elementName s == n = f s + | otherwise = pure s + +-- | Traverse elements which has the specified *local* name. +ell :: Text -> Traversal' Element Element +ell n f s + | nameLocalName (elementName s) == n = f s + | otherwise = pure s + +attributeSatisfies :: Name -> (Text -> Bool) -> Traversal' Element Element +attributeSatisfies n p = filtered (maybe False p . preview (attrs . ix n)) + +attributeIs :: Name -> Text -> Traversal' Element Element +attributeIs n v = attributeSatisfies n (==v) + +-- | Traverse all contents of the element. +text :: Traversal' Element Text +text = nodes . traverse . _Content + +-- | Traverse all comments of the element. +comment :: Traversal' Element Text +comment = nodes . traverse . _Comment + +instance Plated Element where + plate = nodes . traverse . _Element + +-- | Combine two 'Traversal's just like XPath's slash. +-- +-- @ +-- l ./ m ≡ l . 'plate' . m +-- @ +(./) :: Plated a => Traversal s t a a -> Traversal a a u v -> Traversal s t u v +l ./ m = l . plate . m {-# INLINE (./) #-}
xml-lens.cabal view
@@ -1,23 +1,23 @@-name: xml-lens-version: 0.1.4-synopsis: Lenses, traversals, prisms for xml-conduit-description: Lens-based DOM selector-homepage: https://github.com/fumieval/xml-lens-license: BSD3-license-file: LICENSE-author: Fumiaki Kinoshita-maintainer: Fumiaki Kinoshita <fumiexcel@gmail.com>-copyright: Copyright (C) 2013 Fumiaki Kinoshita-category: Control-build-type: Simple-cabal-version: >=1.10--source-repository head- type: git- location: https://github.com/fumieval/xml-lens.git--library- default-language: Haskell2010- ghc-options: -Wall- exposed-modules: Text.XML.Lens- build-depends: base ==4.*, lens >= 3.8 && < 4.2, containers >= 0.4.0 && < 0.6, text == 0.11.*, xml-conduit >= 1.1 && < 1.3+name: xml-lens +version: 0.1.5 +synopsis: Lenses, traversals, prisms for xml-conduit +description: Lens-based DOM selector +homepage: https://github.com/fumieval/xml-lens +license: BSD3 +license-file: LICENSE +author: Fumiaki Kinoshita +maintainer: Fumiaki Kinoshita <fumiexcel@gmail.com> +copyright: Copyright (C) 2013 Fumiaki Kinoshita +category: Control +build-type: Simple +cabal-version: >=1.10 + +source-repository head + type: git + location: https://github.com/fumieval/xml-lens.git + +library + default-language: Haskell2010 + ghc-options: -Wall + exposed-modules: Text.XML.Lens + build-depends: base ==4.*, lens >= 4.0 && < 4.2, containers >= 0.4.0 && < 0.6, text == 0.11.*, xml-conduit >= 1.1 && < 1.3