function unwind({ paths = undefined, blankOut = false } = {}) {
  function unwindReducer(rows, unwindPath) {
    return rows
      .flatMap(row => {
        const unwindArray = lodashGet(row, unwindPath);

        if (!Array.isArray(unwindArray)) {
          return row;
        }

        if (!unwindArray.length) {
          return unsetProp(row, unwindPath);
        }

        const baseNewRow = blankOut ? {} : row;
        const [firstRow, ...restRows] = unwindArray;
        return [
          setProp(row, unwindPath, firstRow),
          ...restRows.map(unwindRow => setProp(baseNewRow, unwindPath, unwindRow))
        ];
      });
  }

  paths = Array.isArray(paths) ? paths : (paths ? [paths] : undefined);
  return dataRow => (paths || getUnwindablePaths(dataRow)).reduce(unwindReducer, [dataRow]);
}
Performs the unwind recursively in specified sequence

@param {String[]} unwindPaths The paths as strings to be used to deconstruct the array
@returns {Object => Array} Array of objects containing all rows after unwind of chosen paths