Colapso seta para listar
Pergunta
Estou tendo alguns problemas com Hxt, embora eu suspeite que seja apenas algo que estou perdendo sobre flechas.
Eu tenho uma estrutura XML como
<str name="field1">value</str>
<lst name="field2"><str>value2</str><str>value3</str></lst>
E estrutura interna como
data XmlData = XmlStr String | XmlList XmlData
Existe uma maneira de coletar elementos em uma etapa em uma flecha?
getXmlData :: IOSArrow XmlTree (String, XmlData)
getXmlData = (getAttrl >>> getChildren >>> getText) &&&
((filterByType "str" >>> getText >>> arr (\x -> XmlStr x))
<+> (filterByType "lst" >>> getXmlData))
where filterByType t = isElem >>> hasName t >>> getChildren
A chamada recursiva ao getxmldata precisa coletar sua resposta e embrulhar em um construtor xmllist, mas não sei como coletar termos. Atualmente, estou realizando isso com algum pós -processamento na saída (coletando com o mesmo nome), mas gostaria de uma solução melhor.
Solução
Em geral você pode usar listA
a partir de Control.Arrow.ArrowList
para fazer isso. Tem tipo (ArrowList a) => a b c -> a b [c]
e é um
Combinador para converter uma seta em uma versão determinante com todos os resultados coletados em uma única lista de elementos.
(Veja minhas respostas aqui e aqui para um exemplo concreto.)
Neste caso específico, você pode usar o >.
Combinador com o XmlList
Construtor como seu segundo argumento para realizar a mesma coisa de maneira mais concisa.