//================================================================ /** * @packageDocumentation * @module std */ //================================================================ import { IBidirectionalContainer } from "../ranges/container/IBidirectionalContainer"; import { IReversableIterator } from "./IReversableIterator"; import { IReverseIterator } from "./IReverseIterator"; import { IPointer } from "../functional/IPointer"; import { IForwardContainer } from "../ranges/container/IForwardContainer"; import { IInsert } from "../internal/container/partial/IInsert"; import { IPushFront } from "../internal/container/partial/IPushFront"; import { IPushBack } from "../internal/container/partial/IPushBack"; import { InsertIterator } from "./InsertIterator"; import { FrontInsertIterator } from "./FrontInsertIterator"; import { BackInsertIterator } from "./BackInsertIterator"; import { IForwardIterator } from "./IForwardIterator"; import { Vector } from "../container/Vector"; /* --------------------------------------------------------- ITERATORS --------------------------------------------------------- */ // BEGIN & END //---- /** * Iterator to the first element. * * @param container Target container. * @return Iterator to the first element. */ export function begin | IForwardContainer>( container: Container, ): IForwardContainer.IteratorType; export function begin(container: Array | Vector): Vector.Iterator { if (container instanceof Array) container = Vector.wrap(container); return container.begin(); } /** * Iterator to the end. * * @param container Target container. * @return Iterator to the end. */ export function end | IForwardContainer>( container: Container, ): IForwardContainer.IteratorType; export function end(container: Array | Vector): Vector.Iterator { if (container instanceof Array) container = Vector.wrap(container); return container.end(); } /** * Get reverse iterator to the first element in reverse. * * @param container Target container. * @return The reverse iterator to the first. */ export function rbegin< Container extends Array | IBidirectionalContainer, >(container: Container): IBidirectionalContainer.ReverseIteratorType; export function rbegin( container: Array | Vector, ): Vector.ReverseIterator { if (container instanceof Array) container = Vector.wrap(container); return container.rbegin(); } /** * Get reverse iterator to the reverse end. * * @param container Target container. * @return The reverse iterator to the end. */ export function rend< Container extends Array | IBidirectionalContainer, >(container: Container): IBidirectionalContainer.ReverseIteratorType; export function rend( container: Array | Vector, ): Vector.ReverseIterator { if (container instanceof Array) container = Vector.wrap(container); return container.rend(); } /** * Construct reverse iterator. * * @param it Target iterator that reversable. * @return The reverse iterator object. */ export function make_reverse_iterator< IteratorT extends IReversableIterator< IPointer.ValueType, IteratorT, ReverseT >, ReverseT extends IReverseIterator< IPointer.ValueType, IteratorT, ReverseT >, >(it: IteratorT): ReverseT { return it.reverse(); } /* --------------------------------------------------------- INSERTERS --------------------------------------------------------- */ /** * Construct insert iterator. * * @param container Target container. * @param it Iterator to the first insertion position. * @return The {@link InsertIterator insert iterator} object. */ export function inserter< Container extends IInsert, Iterator extends IForwardIterator, Iterator>, >(container: Container, it: Iterator): InsertIterator { return new InsertIterator(container, it); } /** * Construct front insert iterator. * * @param source Target container. * @return The {@link FrontInsertIterator front insert iterator} object. */ export function front_inserter< Source extends IPushFront>, >(source: Source): FrontInsertIterator { return new FrontInsertIterator(source); } /** * Construct back insert iterator. * * @param source Target container. * @return The {@link back insert iterator} object. */ export function back_inserter | IPushBack>( source: Source, ): BackInsertIterator>; export function back_inserter( source: Array | Vector, ): BackInsertIterator> { if (source instanceof Array) source = Vector.wrap(source); return new BackInsertIterator(source); }