third_party/polymer3/bower_components/polymer/lib/mixins/property-effects.js
function runNotifyEffects(inst, notifyProps, props, oldProps, hasPaths) {
  // Notify
  let fxs = inst[TYPES.NOTIFY];
  let notified;
  let id = dedupeId++;
  // Try normal notify effects; if none, fall back to try path notification
  for (let prop in notifyProps) {
    if (notifyProps[prop]) {
      if (fxs && runEffectsForProperty(inst, fxs, id, prop, props, oldProps, hasPaths)) {
        notified = true;
      } else if (hasPaths && notifyPath(inst, prop, props)) {
        notified = true;
      }
    }
  }
  // Flush host if we actually notified and host was batching
  // And the host has already initialized clients; this prevents
  // an issue with a host observing data changes before clients are ready.
  let host;
  if (notified && (host = inst.__dataHost) && host._invalidateProperties) {
    host._invalidateProperties();
  }
}
function runNotifyEffects(inst, notifyProps, props, oldProps, hasPaths) {
  // Notify
  let fxs = inst[TYPES.NOTIFY];
  let notified;
  let id = dedupeId++;
  // Try normal notify effects; if none, fall back to try path notification
  for (let prop in notifyProps) {
    if (notifyProps[prop]) {
      if (fxs && runEffectsForProperty(inst, fxs, id, prop, props, oldProps, hasPaths)) {
        notified = true;
      } else if (hasPaths && notifyPath(inst, prop, props)) {
        notified = true;
      }
    }
  }
  // Flush host if we actually notified and host was batching
  // And the host has already initialized clients; this prevents
  // an issue with a host observing data changes before clients are ready.
  let host;
  if (notified && (host = inst.__dataHost) && host._invalidateProperties) {
    host._invalidateProperties();
  }
}
function runNotifyEffects ( inst , notifyProps , props , oldProps , hasPaths ) { // Notify let fxs = inst [ TYPES . NOTIFY ] ; let notified ; let id = dedupeId ++ ; // Try normal notify effects; if none, fall back to try path notification for ( let prop in notifyProps ) { if ( notifyProps [ prop ] ) { if ( fxs && runEffectsForProperty ( inst , fxs , id , prop , props , oldProps , hasPaths ) ) { notified = true ; } else if ( hasPaths && notifyPath ( inst , prop , props ) ) { notified = true ; } } } // Flush host if we actually notified and host was batching // And the host has already initialized clients; this prevents // an issue with a host observing data changes before clients are ready. let host ; if ( notified && ( host = inst . __dataHost ) && host . _invalidateProperties ) { host . _invalidateProperties ( ) ; } }
Runs "notify" effects for a set of changed properties.

This method differs from the generic `runEffects` method in that it
will dispatch path notification events in the case that the property
changed was a path and the root property for that path didn't have a
"notify" effect.  This is to maintain 1.0 behavior that did not require
`notify: true` to ensure object sub-property notifications were
sent.

@param {!PropertyEffectsType} inst The instance with effects to run
@param {Object} notifyProps Bag of properties to notify
@param {Object} props Bag of current property changes
@param {Object} oldProps Bag of previous values for changed properties
@param {boolean} hasPaths True with `props` contains one or more paths
@return {void}
@private
Runs notify effects for a set of changed properties .