Source: app/enhanced-redux-form/compositeInputFormatters/decomposeCheckboxesToBitwise.js

/**
 * Decomposes the value composed by composeCheckboxesToBitwise().
 *
 * @see composeCheckboxesToBitwise
 * @param {number|string} bitwise The combined bitwise value
 * @param {object} currentValues The current values of the checkboxes
 * @returns {object} An object containing individual values for checkboxes
 */
const decomposeCheckboxesToBitwise = (bitwise = 0, currentValues = {}) => {
  const bitwiseNumber = typeof bitwise === 'number' ? bitwise : parseInt(bitwise, 10);
  const newValues = {};
  if (isNaN(bitwiseNumber)) {
    throw new Error(`Could not decompose bitwise value. Value ${bitwise} is NaN`);
  }

  Object.keys(currentValues).forEach(key => (newValues[key] = null));
  // eslint-disable-next-line no-bitwise
  for (let i = 0; 1 << i <= bitwiseNumber; i++) {
    // eslint-disable-next-line no-bitwise
    newValues[i] = (1 << i) & bitwiseNumber ? true : null;
  }

  return newValues;
};

export default decomposeCheckboxesToBitwise;