Path: blob/main/extensions/copilot/src/util/vs/base/common/iterator.ts
13405 views
//!!! DO NOT modify, this file was COPIED from 'microsoft/vscode'12/*---------------------------------------------------------------------------------------------3* Copyright (c) Microsoft Corporation. All rights reserved.4* Licensed under the MIT License. See License.txt in the project root for license information.5*--------------------------------------------------------------------------------------------*/67import { isIterable } from './types';89export namespace Iterable {1011export function is<T = unknown>(thing: unknown): thing is Iterable<T> {12return !!thing && typeof thing === 'object' && typeof (thing as Iterable<T>)[Symbol.iterator] === 'function';13}1415const _empty: Iterable<never> = Object.freeze([]);16export function empty<T = never>(): readonly never[] {17return _empty as readonly never[];18}1920export function* single<T>(element: T): Iterable<T> {21yield element;22}2324export function wrap<T>(iterableOrElement: Iterable<T> | T): Iterable<T> {25if (is(iterableOrElement)) {26return iterableOrElement;27} else {28return single(iterableOrElement);29}30}3132export function from<T>(iterable: Iterable<T> | undefined | null): Iterable<T> {33return iterable ?? (_empty as Iterable<T>);34}3536export function* reverse<T>(array: ReadonlyArray<T>): Iterable<T> {37for (let i = array.length - 1; i >= 0; i--) {38yield array[i];39}40}4142export function isEmpty<T>(iterable: Iterable<T> | undefined | null): boolean {43return !iterable || iterable[Symbol.iterator]().next().done === true;44}4546export function first<T>(iterable: Iterable<T>): T | undefined {47return iterable[Symbol.iterator]().next().value;48}4950export function some<T>(iterable: Iterable<T>, predicate: (t: T, i: number) => unknown): boolean {51let i = 0;52for (const element of iterable) {53if (predicate(element, i++)) {54return true;55}56}57return false;58}5960export function every<T>(iterable: Iterable<T>, predicate: (t: T, i: number) => unknown): boolean {61let i = 0;62for (const element of iterable) {63if (!predicate(element, i++)) {64return false;65}66}67return true;68}6970export function find<T, R extends T>(iterable: Iterable<T>, predicate: (t: T) => t is R): R | undefined;71export function find<T>(iterable: Iterable<T>, predicate: (t: T) => boolean): T | undefined;72export function find<T>(iterable: Iterable<T>, predicate: (t: T) => boolean): T | undefined {73for (const element of iterable) {74if (predicate(element)) {75return element;76}77}7879return undefined;80}8182export function filter<T, R extends T>(iterable: Iterable<T>, predicate: (t: T) => t is R): Iterable<R>;83export function filter<T>(iterable: Iterable<T>, predicate: (t: T) => boolean): Iterable<T>;84export function* filter<T>(iterable: Iterable<T>, predicate: (t: T) => boolean): Iterable<T> {85for (const element of iterable) {86if (predicate(element)) {87yield element;88}89}90}9192export function* map<T, R>(iterable: Iterable<T>, fn: (t: T, index: number) => R): Iterable<R> {93let index = 0;94for (const element of iterable) {95yield fn(element, index++);96}97}9899export function* flatMap<T, R>(iterable: Iterable<T>, fn: (t: T, index: number) => Iterable<R>): Iterable<R> {100let index = 0;101for (const element of iterable) {102yield* fn(element, index++);103}104}105106export function* concat<T>(...iterables: (Iterable<T> | T)[]): Iterable<T> {107for (const item of iterables) {108if (isIterable(item)) {109yield* item;110} else {111yield item;112}113}114}115116export function reduce<T, R>(iterable: Iterable<T>, reducer: (previousValue: R, currentValue: T) => R, initialValue: R): R {117let value = initialValue;118for (const element of iterable) {119value = reducer(value, element);120}121return value;122}123124export function length<T>(iterable: Iterable<T>): number {125let count = 0;126for (const _ of iterable) {127count++;128}129return count;130}131132/**133* Returns an iterable slice of the array, with the same semantics as `array.slice()`.134*/135export function* slice<T>(arr: ReadonlyArray<T>, from: number, to = arr.length): Iterable<T> {136if (from < -arr.length) {137from = 0;138}139if (from < 0) {140from += arr.length;141}142143if (to < 0) {144to += arr.length;145} else if (to > arr.length) {146to = arr.length;147}148149for (; from < to; from++) {150yield arr[from];151}152}153154/**155* Consumes `atMost` elements from iterable and returns the consumed elements,156* and an iterable for the rest of the elements.157*/158export function consume<T>(iterable: Iterable<T>, atMost: number = Number.POSITIVE_INFINITY): [T[], Iterable<T>] {159const consumed: T[] = [];160161if (atMost === 0) {162return [consumed, iterable];163}164165const iterator = iterable[Symbol.iterator]();166167for (let i = 0; i < atMost; i++) {168const next = iterator.next();169170if (next.done) {171return [consumed, Iterable.empty()];172}173174consumed.push(next.value);175}176177return [consumed, { [Symbol.iterator]() { return iterator; } }];178}179180export async function asyncToArray<T>(iterable: AsyncIterable<T>): Promise<T[]> {181const result: T[] = [];182for await (const item of iterable) {183result.push(item);184}185return result;186}187188export async function asyncToArrayFlat<T>(iterable: AsyncIterable<T[]>): Promise<T[]> {189let result: T[] = [];190for await (const item of iterable) {191result = result.concat(item);192}193return result;194}195}196197198