packages feed

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 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