Home Reference Source

src/flatten.js

import isSequencial from './isSequencial';
import sequence     from './sequence';

/**
 * 集合の集合を集合に変換し、そのイテレーターを返します。
 *
 * @param {*[][] | iterator | null} coll - 集合の集合
 *
 * @return 集合のイテレーター
 *
 * @example
 * flatten([1, 2, [3, 4, [5, 6], 7], 8]);  // [1, 2, 3, 4, 5, 6, 7, 8]のイテレーター
 */
export default function flatten(coll) {
  if (!isSequencial(coll)) {
    return sequence(null);
  }

  const _ = function*(x) {
    for (const y of x) {
      if (!isSequencial(y)) {
        yield y;

      } else {
        for (const z of _(y)) {
          yield z;
        }
      }
    }
  };

  return _(coll);
}