xml-lens (empty) → 0.1
raw patch · 4 files changed
+199/−0 lines, 4 filesdep +basedep +containersdep +lenssetup-changed
Dependencies added: base, containers, lens, text, xml-conduit
Files
- LICENSE +30/−0
- Setup.hs +2/−0
- Text/XML/Lens.hs +143/−0
- xml-lens.cabal +24/−0
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2013, Fumiaki Kinoshita + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of Fumiaki Kinoshita nor the names of other + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple +main = defaultMain
+ Text/XML/Lens.hs view
@@ -0,0 +1,143 @@+{-# LANGUAGE Rank2Types #-} +----------------------------------------------------------------------------- +-- | +-- 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 +-- +---------------------------------------------------------------------------- +module Text.XML.Lens ( + -- * Useful traversals inspired by XPath + (./) + , el + , attributeIs + , attributeSatisfies + , text + , comment + -- * Lenses, traversals for 'Element' + , name + , attrs + , nodes + , attr + , attribute + -- * Prisms for 'Node' + , _Element + , _Content + , AsInstruction(..) + , AsComment(..) + -- * Lenses for 'Document' + , root + , prologue + , epilogue + , doctype + -- * Lenses for 'Name' + , _nameLocalName + , _nameNamespace + , _namePrefix + ) 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 + +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 + +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 = fmap (\x -> n { nameLocalName = x }) $ f $ nameLocalName n + +_nameNamespace :: Lens' Name (Maybe Text) +_nameNamespace f n = fmap (\x -> n { nameNamespace = x }) $ f $ nameNamespace n + +_namePrefix :: Lens' Name (Maybe Text) +_namePrefix f n = fmap (\x -> n { namePrefix = x }) $ f $ namePrefix n + +_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 = fmap (\x -> e { elementName = x }) $ f $ elementName e + +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 + +el :: Name -> Traversal' Element Element +el n f s + | elementName s == n = f s + | otherwise = pure s + +attributeSatisfies :: Name -> (Text -> Bool) -> Traversal' Element Element +attributeSatisfies n p = plate . filtered (maybe False p . preview (attrs . ix n)) + +attributeIs :: Name -> Text -> Traversal' Element Element +attributeIs n v = attributeSatisfies n (==v) + +text :: Traversal' Element Text +text = nodes . traverse . _Content + +comment :: Traversal' Element Text +comment = nodes . traverse . _Comment + +instance Plated Element where + plate = nodes . traverse . _Element + +(./) :: Plated a => Traversal s t a a -> Traversal a a u v -> Traversal s t u v +l ./ m = l . plate . m
+ xml-lens.cabal view
@@ -0,0 +1,24 @@+name: xml-lens +version: 0.1 +synopsis: Lenses, traversals, prisms for xml-conduit +description: +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 + -- other-modules: + build-depends: base ==4.*, lens >= 3.8 && < 4.2, containers >= 0.4.0 && < 0.6, text == 0.11.*, xml-conduit >= 1.1