[Haskell-cafe] xml conduit

Michael Snoyman michael at snoyman.com
Mon Feb 11 17:53:22 CET 2013


OK, after some experimentation, I've decided that this would be something
really cool, but I don't have the experience with lens to do it myself.
Here's what I came up with so far:

https://gist.github.com/snoyberg/4755679

(Also available on School of Haskell[1], but our version of lens is too old
for this snippet.)

So if someone wants to pursue this, I'd be really interested to see the
results.

Michael

[1]
https://haskell.fpcomplete.com/user/snoyberg/random-code-snippets/xml-conduit-lens


On Mon, Feb 11, 2013 at 8:09 AM, Michael Sloan <mgsloan at gmail.com> wrote:

> I realized that the term "payload" wouldn't make much sense in the context
> of XML.  What I meant was "elementName" with "elementAttributes" (but not
> "elementNodes" - that's the point).  So, such navigations could yield a
> datatype containing those.
>
> -Michael
>
>
> On Sun, Feb 10, 2013 at 9:41 PM, Michael Sloan <mgsloan at gmail.com> wrote:
>
>> Err:  That first link into Zipper.hs should instead be:
>>
>>
>> https://github.com/ekmett/lens/blob/f8dfe3fd444648f61b8594cd672c25e70c8a30ff/src/Control/Lens/Internal/Zipper.hs#L66
>>
>>
>> On Sun, Feb 10, 2013 at 9:40 PM, Michael Sloan <mgsloan at gmail.com> wrote:
>>
>>> I'm no lens authority by any means, but indeed, it looks like something
>>> like Cursor / Axis could be done with the lens zipper.
>>>
>>>
>>> https://github.com/snoyberg/xml/blob/0367af336e86d723bd9c9fbb49db0f86d1f989e6/xml-enumerator/Text/XML/Cursor/Generic.hs#L38
>>>
>>> This cursor datatype is very much like the (:>) zipper type (I'm linking
>>> to old code, because that's when I understood it - the newer stuff is
>>> semantically the same, but more efficient, more confusing, and less
>>> directly relatable):
>>>
>>>
>>> https://github.com/ekmett/lens/blob/f8dfe3fd444648f61b8594cd672c25e70c8a30ff/src/Control/Lens/Internal/Zipper.hs#L317
>>>
>>> Which is built out of the following two datatypes:
>>>
>>> 1) parent (and the way to rebuild the tree on the way back up) is
>>> provided by this datatype:
>>>
>>>
>>> https://github.com/ekmett/lens/blob/f8dfe3fd444648f61b8594cd672c25e70c8a30ff/src/Control/Lens/Internal/Zipper.hs#L74
>>>
>>> 2) precedingSibling / followingSibling / node is provided by this
>>> datatype (which is pretty much the familiar list zipper!):
>>>
>>>
>>> https://github.com/ekmett/lens/blob/f8dfe3fd444648f61b8594cd672c25e70c8a30ff/src/Control/Lens/Internal/Zipper.hs#L317
>>>
>>>
>>> One way that this would be powerful is that some of the Axis
>>> constructors could return a zipper.  In particular, all of the axis
>>> yielding functions except the following would be supported:
>>>
>>> parent, precedingSibling, followingSibling, ancestor, descendent,
>>> orSelf, check
>>>
>>> This is because zippers can be used for modification, which doesn't work
>>> out very well when you can navigate to something outside of your focii's
>>> children.  If we have a new datatype, that represents a node's payload,
>>> then we could conceivably represent all of the axis yielding operations
>>> except for parent / ancestor.  However, those operations would be
>>> navigations to payloads - further xml-hierarchy level navigation would be
>>> impossible because you'd no longer have references to children.  (further
>>> navigation into payloads on the other hand, would still be possible)
>>>
>>> So, that's just my thoughts after looking at it a bit - I hope it's
>>> comprehensible / helpful!  An XML zipper would be pretty awesome.
>>>
>>> -Michael
>>>
>>>
>>> On Sun, Feb 10, 2013 at 8:34 PM, Michael Snoyman <michael at snoyman.com>wrote:
>>>
>>>>
>>>>
>>>>
>>>> On Sun, Feb 10, 2013 at 8:51 PM, grant <thelff at hotmail.com> wrote:
>>>>
>>>>> Michael Snoyman <michael <at> snoyman.com> writes:
>>>>>
>>>>> >
>>>>>
>>>>> Hi Michael,
>>>>>
>>>>> Just one last thought. Does it make any sense that xml-conduit could be
>>>>> rewritten as a lens instead of a cursor? Or leverage the lens package
>>>>> somehow?
>>>>>
>>>>>
>>>> That's a really interesting idea, I'd never thought about it before.
>>>> It's definitely something worth playing around with. However, I think in
>>>> this case the Cursor is providing a totally different piece of
>>>> functionality than what lenses would do. The Cursor is really working as a
>>>> Zipper, allowing you to walk the node tree and do queries about preceding
>>>> and following siblings and ancestors.
>>>>
>>>> Now given that every time I'm on #haskell someone mentions zippers in
>>>> the context of lens, maybe lens *would* solve this use case as well, but
>>>> I'm still a lens novice (if that), so I can't really speak on the matter.
>>>> Maybe someone with more lens experience could provide some insight.
>>>>
>>>> Either way, some kind of lens add-on sounds really useful.
>>>>
>>>> Michael
>>>>
>>>> _______________________________________________
>>>> Haskell-Cafe mailing list
>>>> Haskell-Cafe at haskell.org
>>>> http://www.haskell.org/mailman/listinfo/haskell-cafe
>>>>
>>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/haskell-cafe/attachments/20130211/0b357e59/attachment.htm>


More information about the Haskell-Cafe mailing list