summaryrefslogtreecommitdiffstats
path: root/addon-sdk/source/lib/diffpatcher/rebase.js
blob: 03c756feec7c9ba9d89507ba2ed8fbd967fce363 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
"use strict";

var nil = {}
var owns = ({}).hasOwnProperty

function rebase(result, parent, delta) {
  var key, current, previous, update
  for (key in parent) {
    if (owns.call(parent, key)) {
      previous = parent[key]
      update = owns.call(delta, key) ? delta[key] : nil
      if (previous === null) continue
      else if (previous === void(0)) continue
      else if (update === null) continue
      else if (update === void(0)) continue
      else result[key] = previous
    }
  }
  for (key in delta) {
    if (owns.call(delta, key)) {
      update = delta[key]
      current = owns.call(result, key) ? result[key] : nil
      if (current === update) continue
      else if (update === null) continue
      else if (update === void(0)) continue
      else if (current === nil) result[key] = update
      else if (typeof(update) !== "object") result[key] = update
      else if (typeof(current) !== "object") result[key] = update
      else result[key]= rebase({}, current, update)
    }
  }

  return result
}

module.exports = rebase