docs: function diff(older, newer) {
      if (!older) return newer
      if (!newer) return null
      return keys(newer).reduce(function(changes, key) {
          var newValue = newer[key]
          var oldValue = older[key]
  
          // if they are the same, then skip
          if (isEqual(oldValue, newValue))
              return changes
  
          // if both new values and old values are plain objects we should diff them
          if (isPlainObject(newValue) && isPlainObject(oldValue)) {
              changes[key] = diff(oldValue, newValue)
          }
          else {
              // Arrays, nulls, values, just replace
              changes[key] = newValue
          }
  
          return changes
      }, {})
  }