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