[xquery-talk] Manipulating Maps In Non-Trivial Ways

Michael Kay mike at saxonica.com
Sun Jul 19 10:38:05 PDT 2015


A fold can sometimes be useful for this kind of operation:

$newKeys => fold-left($m1, function($key, $map) { $map => map:put($key, ($map($key), $obj) })

Also, appending an item to the value for a key is a sufficiently common operation it’s worth having a function for it:

declare  function f:map-add($map, $key, $value) as map(*) {
   map:put($map, $key, ($map($key), $value))
}

and then the fold becomes

$newKeys => fold-left($m1, function($key, $map) {$map => f:add($key, $obj)})

But it takes a while before folds become intuitive. map:merge works equally well.

Michael Kay
Saxonica

> On 19 Jul 2015, at 16:40, Eliot Kimber <ekimber at contrext.com> wrote:
> 
> I don't know why I'm having such a hard time figuring out how to operate
> on maps but I just can't get my head around it (I suspect procedural brain
> damage but it could just be advancing age). I suspect others will or are
> having the same challenge.
> 
> My challenge of the day is:
> 
> I have an existing map where each entry is a sequence mapped to a string
> key, e.g.:
> 
> let $m1 := map{ 'key1' : (), 'key2' : () }
> 
> I then have a node and a set of key values. For each key I need to find
> the entry with that key and add the node to the entry, e.g.
> 
> let $newKeys := ('key1', 'key3')
> let $obj := <added/>
> 
> Let $m2 := for $key in $newKeys
>               (: Find sequence for key,
>                  Add obj to sequence,
>                  Update map entry for new key
>                :)
> 
> I think the right answer is to use map:merge like so:
> 
> let $m2 := 
>  map:merge(
>    $m1,
>    lor $key in $newKeys
>        Map {$key, ($m1($key), $obj))}
>  )
> 
> Is my analysis correct? Is there a better way to do this sort of map
> updating?
> 
> Thanks,
> 
> Eliot
> ----
> Eliot Kimber, Owner
> Contrext, LLC
> http://contrext.com
> 
> 
> 
> _______________________________________________
> talk at x-query.com
> http://x-query.com/mailman/listinfo/talk




More information about the talk mailing list