/
githubmirror
/
immutable-js
Обзор
Документация
Войти
/
githubmirror
/
immutable-js
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
website/docs/Stack.mdx
847 строк
24 KB
Hashim Khan
docs: place [Symbol.iterator] under Iterators headings
22 июл 2026, 23:12
22 июл 2026, 23:12
c3d810d
Код
Авторство
О чём код?
import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # Stack Stacks are indexed collections which support very efficient `O(1)` addition and removal from the front using `unshift(v)` and `shift()`. <Signature code={`type Stack<T> extends Collection.Indexed<T>`} /> For familiarity, Stack also provides `push(v)`, `pop()`, and `peek()`, but be aware that they also operate on the front of the list, unlike List or a JavaScript Array. Note: `reverse()` or any inherent reverse traversal (`reduceRight`, `lastIndexOf`, etc.) is not efficient with a Stack. Stack is implemented with a Single-Linked List. ## Construction <MemberLabel label="Stack()" /> Create a new immutable Stack containing the values of the provided collection-like. <Signature code={`Stack<T>(collection?: Iterable<T> | ArrayLike<T>): Stack<T>`} /> Note: `Stack` is a factory function and not a class, and does not use the `new` keyword during construction. ## Static Methods <MemberLabel label="Stack.isStack()" /> True if the provided value is a Stack. <Signature code={`Stack.isStack(maybeStack: unknown): maybeStack is Stack<unknown>`} /> <MemberLabel label="Stack.of()" /> Creates a new Stack containing `values`. <Signature code={`Stack.of<T>(...values: Array<T>): Stack<T>`} /> ## Members <MemberLabel label="size" /> The number of items in this Stack. <Signature code={`size: number`} /> ## Reading values <MemberLabel label="peek()" /> Alias for `Stack.first()`. <Signature code={`peek(): T | undefined`} /> <MemberLabel label="get()" /> Returns the value associated with the provided key, or notSetValue if the Collection does not contain this key. <Signature code={`get<NSV>(key: number, notSetValue: NSV): T | NSV get(key: number): T | undefined`} /> <MemberLabel label="has()" /> True if a key exists within this Collection, using `Immutable.is` to determine equality. <Signature code={`has(key: number): boolean`} /> <MemberLabel label="includes()" alias="contains()" /> True if a value exists within this Collection, using `Immutable.is` to determine equality. <Signature code={`includes(value: T): boolean`} /> <MemberLabel label="first()" /> Returns the first value in this Collection. <Signature code={`first(): T | undefined`} /> <MemberLabel label="last()" /> Returns the last value in this Collection. <Signature code={`last(): T | undefined`} /> ## Persistent changes <MemberLabel label="clear()" /> Returns a new Stack with 0 size and no values. <Signature code={`clear(): Stack<T>`} /> Note: `clear` can be used in `withMutations`. <MemberLabel label="unshift()" /> Returns a new Stack with the provided `values` prepended, shifting other values ahead to higher indices. <Signature code={`unshift(...values: Array<T>): Stack<T>`} /> This is very efficient for Stack. Note: `unshift` can be used in `withMutations`. <MemberLabel label="unshiftAll()" /> Like `Stack#unshift`, but accepts a collection rather than varargs. <Signature code={`unshiftAll(iter: Iterable<T>): Stack<T>`} /> Note: `unshiftAll` can be used in `withMutations`. <MemberLabel label="shift()" /> Returns a new Stack with a size ones less than this Stack, excluding the first item in this Stack, shifting all other values to a lower index. <Signature code={`shift(): Stack<T>`} /> Note: this differs from `Array#shift` because it returns a new Stack rather than the removed value. Use `first()` or `peek()` to get the first value in this Stack. Note: `shift` can be used in `withMutations`. <MemberLabel label="push()" /> Alias for `Stack#unshift` and is not equivalent to `List#push`. <Signature code={`push(...values: Array<T>): Stack<T>`} /> <MemberLabel label="pushAll()" /> Alias for `Stack#unshiftAll`. <Signature code={`pushAll(iter: Iterable<T>): Stack<T>`} /> <MemberLabel label="pop()" /> Alias for `Stack#shift` and is not equivalent to `List#pop`. <Signature code={`pop(): Stack<T>`} /> <MemberLabel label="update()" /> Returns a new Stack with an updated value at `index` with the return value of calling `updater` with the existing value. <Signature code={`update(index: number, updater: (value: T | undefined) => T | undefined): this update<R>(updater: (value: this) => R): R`} /> ## Transient changes <MemberLabel label="withMutations()" /> Note: Not all methods can be used on a mutable collection or within `withMutations`! Check the documentation for each method to see if it mentions being safe to use in `withMutations`. <Signature code={`withMutations(mutator: (mutable: this) => unknown): this`} /> <MemberLabel label="asMutable()" /> Note: Not all methods can be used on a mutable collection or within `withMutations`! Check the documentation for each method to see if it mentions being safe to use in `withMutations`. <Signature code={`asMutable(): this`} /> <MemberLabel label="wasAltered()" /> <Signature code={`wasAltered(): boolean`} /> <MemberLabel label="asImmutable()" /> <Signature code={`asImmutable(): this`} /> ## Sequence algorithms <MemberLabel label="concat()" /> Returns a new Stack with other collections concatenated to this one. <Signature code={`concat<C>(...valuesOrCollections: Array<Iterable<C> | C>): Stack<T | C>`} /> <MemberLabel label="map()" /> Returns a new Stack with values passed through a `mapper` function. <Signature code={`map<M>(mapper: (value: T, key: number, iter: this) => M, context?: unknown): Stack<M>`} /> Note: `map()` always returns a new instance, even if it produced the same value at every step. <MemberLabel label="flatMap()" /> Flat-maps the Stack, returning a new Stack. Similar to `stack.map(...).flatten(true)`. <Signature code={`flatMap<M>(mapper: (value: T, key: number, iter: this) => Iterable<M>, context?: unknown): Stack<M>`} /> <MemberLabel label="filter()" /> Returns a new Set with only the values for which the `predicate` function returns true. <Signature code={`filter<F extends T>(predicate: (value: T, index: number, iter: this) => value is F, context?: unknown): Set<F> filter(predicate: (value: T, index: number, iter: this) => unknown, context?: unknown): this`} /> Note: `filter()` always returns a new instance, even if it results in not filtering out any values. <MemberLabel label="partition()" /> Returns a new Stack with the values for which the `predicate` function returns false and another for which it returns true. <Signature code={`partition<F extends T, C>(predicate: (this: C, value: T, index: number, iter: this) => value is F, context?: C): [Stack<T>, Stack<F>] partition<C>(predicate: (this: C, value: T, index: number, iter: this) => unknown, context?: C): [this, this]`} /> <MemberLabel label="zip()" /> Returns a Stack "zipped" with the provided collections. Like `zipWith`, but using the default `zipper`: creating an `Array`. <Signature code={`zip<U>(other: Collection<unknown, U>): Stack<[T, U]> zip<U, V>(other: Collection<unknown, U>, other2: Collection<unknown, V>): Stack<[T, U, V]> zip(...collections: Array<Collection<unknown, unknown>>): Stack<unknown>`} /> Example: ```js const a = Stack([1, 2, 3]); const b = Stack([4, 5, 6]); const c = a.zip(b); // Stack [ [ 1, 4 ], [ 2, 5 ], [ 3, 6 ] ] ``` <MemberLabel label="zipAll()" /> Returns a Stack "zipped" with the provided collections. Unlike `zip`, `zipAll` continues zipping until the longest collection is exhausted. Missing values from shorter collections are filled with `undefined`. <Signature code={`zipAll<U>(other: Collection<unknown, U>): Stack<[T, U]> zipAll<U, V>(other: Collection<unknown, U>, other2: Collection<unknown, V>): Stack<[T, U, V]> zipAll(...collections: Array<Collection<unknown, unknown>>): Stack<unknown>`} /> Example: ```js const a = Stack([1, 2]); const b = Stack([3, 4, 5]); const c = a.zipAll(b); // Stack [ [ 1, 3 ], [ 2, 4 ], [ undefined, 5 ] ] ``` Note: Since zipAll will return a collection as large as the largest input, some results may contain undefined values. TypeScript cannot account for these without cases (as of v2.5). <MemberLabel label="zipWith()" /> Returns a Stack "zipped" with the provided collections by using a custom `zipper` function. <Signature code={`zipWith<U, Z>(zipper: (value: T, otherValue: U) => Z, otherCollection: Collection<unknown, U>): Stack<Z> zipWith<U, V, Z>(zipper: (value: T, otherValue: U, thirdValue: V) => Z, otherCollection: Collection<unknown, U>, thirdCollection: Collection<unknown, V>): Stack<Z> zipWith<Z>(zipper: (...values: Array<unknown>) => Z, ...collections: Array<Collection<unknown, unknown>>): Stack<Z>`} /> Example: ```js const a = Stack([1, 2, 3]); const b = Stack([4, 5, 6]); const c = a.zipWith((a, b) => a + b, b); // Stack [ 5, 7, 9 ] ``` ## Sequence algorithms <MemberLabel label="partition()" /> <MemberLabel label="filterNot()" /> Returns a new Stack with only the values for which the `predicate` function returns false. <Signature code={`filterNot(predicate: (value: T, index: number, iter: this) => boolean, context?: unknown): this`} /> Note: `filterNot()` always returns a new instance, even if it results in not filtering out any values. <MemberLabel label="reverse()" /> Returns a new Stack with the order of the values reversed. <Signature code={`reverse(): this`} /> <MemberLabel label="sort()" /> Returns Stack of the same type which includes the same entries, stably sorted by using a comparator. <Signature code={`sort(comparator?: Comparator<T>): this`} /> If a comparator is not provided, a default comparator uses `<` and `>`. `comparator(valueA, valueB)`: - Returns `0` if the elements should not be swapped. - Returns `-1` (or any negative number) if `valueA` comes before `valueB` - Returns `1` (or any positive number) if `valueA` comes after `valueB` - Alternatively, can return a value of the `PairSorting` enum type - Is pure, i.e. it must always return the same value for the same pair of values. Note: `sort()` always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. <MemberLabel label="sortBy()" /> Like `sort`, but also accepts a `comparatorValueMapper` which allows for sorting by more sophisticated means. <Signature code={`sortBy<C>(comparatorValueMapper: (value: T, key: number, iter: this) => C, comparator?: Comparator<C>): this`} /> Note: `sortBy()` always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. <MemberLabel label="groupBy()" /> Returns a `Map` of `Stack`, grouped by the return value of the `grouper` function. <Signature code={`groupBy<G>(grouper: (value: T, key: number, iter: this) => G, context?: unknown): Map<G, Stack<T>>`} /> Note: This is not a lazy operation. ## Conversion to JavaScript types <MemberLabel label="toJS()" /> Deeply converts this Stack to equivalent native JavaScript Array. <Signature code={`toJS(): Array<DeepCopy<T>>`} /> <MemberLabel label="toJSON()" /> Shallowly converts this Stack to equivalent native JavaScript Array. <Signature code={`toJSON(): Array<T>`} /> <MemberLabel label="toArray()" /> Shallowly converts this collection to an Array. <Signature code={`toArray(): Array<T>`} /> <MemberLabel label="toObject()" /> Shallowly converts this Stack to a JavaScript Object. <Signature code={`toObject(): { [key: string]: T }`} /> ## Conversion to Seq <MemberLabel label="toSeq()" /> Returns a Seq.Indexed of the values of this Stack. <Signature code={`toSeq(): Seq.Indexed<T>`} /> <MemberLabel label="fromEntrySeq()" /> If this is a collection of [key, value] entry tuples, it will return a Seq.Keyed of those entries. <Signature code={`fromEntrySeq(): Seq.Keyed<unknown, unknown>`} /> <MemberLabel label="toKeyedSeq()" /> Returns a Seq.Keyed from this Stack where indices are treated as keys. <Signature code={`toKeyedSeq(): Seq.Keyed<number, T>`} /> <MemberLabel label="toIndexedSeq()" /> Returns a Seq.Indexed of the values of this Stack, discarding keys. <Signature code={`toIndexedSeq(): Seq.Indexed<T>`} /> <MemberLabel label="toSetSeq()" /> Returns a Seq.Set of the values of this Stack, discarding keys. <Signature code={`toSetSeq(): Seq.Set<T>`} /> ## Combination <MemberLabel label="interpose()" /> Returns a new Stack with the separator inserted between each value in this Stack. <Signature code={`interpose(separator: T): Stack<T>`} /> <MemberLabel label="interleave()" /> Returns a new Stack with the values from each collection interleaved. <Signature code={`interleave(...collections: Array<Collection<unknown, T>>): Stack<T>`} /> <MemberLabel label="splice()" /> Returns a new Stack by replacing a region of this Stack with new values. If values are not provided, it only skips the region to be removed. <Signature code={`splice(index: number, removeNum: number, ...values: Array<T>): Stack<T>`} /> <MemberLabel label="flatten()" /> Returns a new flattened Stack, optionally only flattening to a particular depth. <Signature code={`flatten(depth?: number): Stack<any> flatten(shallow?: boolean): Stack<any>`} /> ## Search for value <MemberLabel label="indexOf()" /> Returns the first index at which a given value can be found in the Stack, or -1 if it is not present. <Signature code={`indexOf(searchValue: T): number`} /> <MemberLabel label="lastIndexOf()" /> Returns the last index at which a given value can be found in the Stack, or -1 if it is not present. <Signature code={`lastIndexOf(searchValue: T): number`} /> <MemberLabel label="findIndex()" /> Returns the first index in the Stack where a value satisfies the provided predicate function. Otherwise -1 is returned. <Signature code={`findIndex(predicate: (value: T, index: number, iter: this) => boolean, context?: unknown): number`} /> <MemberLabel label="findLastIndex()" /> Returns the last index in the Stack where a value satisfies the provided predicate function. Otherwise -1 is returned. <Signature code={`findLastIndex(predicate: (value: T, index: number, iter: this) => boolean, context?: unknown): number`} /> <MemberLabel label="find()" /> Returns the first value for which the `predicate` returns true. <Signature code={`find(predicate: (value: T, key: number, iter: this) => boolean, context?: unknown, notSetValue?: T): T | undefined`} /> <MemberLabel label="findLast()" /> Returns the last value for which the `predicate` returns true. <Signature code={`findLast(predicate: (value: T, key: number, iter: this) => boolean, context?: unknown, notSetValue?: T): T | undefined`} /> Note: `predicate` will be called for each entry in reverse. <MemberLabel label="findEntry()" /> Returns the first [key, value] entry for which the `predicate` returns true. <Signature code={`findEntry(predicate: (value: T, key: number, iter: this) => boolean, context?: unknown, notSetValue?: T): [number, T] | undefined`} /> <MemberLabel label="findLastEntry()" /> Returns the last [key, value] entry for which the `predicate` returns true. <Signature code={`findLastEntry(predicate: (value: T, key: number, iter: this) => boolean, context?: unknown, notSetValue?: T): [number, T] | undefined`} /> Note: `predicate` will be called for each entry in reverse. <MemberLabel label="findKey()" /> Returns the first key for which the `predicate` returns true. <Signature code={`findKey(predicate: (value: T, key: number, iter: this) => boolean, context?: unknown): number | undefined`} /> <MemberLabel label="findLastKey()" /> Returns the last key for which the `predicate` returns true. <Signature code={`findLastKey(predicate: (value: T, key: number, iter: this) => boolean, context?: unknown): number | undefined`} /> Note: `predicate` will be called for each entry in reverse. <MemberLabel label="keyOf()" /> Returns the key associated with the search value, or undefined. <Signature code={`keyOf(searchValue: T): number | undefined`} /> <MemberLabel label="lastKeyOf()" /> Returns the last key associated with the search value, or undefined. <Signature code={`lastKeyOf(searchValue: T): number | undefined`} /> <MemberLabel label="max()" /> Returns the maximum value in this collection. If any values are comparatively equivalent, the first one found will be returned. <Signature code={`max(comparator?: Comparator<T>): T | undefined`} /> <MemberLabel label="maxBy()" /> Like `max`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means. <Signature code={`maxBy<C>(comparatorValueMapper: (value: T, key: number, iter: this) => C, comparator?: Comparator<C>): T | undefined`} /> <MemberLabel label="min()" /> Returns the minimum value in this collection. If any values are comparatively equivalent, the first one found will be returned. <Signature code={`min(comparator?: Comparator<T>): T | undefined`} /> <MemberLabel label="minBy()" /> Like `min`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means. <Signature code={`minBy<C>(comparatorValueMapper: (value: T, key: number, iter: this) => C, comparator?: Comparator<C>): T | undefined`} /> ## Value equality <MemberLabel label="equals()" /> True if this and the other Collection have value equality, as defined by `Immutable.is()`. <Signature code={`equals(other: unknown): boolean`} /> Note: This is equivalent to `Immutable.is(this, other)`, but provided to allow for chained expressions. <MemberLabel label="hashCode()" /> Computes and returns the hashed identity for this Collection. <Signature code={`hashCode(): number`} /> ## Reading deep values <MemberLabel label="getIn()" /> Returns the value found by following a path of keys or indices through nested Collections. <Signature code={`getIn(searchKeyPath: Iterable<unknown>, notSetValue?: unknown): unknown`} /> <MemberLabel label="hasIn()" /> True if the result of following a path of keys or indices through nested Collections results in a set value. <Signature code={`hasIn(searchKeyPath: Iterable<unknown>): boolean`} /> ## Conversion to Collections <MemberLabel label="toMap()" /> Converts this Stack to a Map, Throws if keys are not hashable. <Signature code={`toMap(): Map<number, T>`} /> <MemberLabel label="toOrderedMap()" /> Converts this Stack to a Map, maintaining the order of iteration. <Signature code={`toOrderedMap(): OrderedMap<number, T>`} /> <MemberLabel label="toSet()" /> Converts this Stack to a Set, discarding keys. <Signature code={`toSet(): Set<T>`} /> <MemberLabel label="toOrderedSet()" /> Converts this Stack to a Set, maintaining the order of iteration and discarding keys. <Signature code={`toOrderedSet(): OrderedSet<T>`} /> <MemberLabel label="toList()" /> Converts this Stack to a List, discarding keys. <Signature code={`toList(): List<T>`} /> <MemberLabel label="toStack()" /> Returns itself. <Signature code={`toStack(): Stack<T>`} /> ## Iterators <MemberLabel label="keys()" /> An iterator of this Stack's keys. <Signature code={`keys(): IterableIterator<number>`} /> <MemberLabel label="values()" /> An iterator of this Stack's values. <Signature code={`values(): IterableIterator<T>`} /> <MemberLabel label="entries()" /> An iterator of this Stack's entries as [key, value] tuples. <Signature code={`entries(): IterableIterator<[number, T]>`} /> <MemberLabel label="[Symbol.iterator]()" /> Returns an iterator of this Stack. <Signature code={`[Symbol.iterator](): IterableIterator<T>`} /> ## Collections (Seq) <MemberLabel label="keySeq()" /> Returns a new Seq.Indexed of the keys of this Stack, discarding values. <Signature code={`keySeq(): Seq.Indexed<number>`} /> <MemberLabel label="valueSeq()" /> Returns an Seq.Indexed of the values of this Stack, discarding keys. <Signature code={`valueSeq(): Seq.Indexed<T>`} /> <MemberLabel label="entrySeq()" /> Returns a new Seq.Indexed of [key, value] tuples. <Signature code={`entrySeq(): Seq.Indexed<[number, T]>`} /> ## Side effects <MemberLabel label="forEach()" /> The `sideEffect` is executed for every entry in the Stack. <Signature code={`forEach(sideEffect: (value: T, key: number, iter: this) => unknown, context?: unknown): number`} /> ## Creating subsets <MemberLabel label="slice()" /> Returns a new Stack representing a portion of this Stack from start up to but not including end. <Signature code={`slice(begin?: number, end?: number): Stack<T>`} /> <MemberLabel label="rest()" /> Returns a new Stack containing all entries except the first. <Signature code={`rest(): Stack<T>`} /> <MemberLabel label="butLast()" /> Returns a new Stack containing all entries except the last. <Signature code={`butLast(): Stack<T>`} /> <MemberLabel label="skip()" /> Returns a new Stack which excludes the first `amount` entries from this Stack. <Signature code={`skip(amount: number): Stack<T>`} /> <MemberLabel label="skipLast()" /> Returns a new Stack which excludes the last `amount` entries from this Stack. <Signature code={`skipLast(amount: number): Stack<T>`} /> <MemberLabel label="skipWhile()" /> Returns a new Stack which includes entries starting from when `predicate` first returns false. <Signature code={`skipWhile(predicate: (value: T, key: number, iter: this) => boolean, context?: unknown): Stack<T>`} /> <MemberLabel label="skipUntil()" /> Returns a new Stack which includes entries starting from when `predicate` first returns true. <Signature code={`skipUntil(predicate: (value: T, key: number, iter: this) => boolean, context?: unknown): Stack<T>`} /> <MemberLabel label="take()" /> Returns a new Stack which includes the first `amount` entries from this Stack. <Signature code={`take(amount: number): Stack<T>`} /> <MemberLabel label="takeLast()" /> Returns a new Stack which includes the last `amount` entries from this Stack. <Signature code={`takeLast(amount: number): Stack<T>`} /> <MemberLabel label="takeWhile()" /> Returns a new Stack which includes entries from this Stack as long as the `predicate` returns true. <Signature code={`takeWhile(predicate: (value: T, key: number, iter: this) => boolean, context?: unknown): Stack<T>`} /> <MemberLabel label="takeUntil()" /> Returns a new Stack which includes entries from this Stack as long as the `predicate` returns false. <Signature code={`takeUntil(predicate: (value: T, key: number, iter: this) => boolean, context?: unknown): Stack<T>`} /> ## Reducing a value <MemberLabel label="reduce()" /> Reduces the Stack to a value by calling the `reducer` for every entry in the Stack and passing along the reduced value. <Signature code={`reduce<R>(reducer: (reduction: R, value: T, key: number, iter: this) => R, initialReduction: R, context?: unknown): R reduce<R>(reducer: (reduction: T | R, value: T, key: number, iter: this) => R): R`} /> <MemberLabel label="reduceRight()" /> Reduces the Stack in reverse (from the right side). <Signature code={`reduceRight<R>(reducer: (reduction: R, value: T, key: number, iter: this) => R, initialReduction: R, context?: unknown): R reduceRight<R>(reducer: (reduction: T | R, value: T, key: number, iter: this) => R): R`} /> <MemberLabel label="every()" /> True if `predicate` returns true for all entries in the Stack. <Signature code={`every(predicate: (value: T, key: number, iter: this) => boolean, context?: unknown): boolean`} /> <MemberLabel label="some()" /> True if `predicate` returns true for any entry in the Stack. <Signature code={`some(predicate: (value: T, key: number, iter: this) => boolean, context?: unknown): boolean`} /> <MemberLabel label="join()" /> Joins values together as a string, inserting a separator between each. The default separator is `","`. <Signature code={`join(separator?: string): string`} /> <MemberLabel label="isEmpty()" /> Returns true if this Stack includes no values. <Signature code={`isEmpty(): boolean`} /> <MemberLabel label="count()" /> Returns the size of this Stack. <Signature code={`count(): number count(predicate: (value: T, key: number, iter: this) => boolean, context?: unknown): number`} /> <MemberLabel label="countBy()" /> Returns a `Map` of counts, grouped by the return value of the `grouper` function. <Signature code={`countBy<G>(grouper: (value: T, key: number, iter: this) => G, context?: unknown): Map<G, number>`} /> ## Comparison <MemberLabel label="isSubset()" /> True if `iter` includes every value in this Stack. <Signature code={`isSubset(iter: Iterable<T>): boolean`} /> <MemberLabel label="isSuperset()" /> True if this Stack includes every value in `iter`. <Signature code={`isSuperset(iter: Iterable<T>): boolean`} />