//================================================================ /** * @packageDocumentation * @module std.ranges */ //================================================================ import { IForwardContainer } from "./IForwardContainer"; import { IReverseIterator } from "../../iterator/IReverseIterator"; import { IReversableIterator } from "../../iterator/IReversableIterator"; import { IPointer } from "../../functional/IPointer"; import { Vector } from "../../container/Vector"; /** * Bidirection iterable container. * * @template Iterator Iterator type * @author Jeongho Nam - https://github.com/samchon */ export interface IBidirectionalContainer< IteratorT extends IReversableIterator< IPointer.ValueType, IteratorT, ReverseIteratorT >, ReverseIteratorT extends IReverseIterator< IPointer.ValueType, IteratorT, ReverseIteratorT >, > extends IForwardContainer { /** * Reverse iterator to the first element in reverse. * * @return Reverse iterator to the first. */ rbegin(): ReverseIteratorT; /** * Reverse iterator to the reverse end. * * @return Reverse iterator to the end. */ rend(): ReverseIteratorT; } export namespace IBidirectionalContainer { /** * Deduct iterator type. */ export type IteratorType< Container extends Array | IBidirectionalContainer, > = Container extends Array ? Vector.Iterator : Container extends IBidirectionalContainer ? Iterator : unknown; /** * Deduct reverse iterator type. */ export type ReverseIteratorType< Container extends Array | IBidirectionalContainer, > = Container extends Array ? Vector.ReverseIterator : Container extends IBidirectionalContainer ? ReverseIterator : unknown; /** * Deduct value type. */ export type ValueType< Container extends Array | IBidirectionalContainer, > = IPointer.ValueType>; }