//================================================================ /** * @packageDocumentation * @module std.base */ //================================================================ import { IBidirectionalContainer } from "../../ranges/container/IBidirectionalContainer"; import { IEmpty } from "../../internal/container/partial/IEmpty"; import { ISize } from "../../internal/container/partial/ISize"; import { IPush } from "../../internal/container/partial/IPush"; import { IForwardIterator } from "../../iterator/IForwardIterator"; import { IReverseIterator } from "../../iterator/IReverseIterator"; import { IReversableIterator } from "../../iterator/IReversableIterator"; /** * Common interface for containers. * * @template T Stored elements' type * @template SourceT Derived type extending this {@link IContainer} * @template IteratorT Iterator type * @template ReverseT Reverse iterator type * @template PElem Parent type of *T*, used for inserting elements through {@link assign} and {@link insert}. * * @author Jeongho Nam - https://github.com/samchon */ export interface IContainer< T extends PElem, SourceT extends IContainer, IteratorT extends IContainer.Iterator< T, SourceT, IteratorT, ReverseT, PElem >, ReverseT extends IContainer.ReverseIterator< T, SourceT, IteratorT, ReverseT, PElem >, PElem = T, > extends IBidirectionalContainer< IContainer.Iterator, ReverseT >, Iterable, IEmpty, ISize, IPush { /* --------------------------------------------------------- ASSIGN & CLEAR --------------------------------------------------------- */ /** * Range Assigner. * * @param first Input iteartor of the first position. * @param last Input iterator of the last position. */ assign< InputIterator extends Readonly>, >( first: InputIterator, last: InputIterator, ): void; /** * @inheritDoc */ clear(): void; /* ========================================================= ACCESSORS - SIZE - ITERATORS ============================================================ SIZE --------------------------------------------------------- */ /** * @inheritDoc */ size(): number; /** * @inheritDoc */ empty(): boolean; /* --------------------------------------------------------- ITERATORS --------------------------------------------------------- */ /** * @inheritDoc */ begin(): IteratorT; /** * @inheritDoc */ end(): IteratorT; /** * @inheritDoc */ rbegin(): ReverseT; /** * @inheritDoc */ rend(): ReverseT; /** * @inheritDoc */ [Symbol.iterator](): IterableIterator; /* --------------------------------------------------------- ELEMENTS I/O --------------------------------------------------------- */ push(...items: PElem[]): number; /** * Erase an element. * * @param pos Position to erase. * @return Iterator following the *pos*, strained by the erasing. */ erase(pos: IteratorT): IteratorT; /** * Erase elements in range. * * @param first Range of the first position to erase. * @param last Rangee of the last position to erase. * @return Iterator following the last removed element, strained by the erasing. */ erase(first: IteratorT, last: IteratorT): IteratorT; /* --------------------------------------------------------------- UTILITIES --------------------------------------------------------------- */ /** * Swap elements. * * @param obj Target container to swap. */ swap(obj: SourceT): void; /** * Native function for `JSON.stringify()`. * * @return An array containing children elements. */ toJSON(): Array; } export namespace IContainer { /** * Iterator of {@link IContainer}. * * @author Jeongho Nam - https://github.com/samchon */ export interface Iterator< T extends Elem, SourceT extends IContainer< T, SourceT, IteratorT, ReverseIteratorT, Elem >, IteratorT extends Iterator< T, SourceT, IteratorT, ReverseIteratorT, Elem >, ReverseIteratorT extends ReverseIterator< T, SourceT, IteratorT, ReverseIteratorT, Elem >, Elem = T, > extends Readonly> { /** * Get source container. * * @return The source container. */ source(): SourceT; /** * @inheritDoc */ reverse(): ReverseIteratorT; } /** * Reverse iterator of {@link IContainer} * * @author Jeongho Nam - https://github.com/samchon */ export interface ReverseIterator< T extends Elem, Source extends IContainer, IteratorT extends Iterator, ReverseT extends ReverseIterator, Elem = T, > extends Readonly> { /** * Get source container. * * @return The source container. */ source(): Source; } }