-
-
Notifications
You must be signed in to change notification settings - Fork 48
/
factory.ts
150 lines (135 loc) · 4.88 KB
/
factory.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
//================================================================
/**
* @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<Container extends Array<any> | IForwardContainer<any>>
(container: Container): IForwardContainer.IteratorType<Container>;
export function begin<T>(container: Array<T> | Vector<T>): Vector.Iterator<T>
{
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<Container extends Array<any> | IForwardContainer<any>>
(container: Container): IForwardContainer.IteratorType<Container>;
export function end<T>(container: Array<T> | Vector<T>): Vector.Iterator<T>
{
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<any> | IBidirectionalContainer<any, any>>
(container: Container): IBidirectionalContainer.ReverseIteratorType<Container>;
export function rbegin<T>(container: Array<T> | Vector<T>): Vector.ReverseIterator<T>
{
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<any> | IBidirectionalContainer<any, any>>
(container: Container): IBidirectionalContainer.ReverseIteratorType<Container>;
export function rend<T>(container: Array<T> | Vector<T>): Vector.ReverseIterator<T>
{
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>, IteratorT, ReverseT>,
ReverseT extends IReverseIterator<IPointer.ValueType<IteratorT>, 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>,
Iterator extends IForwardIterator<IPointer.ValueType<Iterator>, Iterator>>
(container: Container, it: Iterator): InsertIterator<Container, Iterator>
{
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<FrontInsertIterator.ValueType<Source>>>
(source: Source): FrontInsertIterator<Source>
{
return new FrontInsertIterator(source);
}
/**
* Construct back insert iterator.
*
* @param source Target container.
* @return The {@link back insert iterator} object.
*/
export function back_inserter<Source extends Array<any> | IPushBack<any>>
(source: Source): BackInsertIterator<BackInsertIterator.SourceType<Source>>;
export function back_inserter<T>(source: Array<T> | Vector<T>): BackInsertIterator<Vector<T>>
{
if (source instanceof Array)
source = Vector.wrap(source);
return new BackInsertIterator(source);
}