function hookSettingsForUI(items, settings, watch, delay) {
  const revokers = [];
  for (const key in items) {
    const obj = items[key];
    const normalize = isFunction(obj) ? obj
      : obj[NORMALIZE] || normalizeEnum.bind(obj);
    const updater = (val, old) => {
      val = normalize(val, key);
      old = normalize(old, key);
      if (val !== old) options.set(key, val);
    };
    revokers.push(
      hookSetting(key, val => {
        settings[key] = normalize(val, key);
      }),
      watch(() => settings[key],
        delay ? debounce(updater, delay) : updater),
    );
  }
  return revokers;
}
@param {object} items - source definitions
@param {object} settings - target
@param {function} watch - Vue's watch()
@param {number} [delay] - debounce
@return {any[]}