hexml-lens: Lenses for the hexml package

[ bsd3, lens, library ] [ Propose Tags ] [ Report a vulnerability ]

Lenses for the hexml package


[Skip to Readme]

Modules

[Index] [Quick Jump]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

  • No Candidates
Versions [RSS] 0.1.0.0, 0.1.1, 0.2.0, 0.2.1, 0.2.2
Dependencies base (>=4.7 && <5), bytestring, contravariant, foundation, hexml, lens, profunctors, text [details]
License BSD-3-Clause
Copyright All Rights Reserved
Author Jose Iborra
Maintainer pepeiborra@gmail.com
Category lens
Home page https://github.com/pepeiborra/hexml-lens#readme
Uploaded by PepeIborra at 2022-04-05T06:41:26Z
Distributions LTSHaskell:0.2.2, Stackage:0.2.2
Reverse Dependencies 1 direct, 0 indirect [details]
Downloads 3422 total (16 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2022-04-05 [all 1 reports]

Readme for hexml-lens-0.2.2

[back to package description]

hexml-lens

Hackage Stackage Nightly GitHub CI

Folds and getters for the Hexml Node type.

{-# LANGUAGE RecordWildCards #-}
import Control.Lens hiding (children)
import qualified Data.ByteString as B
import qualified Data.ByteString.Lazy.Char8 as LB
import Network.Wreq
import Text.XML.Hexml
import Text.XML.Hexml.Lens

url :: [Char]
url = "http://aiweb.cs.washington.edu/research/projects/xmltk/xmldata/data/courses/reed.xml"

data Place s = Place { building :: s , room :: Int}
  deriving Show

data Course s = Course { title, instructor :: s , place :: Place s}
  deriving Show

main :: IO ()
main = do
  r <- get url
  let stripDocType = LB.unlines . drop 2 . LB.lines
  let courses = take 10 $ r ^.. responseBody . to stripDocType . _XML . _children . folded . courseF
  print courses

courseF :: Fold Node (Course B.ByteString)
courseF = runFold $ do
  title <- Fold $ node "title" . textContents
  instructor <- Fold $ node "instructor" . textContents
  place <- Fold $ node "place" . placeF
  return $ Course{..}

placeF :: Fold Node (Place B.ByteString)
placeF = runFold $ do
  building <- Fold $ node "building" . textContents
  room     <- Fold $ node "room" . textContents . _Show
  return (Place building room)