# File lib/ruote/merge.rb, line 48
  def self.merge_workitem(index, target, source, merge_type)

    if merge_type == 'override'

      return source
    end

    if target == nil

      case merge_type

        when 'stack'

          source['fields'] = { 'stack' => [ source['fields'] ] }

        when 'isolate'

          source['fields'] = { (index || 0).to_s => source['fields'] }

        #when 'mix'
           # do nothing
        #when 'union', 'concat'
           # do nothing
      end

      return source
    end

    # else, regular merge

    case merge_type

      when 'mix'

        target['fields'].merge!(source['fields'])

      when 'stack'

        target['fields']['stack'] << source['fields']

      when 'isolate'

        index ||= target['fields'].keys.select { |k| k.match(/^\d+$/) }.size
        target['fields'][index.to_s] = source['fields']

      when 'union', 'concat', 'deep'

        source['fields'].each do |k, sv|

          tv = target['fields'][k]

          if sv.is_a?(Array) and tv.is_a?(Array)
            tv.concat(sv)
            tv.uniq! if merge_type == 'union'
          elsif sv.is_a?(Hash) and tv.is_a?(Hash)
            merge_type == 'deep' ? deep_merge!(tv, sv) : tv.merge!(sv)
          else
            target['fields'][k] = sv
          end
        end
    end

    target
  end