def compare(as, bs, recursive=true)
result = []
aById = as.select{|e| useElement?(e)}.inject({}){|r, e| r[elementIdentifier(e)] = e; r}
bById = bs.select{|e| useElement?(e)}.inject({}){|r, e| r[elementIdentifier(e)] = e; r}
onlyA = sortElements((aById.keys - bById.keys).collect{|id| aById[id]})
onlyB = sortElements((bById.keys - aById.keys).collect{|id| bById[id]})
aAndB = sortElementPairs((aById.keys & bById.keys).collect{|id| [aById[id], bById[id]]})
onlyA.each do |e|
result << "- #{elementDisplayName(e)}"
end
onlyB.each do |e|
result << "+ #{elementDisplayName(e)}"
end
if recursive
aAndB.each do |ab|
a, b = *ab
r = compareElements(a, b)
if r.size > 0
result << "#{elementDisplayName(a)}"
result += r.collect{|l| INDENT+l}
end
end
end
result
end