/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ // taken from https://github.com/microsoft/vscode/tree/main/src/vs/base/common export namespace Iterable { export function is(thing: any): thing is IterableIterator { return ( thing && typeof thing === 'object' && typeof thing[Symbol.iterator] === 'function' ); } const _empty: Iterable = Object.freeze([]); export function empty(): Iterable { return _empty; } export function* single(element: T): Iterable { yield element; } export function from( iterable: Iterable | undefined | null ): Iterable { return iterable || _empty; } export function first(iterable: Iterable): T | undefined { return iterable[Symbol.iterator]().next().value; } export function some( iterable: Iterable, predicate: (t: T) => boolean ): boolean { for (const element of iterable) { if (predicate(element)) { return true; } } return false; } export function* filter( iterable: Iterable, predicate: (t: T) => boolean ): Iterable { for (const element of iterable) { if (predicate(element)) { yield element; } } } export function* map( iterable: Iterable, fn: (t: T) => R ): Iterable { for (const element of iterable) { yield fn(element); } } export function* concat(...iterables: Iterable[]): Iterable { for (const iterable of iterables) { for (const element of iterable) { yield element; } } } /** * Consumes `atMost` elements from iterable and returns the consumed elements, * and an iterable for the rest of the elements. */ export function consume( iterable: Iterable, atMost: number = Number.POSITIVE_INFINITY ): [T[], Iterable] { const consumed: T[] = []; if (atMost === 0) { return [consumed, iterable]; } const iterator = iterable[Symbol.iterator](); for (let i = 0; i < atMost; i++) { const next = iterator.next(); if (next.done) { return [consumed, Iterable.empty()]; } consumed.push(next.value); } return [ consumed, { [Symbol.iterator]() { return iterator; }, }, ]; } }