class Object

Public Instance Methods

arraydiff(a,b) click to toggle source
# File lib/miniredparse.rb, line 1248
def arraydiff(a,b)
  a==b and return [a,false]
  (Array===a or a=[a])
  result= a.dup
  diff=false
  size= a.size >= b.size ? a.size : b.size
  size.times{|i|
    ai=a[i]
    bi=b[i]
    if Array===ai and Array===bi
      result_i,diff_i= arraydiff(ai,bi)
      diff||=diff_i
      result[i]=result_i
    elsif ai!=bi
      next if Regexp===ai and ai.to_s==bi.to_s and 
        ai.options==bi.options 
      diff=true
      result[i]={ai=>bi}
    elsif ai.nil? 
      result[i]={'size mismatch'=>"#{a.size} for #{b.size}"} if a.size!=b.size
      diff=true
    end
    if i.nonzero? and Hash===result[i] and Hash===result[i-1]
      old=result[i-1]
      oldkeys=old.keys
      oldvals=old.values
      if Reg::Subseq===oldkeys.first
        oldkeys=oldkeys.children
        oldval=oldvals.children
      end
      result[i-1..i]=[ {-[*oldkeys+result[i].keys]=>-[*oldvals+result[i].values]} ]
    end
  }
  return result,diff
end