| import { filterHelper, flatMapHelper, joinHelper, mapHelper, nilHelper, takeNHelper, takeWhileHelper, } from './StreamHelpers.js'; |
| const safeSymbolIterator = Symbol.iterator; |
| export class Stream { |
| static nil() { |
| return new Stream(nilHelper()); |
| } |
| static of(...elements) { |
| return new Stream(elements[safeSymbolIterator]()); |
| } |
| constructor(g) { |
| this.g = g; |
| } |
| next() { |
| return this.g.next(); |
| } |
| [Symbol.iterator]() { |
| return this.g; |
| } |
| map(f) { |
| return new Stream(mapHelper(this.g, f)); |
| } |
| flatMap(f) { |
| return new Stream(flatMapHelper(this.g, f)); |
| } |
| dropWhile(f) { |
| let foundEligible = false; |
| function* helper(v) { |
| if (foundEligible || !f(v)) { |
| foundEligible = true; |
| yield v; |
| } |
| } |
| return this.flatMap(helper); |
| } |
| drop(n) { |
| if (n <= 0) { |
| return this; |
| } |
| let idx = 0; |
| function helper() { |
| return idx++ < n; |
| } |
| return this.dropWhile(helper); |
| } |
| takeWhile(f) { |
| return new Stream(takeWhileHelper(this.g, f)); |
| } |
| take(n) { |
| return new Stream(takeNHelper(this.g, n)); |
| } |
| filter(f) { |
| return new Stream(filterHelper(this.g, f)); |
| } |
| every(f) { |
| for (const v of this.g) { |
| if (!f(v)) { |
| return false; |
| } |
| } |
| return true; |
| } |
| has(f) { |
| for (const v of this.g) { |
| if (f(v)) { |
| return [true, v]; |
| } |
| } |
| return [false, null]; |
| } |
| join(...others) { |
| return new Stream(joinHelper(this.g, others)); |
| } |
| getNthOrLast(nth) { |
| let remaining = nth; |
| let last = null; |
| for (const v of this.g) { |
| if (remaining-- === 0) |
| return v; |
| last = v; |
| } |
| return last; |
| } |
| } |
| export function stream(g) { |
| return new Stream(g); |
| } |
|
|