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




Avast logo

Dit e-mailbericht is gecontroleerd op virussen met Avast antivirussoftware.
www.avast.com