<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DZone Snippets: merge code</title>
    <link>http://snippets.dzone.com/posts</link>
    <pubDate>Fri, 29 Aug 2008 03:48:46 GMT</pubDate>
    <description>DZone Snippets: merge code</description>
    <item>
      <title>svn merging</title>
      <link>http://snippets.dzone.com/posts/show/4809</link>
      <description>&lt;code&gt;&lt;br /&gt;svn log | more&lt;br /&gt;svn merge -r339:HEAD https://wush.net/svn/givezooks/trunk&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 21 Nov 2007 22:24:54 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4809</guid>
      <author>sikelianos (Zeke Sikelianos)</author>
    </item>
    <item>
      <title>Hash#deep_merge</title>
      <link>http://snippets.dzone.com/posts/show/4706</link>
      <description>&lt;code&gt;&lt;br /&gt;&lt;br /&gt;# Hash#deep_merge&lt;br /&gt;# From: http://pastie.textmate.org/pastes/30372, Elliott Hird&lt;br /&gt;# Source: http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html&lt;br /&gt;# This file contains extensions to Ruby and other useful snippits of code.&lt;br /&gt;# Time to extend Hash with some recursive merging magic.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;class Hash&lt;br /&gt;&lt;br /&gt;  # Merges self with another hash, recursively.&lt;br /&gt;  # &lt;br /&gt;  # This code was lovingly stolen from some random gem:&lt;br /&gt;  # http://gemjack.com/gems/tartan-0.1.1/classes/Hash.html&lt;br /&gt;  # &lt;br /&gt;  # Thanks to whoever made it.&lt;br /&gt;&lt;br /&gt;  def deep_merge(hash)&lt;br /&gt;    target = dup&lt;br /&gt;    &lt;br /&gt;    hash.keys.each do |key|&lt;br /&gt;      if hash[key].is_a? Hash and self[key].is_a? Hash&lt;br /&gt;        target[key] = target[key].deep_merge(hash[key])&lt;br /&gt;        next&lt;br /&gt;      end&lt;br /&gt;      &lt;br /&gt;      target[key] = hash[key]&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    target&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  # From: http://www.gemtacular.com/gemdocs/cerberus-0.2.2/doc/classes/Hash.html&lt;br /&gt;  # File lib/cerberus/utils.rb, line 42&lt;br /&gt;&lt;br /&gt;  def deep_merge!(second)&lt;br /&gt;    second.each_pair do |k,v|&lt;br /&gt;      if self[k].is_a?(Hash) and second[k].is_a?(Hash)&lt;br /&gt;        self[k].deep_merge!(second[k])&lt;br /&gt;      else&lt;br /&gt;        self[k] = second[k]&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#-----------------&lt;br /&gt;        &lt;br /&gt;   # cf. http://subtech.g.hatena.ne.jp/cho45/20061122&lt;br /&gt;   def deep_merge2(other)&lt;br /&gt;      deep_proc = Proc.new { |k, s, o|&lt;br /&gt;         if s.kind_of?(Hash) &amp;&amp; o.kind_of?(Hash)&lt;br /&gt;            next s.merge(o, &amp;deep_proc)&lt;br /&gt;         end&lt;br /&gt;         next o&lt;br /&gt;      }&lt;br /&gt;      merge(other, &amp;deep_proc)&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def deep_merge3(second)&lt;br /&gt;&lt;br /&gt;      # From: http://www.ruby-forum.com/topic/142809&lt;br /&gt;      # Author: Stefan Rusterholz&lt;br /&gt;&lt;br /&gt;      merger = proc { |key,v1,v2| Hash === v1 &amp;&amp; Hash === v2 ? v1.merge(v2, &amp;merger) : v2 }&lt;br /&gt;      self.merge(second, &amp;merger)&lt;br /&gt;&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;   def keep_merge(hash)&lt;br /&gt;      target = dup&lt;br /&gt;      hash.keys.each do |key|&lt;br /&gt;         if hash[key].is_a? Hash and self[key].is_a? Hash&lt;br /&gt;            target[key] = target[key].keep_merge(hash[key])&lt;br /&gt;            next&lt;br /&gt;         end&lt;br /&gt;         #target[key] = hash[key]&lt;br /&gt;         target.update(hash) { |key, *values| values.flatten.uniq }&lt;br /&gt;      end&lt;br /&gt;      target&lt;br /&gt;   end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;h = {:a =&gt; {:b =&gt; :c}}.merge({:a =&gt; {:l =&gt; :x}})&lt;br /&gt;p h  #=&gt; {:a=&gt;{:l=&gt;:x}}&lt;br /&gt;&lt;br /&gt;h = {:a =&gt; {:b =&gt; :c}}.deep_merge({:a =&gt; {:l =&gt; :x}})&lt;br /&gt;p h  #=&gt; {:a=&gt;{:b=&gt;:c, :l=&gt;:x}}&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;h1 = {:a =&gt; {:b =&gt; :c}}&lt;br /&gt;h2 = {:a =&gt; {:l =&gt; :x}}&lt;br /&gt;&lt;br /&gt;h = h1.deep_merge(h2)&lt;br /&gt;p h1, h2, h&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;h = h1.deep_merge2(h2)&lt;br /&gt;p h1, h2, h&lt;br /&gt;puts&lt;br /&gt;&lt;br /&gt;h = h1.deep_merge!(h2)&lt;br /&gt;p h1, h2, h&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;h1 = {:a =&gt; {:b =&gt; :c}}&lt;br /&gt;h2 = {:a =&gt; {:l =&gt; :x}}&lt;br /&gt;&lt;br /&gt;p h1.deep_merge3(h2)&lt;br /&gt;p h1, h2&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;first = {&lt;br /&gt;  :data=&gt;{&lt;br /&gt;    :name=&gt;{&lt;br /&gt;      :first=&gt;'Sam',&lt;br /&gt;      :middle=&gt;'I',&lt;br /&gt;      :last=&gt;'am'&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;second={&lt;br /&gt;  :data=&gt;{&lt;br /&gt;    :name=&gt;{&lt;br /&gt;      :middle=&gt;'you',&lt;br /&gt;      :last=&gt;'are'&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;p first.deep_merge3(second)&lt;br /&gt;#=&gt; {:data=&gt;{:name=&gt;{:middle=&gt;"you", :first=&gt;"Sam", :last=&gt;"are"}}}&lt;br /&gt;&lt;br /&gt;p first.keep_merge(second)&lt;br /&gt;#=&gt;  {:data=&gt;{:name=&gt;{:first=&gt;"Sam", :middle=&gt;["I", "you"], :last=&gt;["am", "are"]}}}&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Sat, 27 Oct 2007 18:07:40 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/4706</guid>
      <author>ntk ()</author>
    </item>
    <item>
      <title>MERGE two series</title>
      <link>http://snippets.dzone.com/posts/show/3796</link>
      <description>&lt;code&gt;&lt;br /&gt;merge: func [&lt;br /&gt;    "Merge A and B together, like a zipper, alternating elements"&lt;br /&gt;    a [series!]&lt;br /&gt;    b [series!]&lt;br /&gt;    /only "Merge items as sub-blocks"&lt;br /&gt;    /local res val&lt;br /&gt;][&lt;br /&gt;    res: make a length? a&lt;br /&gt;    repeat i max length? a length? b [&lt;br /&gt;        val: reduce [pick a i  pick b i]&lt;br /&gt;        either only [append/only res val] [append res val]&lt;br /&gt;    ]&lt;br /&gt;    res&lt;br /&gt;]&lt;br /&gt;&lt;/code&gt;</description>
      <pubDate>Wed, 11 Apr 2007 16:19:19 GMT</pubDate>
      <guid>http://snippets.dzone.com/posts/show/3796</guid>
      <author>gregg.irwin (Gregg Irwin)</author>
    </item>
  </channel>
</rss>
