All files / fuse-ui-shared iterator.ts

69.33% Statements 52/75
25% Branches 1/4
72.73% Functions 8/11
68.33% Lines 41/60
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 1064x   1x   1x 10x 10x     1x     4x 9x   9x     4x                         4x                           4x 25x 25x       4x 2x 9x 9x     2x     4x 20x 14x 6x         4x 22x 47x 47x     22x     4x                 4x 33x 33x       4x 2x 20x 20x 12x 8x 8x     1x 1x      
export function last<T>(seq: Iterator<T>): T | undefined {
  let result;
  let iter = seq.next();
 
  while (!iter.done) {
    result = iter.value;
    iter = seq.next();
  }
 
  return result;
}
 
export function first<T>(seq: Iterator<T>): T | undefined {
  let iter = seq.next();
 
  return iter.done ? undefined : iter.value;
}
 
export function* skip<T>(seq: Iterator<T>, n: number): IterableIterator<T> {
  let i = 0;
  let iter = seq.next();
 
  while (!iter.done) {
    if (i >= n) {
      yield iter.value;
    }
    iter = seq.next();
    i++;
  }
}
 
export function* take<T>(seq: Iterator<T>, n: number): IterableIterator<T> {
  let i = 0;
  let iter = seq.next();
 
  while (!iter.done) {
    if (i >= n) {
      break;
    }
    yield iter.value;
    iter = seq.next();
    i++;
  }
}
 
export function* map<F, T>(src: IterableIterator<F>, f: (x: F) => T) {
  for (let x of src) {
    yield f(x);
  }
}
 
export function reduce<F, T>(src: IterableIterator<F>, r: (c: T, x: F) => T, s: T): T {
  let result = s;
  for (let x of src) {
    result = r(result, x);
  }
 
  return result;
}
 
export function* filter<T>(src: IterableIterator<T>, f: (x: T) => boolean) {
  for (let x of src) {
    if (f(x)) {
      yield x;
    }
  }
}
 
export function asArray<T>(src: IterableIterator<T>): T[] {
  let result = [];
  for (const e of src) {
    result.push(e);
  }
 
  return result;
}
 
export function* reverse<T>(src: IterableIterator<T>): IterableIterator<T> {
  const arr = asArray(src);
  const reversed = arr.reverse();
 
  for (const e of reversed) {
    yield e;
  }
}
 
export function* asIter<T>(a: T[]) {
  for (const v of a) {
    yield v;
  }
}
 
export function* chunks<T>(src: IterableIterator<T>, chunkSize: number): IterableIterator<IterableIterator<T>> {
  let chunk = [];
  for (const v of src) {
    chunk.push(v);
    if (chunk.length === chunkSize) {
      yield asIter(chunk);
      chunk = [];
    }
  }
  if (chunk.length) {
    yield asIter(chunk);
  }
}