Van: Rob Stapper [mailto:r.stapper@lijbrandt.nl] Verzonden: donderdag 16 juli 2015 9:08 Aan: 'Graydon Saunders' Onderwerp: RE: [basex-talk] Union of maps?
Just as Marc: after looking at the code I found it needed tweeking ;-)
Here’s a tweeked version.
Succes,
Rob
declare function XQR.map:merge
( $sourceMap as map(*)
, $targetMap as map(*)
, $updateFunction as function(*)
) as map(*)
{
fold-left( map:keys( $sourceMap)
, $targetMap
, function( $targetMap
, $key
)
{
let $go :=
function( $sourceEntry
)
{
item:exists( map:get( $targetMap
, $key
)
, function( $targetEntry
)
{
map:put( $targetMap
, $key
, $updateFunction( $sourceEntry
, $targetEntry
)
)
}
, map:put( $targetMap
, $key
, $sourceEntry
)
)
}
return $go( map:get( $sourceMap
, $key
)
)
}
)
} ;
Plus bonus:
declare %basex:inline function item:exists
( $item
, $existProcessor
, $emptyValue
)
{ if ( exists( $item))
then $existProcessor( $item)
else $emptyValue
} ;
Van: basex-talk-bounces@mailman.uni-konstanz.de [mailto:basex-talk-bounces@mailman.uni-konstanz.de] Namens Graydon Saunders Verzonden: woensdag 15 juli 2015 20:01 Aan: BaseX Onderwerp: [basex-talk] Union of maps?
Hi --
In BaseX 8.2.1, I have a bunch of maps; the maps may have some overlap of key values. I would like to merge/find the union of all of these maps while retaining all the values associated with each key in the resulting map-of-all-maps. (Combined map? Any word can be wrong, here! :)
map:merge() doesn't do this; http://docs.basex.org/wiki/Map_Module#map:merge says
"The associated value for each such key is taken from the last map in the input sequence $input that contains an entry with this key." and testing confirms this.
Is there a straightforward way to do this that I'm missing?
Thanks!
Graydon
--- Dit e-mailbericht is gecontroleerd op virussen met Avast antivirussoftware. https://www.avast.com/antivirus