Contraer flecha a la lista
Pregunta
Estoy teniendo algunos problemas con HXT , aunque sospecho que es sólo algo me falta sobre flechas.
Tengo una estructura XML como
<str name="field1">value</str>
<lst name="field2"><str>value2</str><str>value3</str></lst>
Y estructura interna como
data XmlData = XmlStr String | XmlList XmlData
¿Hay una manera de elementos de cobro revertido a un paso en una 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
La llamada recursiva a getXmlData tiene que recogerla de respuesta y envolver en una constructora XMLLIST, pero no sé cómo recolectar términos. Actualmente estoy lograr esto con un poco de post-procesamiento en la salida (la recogida en el mismo nombre), pero me gustaría una solución mejor.
Solución
En general se puede utilizar listA
de Control.Arrow.ArrowList
para hacer esto. Tiene tipo (ArrowList a) => a b c -> a b [c]
y es un
combinador para convertir una flecha en una versión con todas determinstic resultados recogidos en un solo elemento lista.
(Ver mis respuestas aquí y aquí para un ejemplo concreto.)
En este caso específico se puede utilizar el combinador >.
con el constructor XmlList
como segundo argumento a lograr lo mismo de manera más concisa.