@everyonesoftware/common 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. package/.c8rc.json +12 -0
  2. package/.github/workflows/publish.yml +38 -0
  3. package/.mocharc.json +9 -0
  4. package/README.md +9 -0
  5. package/package.json +36 -0
  6. package/sources/assertMessageParameters.ts +22 -0
  7. package/sources/asyncIterator.ts +437 -0
  8. package/sources/asyncIteratorToJavascriptAsyncIteratorAdapter.ts +48 -0
  9. package/sources/asyncResult.ts +95 -0
  10. package/sources/basicDisposable.ts +57 -0
  11. package/sources/byteList.ts +202 -0
  12. package/sources/byteListStream.ts +121 -0
  13. package/sources/byteReadStream.ts +24 -0
  14. package/sources/byteWriteStream.ts +16 -0
  15. package/sources/bytes.ts +25 -0
  16. package/sources/characterList.ts +195 -0
  17. package/sources/characterListStream.ts +151 -0
  18. package/sources/characterReadStream.ts +81 -0
  19. package/sources/characterReadStreamIterator.ts +128 -0
  20. package/sources/characterWriteStream.ts +45 -0
  21. package/sources/commandLineParameter.ts +45 -0
  22. package/sources/commandLineParameters.ts +21 -0
  23. package/sources/comparable.ts +144 -0
  24. package/sources/comparer.ts +133 -0
  25. package/sources/comparison.ts +20 -0
  26. package/sources/concatenateIterable.ts +119 -0
  27. package/sources/concatenateIterator.ts +165 -0
  28. package/sources/condition.ts +329 -0
  29. package/sources/currentProcess.ts +158 -0
  30. package/sources/dateTime.ts +130 -0
  31. package/sources/depthFirstSearch.ts +230 -0
  32. package/sources/disposable.ts +31 -0
  33. package/sources/emptyError.ts +10 -0
  34. package/sources/english.ts +45 -0
  35. package/sources/equalFunctions.ts +123 -0
  36. package/sources/fetchHttpClient.ts +89 -0
  37. package/sources/fetchHttpResponse.ts +106 -0
  38. package/sources/flatMapIterable.ts +104 -0
  39. package/sources/flatMapIterator.ts +152 -0
  40. package/sources/generator.ts +251 -0
  41. package/sources/httpClient.ts +36 -0
  42. package/sources/httpHeader.ts +37 -0
  43. package/sources/httpHeaders.ts +216 -0
  44. package/sources/httpIncomingRequest.ts +30 -0
  45. package/sources/httpIncomingResponse.ts +19 -0
  46. package/sources/httpMethod.ts +164 -0
  47. package/sources/httpOutgoingRequest.ts +119 -0
  48. package/sources/httpOutgoingResponse.ts +113 -0
  49. package/sources/httpServer.ts +34 -0
  50. package/sources/inMemoryCharacterWriteStream.ts +78 -0
  51. package/sources/index.ts +101 -0
  52. package/sources/iterable.ts +345 -0
  53. package/sources/iterator.ts +481 -0
  54. package/sources/iteratorToJavascriptIteratorAdapter.ts +48 -0
  55. package/sources/javascript.ts +59 -0
  56. package/sources/javascriptArrayList.ts +175 -0
  57. package/sources/javascriptAsyncIteratorToAsyncIteratorAdapter.ts +124 -0
  58. package/sources/javascriptIteratorToIteratorAdapter.ts +133 -0
  59. package/sources/javascriptMapMap.ts +143 -0
  60. package/sources/javascriptSetSet.ts +134 -0
  61. package/sources/list.ts +330 -0
  62. package/sources/listQueue.ts +62 -0
  63. package/sources/listStack.ts +62 -0
  64. package/sources/luxonDateTime.ts +109 -0
  65. package/sources/map.ts +302 -0
  66. package/sources/mapAsyncIterator.ts +141 -0
  67. package/sources/mapIterable.ts +105 -0
  68. package/sources/mapIterator.ts +145 -0
  69. package/sources/mutableCondition.ts +451 -0
  70. package/sources/mutableHttpHeaders.ts +204 -0
  71. package/sources/mutableMap.ts +292 -0
  72. package/sources/network.ts +18 -0
  73. package/sources/node.ts +37 -0
  74. package/sources/nodeJSCharacterWriteStream.ts +42 -0
  75. package/sources/nodeJSHttpIncomingRequest.ts +132 -0
  76. package/sources/nodeJSHttpServer.ts +134 -0
  77. package/sources/notFoundError.ts +12 -0
  78. package/sources/postCondition.ts +284 -0
  79. package/sources/postConditionError.ts +12 -0
  80. package/sources/preCondition.ts +284 -0
  81. package/sources/preConditionError.ts +12 -0
  82. package/sources/promiseAsyncResult.ts +174 -0
  83. package/sources/property.ts +63 -0
  84. package/sources/queue.ts +49 -0
  85. package/sources/realNetwork.ts +28 -0
  86. package/sources/recreationDotGovClient.ts +259 -0
  87. package/sources/searchControl.ts +42 -0
  88. package/sources/set.ts +244 -0
  89. package/sources/skipAsyncIterator.ts +145 -0
  90. package/sources/skipIterator.ts +155 -0
  91. package/sources/stack.ts +48 -0
  92. package/sources/stringComparer.ts +33 -0
  93. package/sources/stringIterator.ts +149 -0
  94. package/sources/strings.ts +322 -0
  95. package/sources/syncResult.ts +300 -0
  96. package/sources/takeAsyncIterator.ts +141 -0
  97. package/sources/takeIterator.ts +151 -0
  98. package/sources/toStringFunctions.ts +185 -0
  99. package/sources/types.ts +371 -0
  100. package/sources/whereAsyncIterator.ts +143 -0
  101. package/sources/whereIterable.ts +108 -0
  102. package/sources/whereIterator.ts +157 -0
  103. package/sources/wonderlandTrailClient.ts +1503 -0
  104. package/tests/assertTest.ts +113 -0
  105. package/tests/assertTestTests.ts +75 -0
  106. package/tests/basicTestSkip.ts +51 -0
  107. package/tests/byteListStreamTests.ts +390 -0
  108. package/tests/byteListTests.ts +27 -0
  109. package/tests/bytesTests.ts +43 -0
  110. package/tests/characterListStreamTests.ts +391 -0
  111. package/tests/characterListTests.ts +250 -0
  112. package/tests/characterWriteStreamTests.ts +12 -0
  113. package/tests/comparerTests.ts +92 -0
  114. package/tests/conditionTests.ts +877 -0
  115. package/tests/consoleTestRunner.ts +404 -0
  116. package/tests/consoleTestRunnerTests.ts +651 -0
  117. package/tests/dateTimeTests.ts +30 -0
  118. package/tests/depthFirstSearchTests.ts +106 -0
  119. package/tests/disposableTests.ts +121 -0
  120. package/tests/englishTests.ts +103 -0
  121. package/tests/equalFunctionsTests.ts +223 -0
  122. package/tests/failedTest.ts +43 -0
  123. package/tests/fetchHttpClientTests.ts +33 -0
  124. package/tests/generatorTests.ts +86 -0
  125. package/tests/httpClientTests.ts +18 -0
  126. package/tests/inMemoryCharacterWriteStreamTests.ts +117 -0
  127. package/tests/iterableTests.ts +141 -0
  128. package/tests/iteratorTests.ts +1086 -0
  129. package/tests/javascriptMapMapTests.ts +21 -0
  130. package/tests/listTests.ts +338 -0
  131. package/tests/mapIteratorTests.ts +55 -0
  132. package/tests/mapTests.ts +104 -0
  133. package/tests/mutableConditionTests.ts +273 -0
  134. package/tests/mutableMapTests.ts +154 -0
  135. package/tests/nodeJSHttpServerTests.ts +75 -0
  136. package/tests/notFoundErrorTests.ts +24 -0
  137. package/tests/postConditionErrorTests.ts +24 -0
  138. package/tests/preConditionErrorTests.ts +24 -0
  139. package/tests/promiseAsyncResultTests.ts +688 -0
  140. package/tests/propertyTests.ts +63 -0
  141. package/tests/queueTests.ts +29 -0
  142. package/tests/recreationDotGovClientTests.ts +191 -0
  143. package/tests/setTests.ts +140 -0
  144. package/tests/skippedTest.ts +39 -0
  145. package/tests/stackTests.ts +66 -0
  146. package/tests/stringComparerTests.ts +60 -0
  147. package/tests/stringIteratorTests.ts +156 -0
  148. package/tests/stringsTests.ts +516 -0
  149. package/tests/syncResultTests.ts +1251 -0
  150. package/tests/test.ts +228 -0
  151. package/tests/testAction.ts +75 -0
  152. package/tests/testActionTests.ts +93 -0
  153. package/tests/testFailureTests.ts +12 -0
  154. package/tests/testRunner.ts +267 -0
  155. package/tests/testRunnerTests.ts +895 -0
  156. package/tests/testSkip.ts +34 -0
  157. package/tests/tests.ts +103 -0
  158. package/tests/toStringFunctionsTests.ts +55 -0
  159. package/tests/typesTests.ts +257 -0
  160. package/tests/whereIteratorTests.ts +77 -0
  161. package/tests/wonderlandTrailClientTests.ts +452 -0
  162. package/tsconfig.json +17 -0
  163. package/tsup.config.ts +13 -0
@@ -0,0 +1,144 @@
1
+ import { Comparison } from "./comparison";
2
+ import { PreCondition } from "./preCondition";
3
+
4
+ /**
5
+ * An type that can be compared against another type.
6
+ */
7
+ export abstract class Comparable<T>
8
+ {
9
+ protected constructor()
10
+ {
11
+ }
12
+
13
+ /**
14
+ * Compare this value against the provided value.
15
+ * @param value The value to compare against.
16
+ */
17
+ public abstract compareTo(value: T): Comparison;
18
+
19
+ /**
20
+ * Get whether this value is less than the provided value.
21
+ * @param value The value to compare against.
22
+ */
23
+ public lessThan(value: T): boolean
24
+ {
25
+ return Comparable.lessThan(this, value);
26
+ }
27
+
28
+ /**
29
+ * Get whether the left value is less than the right value.
30
+ * @param left The left value in the comparison.
31
+ * @param right The right value in the comparison.
32
+ */
33
+ public static lessThan<T>(left: Comparable<T>, right: T): boolean
34
+ {
35
+ PreCondition.assertNotUndefinedAndNotNull(left, "left");
36
+
37
+ return left.compareTo(right) === Comparison.LessThan;
38
+ }
39
+
40
+ /**
41
+ * Get whether this value is less than or equal to the provided value.
42
+ * @param value The value to compare against.
43
+ */
44
+ public lessThanOrEqualTo(value: T): boolean
45
+ {
46
+ return Comparable.lessThanOrEqualTo(this, value);
47
+ }
48
+
49
+ /**
50
+ * Get whether the left value is less than or equal to the right value.
51
+ * @param left The left value in the comparison.
52
+ * @param right The right value in the comparison.
53
+ */
54
+ public static lessThanOrEqualTo<T>(left: Comparable<T>, right: T): boolean
55
+ {
56
+ PreCondition.assertNotUndefinedAndNotNull(left, "left");
57
+
58
+ return left.compareTo(right) !== Comparison.GreaterThan;
59
+ }
60
+
61
+ /**
62
+ * Get whether this value equals the provided value.
63
+ * @param value The value to compare against.
64
+ */
65
+ public equals(value: T): boolean
66
+ {
67
+ return Comparable.equals(this, value);
68
+ }
69
+
70
+ /**
71
+ * Get whether the left value equals the right value.
72
+ * @param left The left value in the comparison.
73
+ * @param right The right value in the comparison.
74
+ */
75
+ public static equals<T>(left: Comparable<T>, right: T): boolean
76
+ {
77
+ PreCondition.assertNotUndefinedAndNotNull(left, "left");
78
+
79
+ return left.compareTo(right) === Comparison.Equal;
80
+ }
81
+
82
+ /**
83
+ * Get whether this value is not equal to the provided value.
84
+ * @param value The value to compare against.
85
+ */
86
+ public notEquals(value: T): boolean
87
+ {
88
+ return Comparable.notEquals(this, value);
89
+ }
90
+
91
+ /**
92
+ * Get whether the left value is not equal to the right value.
93
+ * @param left The left value in the comparison.
94
+ * @param right The right value in the comparison.
95
+ */
96
+ public static notEquals<T>(left: Comparable<T>, right: T): boolean
97
+ {
98
+ PreCondition.assertNotUndefinedAndNotNull(left, "left");
99
+
100
+ return left.compareTo(right) !== Comparison.Equal;
101
+ }
102
+
103
+ /**
104
+ * Get whether this value is greater than or equal to the provided value.
105
+ * @param value The value to compare against.
106
+ */
107
+ public greaterThanOrEqualTo(value: T): boolean
108
+ {
109
+ return Comparable.greaterThanOrEqualTo(this, value);
110
+ }
111
+
112
+ /**
113
+ * Get whether the left value is greater than or equal to the right value.
114
+ * @param left The left value in the comparison.
115
+ * @param right The right value in the comparison.
116
+ */
117
+ public static greaterThanOrEqualTo<T>(left: Comparable<T>, right: T): boolean
118
+ {
119
+ PreCondition.assertNotUndefinedAndNotNull(left, "left");
120
+
121
+ return left.compareTo(right) !== Comparison.LessThan;
122
+ }
123
+
124
+ /**
125
+ * Get whether this value is greater than the provided value.
126
+ * @param value The value to compare against.
127
+ */
128
+ public greaterThan(value: T): boolean
129
+ {
130
+ return Comparable.greaterThan(this, value);
131
+ }
132
+
133
+ /**
134
+ * Get whether the left value is greater than the right value.
135
+ * @param left The left value in the comparison.
136
+ * @param right The right value in the comparison.
137
+ */
138
+ public static greaterThan<T>(left: Comparable<T>, right: T): boolean
139
+ {
140
+ PreCondition.assertNotUndefinedAndNotNull(left, "left");
141
+
142
+ return left.compareTo(right) === Comparison.GreaterThan;
143
+ }
144
+ }
@@ -0,0 +1,133 @@
1
+ import { Comparison } from "./comparison";
2
+
3
+ /**
4
+ * A type that can be used to compare values.
5
+ */
6
+ export abstract class Comparer<TLeft, TRight = TLeft>
7
+ {
8
+ /**
9
+ * Compare the two provided values.
10
+ * @param left The left value to compare.
11
+ * @param right The right value to compare.
12
+ */
13
+ public abstract compare(left: TLeft, right: TRight): Comparison;
14
+
15
+ /**
16
+ * Get whether the left value is less than the right value.
17
+ * @param left The left value to compare.
18
+ * @param right The right value to compare.
19
+ */
20
+ public lessThan(left: TLeft, right: TRight): boolean
21
+ {
22
+ return this.compare(left, right) === Comparison.LessThan;
23
+ }
24
+
25
+ /**
26
+ * Get whether the left value is less than or equal to the right value.
27
+ * @param left The left value to compare.
28
+ * @param right The right value to compare.
29
+ */
30
+ public lessThanOrEqual(left: TLeft, right: TRight): boolean
31
+ {
32
+ return this.compare(left, right) !== Comparison.GreaterThan;
33
+ }
34
+
35
+ /**
36
+ * Get whether the left value equals the right value.
37
+ * @param left The left value to compare.
38
+ * @param right The right value to compare.
39
+ */
40
+ public equal(left: TLeft, right: TRight): boolean
41
+ {
42
+ return this.compare(left, right) === Comparison.Equal;
43
+ }
44
+
45
+ /**
46
+ * Get whether the left value is greater than or equal to the right value.
47
+ * @param left The left value to compare.
48
+ * @param right The right value to compare.
49
+ */
50
+ public greaterThanOrEqualTo(left: TLeft, right: TRight): boolean
51
+ {
52
+ return this.compare(left, right) !== Comparison.LessThan;
53
+ }
54
+
55
+ /**
56
+ * Get whether the left value is greater than the right value.
57
+ * @param left The left value to compare.
58
+ * @param right The right value to compare.
59
+ */
60
+ public greaterThan(left: TLeft, right: TRight): boolean
61
+ {
62
+ return this.compare(left, right) === Comparison.GreaterThan;
63
+ }
64
+
65
+ /**
66
+ * Attempt to compare the left and right values. The comparison will be done on whether they are
67
+ * the same value (left === right) or whether one is undefined or null. If they aren't the same
68
+ * value and neither is undefined or null, then this function can't compare them and will return
69
+ * undefined.
70
+ * @param left The left value of the comparison.
71
+ * @param right The right value of the comparison.
72
+ */
73
+ public static compareSameUndefinedNull(left: unknown, right: unknown): Comparison | undefined
74
+ {
75
+ let result: Comparison | undefined = undefined;
76
+ if (left === right)
77
+ {
78
+ result = Comparison.Equal;
79
+ }
80
+ else if (left === undefined)
81
+ {
82
+ result = Comparison.LessThan;
83
+ }
84
+ else if (right === undefined)
85
+ {
86
+ result = Comparison.GreaterThan;
87
+ }
88
+ else if (left === null)
89
+ {
90
+ result = Comparison.LessThan;
91
+ }
92
+ else if (right === null)
93
+ {
94
+ result = Comparison.GreaterThan;
95
+ }
96
+ return result;
97
+ }
98
+
99
+ /**
100
+ * Get whether the left and right values are equal. The comparison will be done on whether they
101
+ * are the same value (left === right) or whether one is undefined or null. If they aren't the
102
+ * same value and neither is undefined or null, then this function can't determine whether they
103
+ * are equal and will return undefined.
104
+ * @param left The left value of the comparison.
105
+ * @param right The right value of the comparison.
106
+ */
107
+ public static equalSameUndefinedNull(left: unknown, right: unknown): boolean | undefined
108
+ {
109
+ let result: Comparison | undefined = Comparer.compareSameUndefinedNull(left, right);
110
+ return result === undefined ? undefined : result === Comparison.Equal;
111
+ }
112
+
113
+ public static compareNumbers(left: number | undefined | null, right: number | undefined | null): Comparison
114
+ {
115
+ let result: Comparison | undefined = Comparer.compareSameUndefinedNull(left, right);
116
+ if (result === undefined)
117
+ {
118
+ if (left! < right!)
119
+ {
120
+ result = Comparison.LessThan;
121
+ }
122
+ // else if (left === right)
123
+ // {
124
+ // result = Comparison.Equal;
125
+ // }
126
+ else
127
+ {
128
+ result = Comparison.GreaterThan;
129
+ }
130
+ }
131
+ return result;
132
+ }
133
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The result of comparing two values.
3
+ */
4
+ export enum Comparison
5
+ {
6
+ /**
7
+ * The left value is less than the right value.
8
+ */
9
+ LessThan,
10
+
11
+ /**
12
+ * The two values are equal.
13
+ */
14
+ Equal,
15
+
16
+ /**
17
+ * The left value is greater than the right value.
18
+ */
19
+ GreaterThan,
20
+ }
@@ -0,0 +1,119 @@
1
+ import { ConcatenateIterator } from "./concatenateIterator";
2
+ import { EqualFunctions } from "./equalFunctions";
3
+ import { Iterable } from "./iterable";
4
+ import { Iterator } from "./iterator";
5
+ import { JavascriptIterable, JavascriptIterator } from "./javascript";
6
+ import { List } from "./list";
7
+ import { PreCondition } from "./preCondition";
8
+ import { SyncResult } from "./syncResult";
9
+ import { ToStringFunctions } from "./toStringFunctions";
10
+ import { Type } from "./types";
11
+
12
+ export class ConcatenateIterable<T> implements Iterable<T>
13
+ {
14
+ private readonly innerIterables: Iterable<Iterable<T>>;
15
+
16
+ private constructor(innerIterables: Iterable<Iterable<T>>)
17
+ {
18
+ PreCondition.assertNotUndefinedAndNotNull(innerIterables, "innerIterables");
19
+
20
+ this.innerIterables = innerIterables;
21
+ }
22
+
23
+ public static create<T>(innerIterable: Iterable<T>, ...toConcatenate: JavascriptIterable<T>[]): ConcatenateIterable<T>
24
+ {
25
+ PreCondition.assertNotUndefinedAndNotNull(innerIterable, "innerIterable");
26
+ PreCondition.assertNotUndefinedAndNotNull(toConcatenate, "toConcatenate");
27
+
28
+ const innerIterables: List<Iterable<T>> = List.create();
29
+ innerIterables.add(innerIterable);
30
+ for (const value of toConcatenate)
31
+ {
32
+ innerIterables.add(Iterable.create(value));
33
+ }
34
+ return new ConcatenateIterable<T>(innerIterables);
35
+ }
36
+
37
+ public iterate(): Iterator<T>
38
+ {
39
+ return ConcatenateIterator.create<T>(...this.innerIterables);
40
+ }
41
+
42
+ public toArray(): SyncResult<T[]>
43
+ {
44
+ return Iterable.toArray(this);
45
+ }
46
+
47
+ public any(): SyncResult<boolean>
48
+ {
49
+ return Iterable.any(this);
50
+ }
51
+
52
+ public getCount(): SyncResult<number>
53
+ {
54
+ return SyncResult.create(() =>
55
+ {
56
+ let result: number = 0;
57
+ for (const innerIterable of this.innerIterables)
58
+ {
59
+ result += innerIterable.getCount().await();
60
+ }
61
+ return result;
62
+ });
63
+ }
64
+
65
+ public equals(right: JavascriptIterable<T>, equalFunctions?: EqualFunctions): SyncResult<boolean>
66
+ {
67
+ return Iterable.equals(this, right, equalFunctions);
68
+ }
69
+
70
+ public toString(toStringFunctions?: ToStringFunctions): string
71
+ {
72
+ return Iterable.toString(this, toStringFunctions);
73
+ }
74
+
75
+ public concatenate(...toConcatenate: JavascriptIterable<T>[]): Iterable<T>
76
+ {
77
+ return Iterable.concatenate(this, ...toConcatenate);
78
+ }
79
+
80
+ public map<TOutput>(mapping: (value: T) => TOutput | SyncResult<TOutput>): Iterable<TOutput>
81
+ {
82
+ return Iterable.map(this, mapping);
83
+ }
84
+
85
+ public flatMap<TOutput>(mapping: (value: T) => JavascriptIterable<TOutput>): Iterable<TOutput>
86
+ {
87
+ return Iterable.flatMap(this, mapping);
88
+ }
89
+
90
+ public where(condition: (value: T) => (boolean | SyncResult<boolean>)): Iterable<T>
91
+ {
92
+ return Iterable.where(this, condition);
93
+ }
94
+
95
+ public instanceOf<TOutput extends T>(typeOrTypeCheck: Type<TOutput> | ((value: T) => value is TOutput)): Iterable<TOutput>
96
+ {
97
+ return Iterable.instanceOf(this, typeOrTypeCheck);
98
+ }
99
+
100
+ public first(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>
101
+ {
102
+ return Iterable.first(this, condition);
103
+ }
104
+
105
+ public last(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>
106
+ {
107
+ return Iterable.last(this, condition);
108
+ }
109
+
110
+ public contains(value: T, equalFunctions?: EqualFunctions): SyncResult<boolean>
111
+ {
112
+ return Iterable.contains(this, value, equalFunctions);
113
+ }
114
+
115
+ public [Symbol.iterator](): JavascriptIterator<T>
116
+ {
117
+ return Iterable[Symbol.iterator](this);
118
+ }
119
+ }
@@ -0,0 +1,165 @@
1
+ import { Iterator } from "./iterator";
2
+ import { JavascriptIterable, JavascriptIterator } from "./javascript";
3
+ import { List } from "./list";
4
+ import { PreCondition } from "./preCondition";
5
+ import { SyncResult } from "./syncResult";
6
+ import { Type } from "./types";
7
+
8
+ export class ConcatenateIterator<T> implements Iterator<T>
9
+ {
10
+ private readonly innerIterators: Iterator<Iterator<T>>;
11
+
12
+ private constructor(innerIterators: Iterator<Iterator<T>>)
13
+ {
14
+ PreCondition.assertNotUndefinedAndNotNull(innerIterators, "innerIterators");
15
+
16
+ this.innerIterators = innerIterators;
17
+ }
18
+
19
+ public static create<T>(...toConcatenate: JavascriptIterable<T>[]): ConcatenateIterator<T>
20
+ {
21
+ PreCondition.assertNotUndefinedAndNotNull(toConcatenate, "toConcatenate");
22
+
23
+ const innerIterators: List<Iterator<T>> = List.create();
24
+ for (const value of toConcatenate)
25
+ {
26
+ innerIterators.add(Iterator.create(value));
27
+ }
28
+ return new ConcatenateIterator<T>(innerIterators.iterate());
29
+ }
30
+
31
+ public next(): SyncResult<boolean>
32
+ {
33
+ return SyncResult.create(() =>
34
+ {
35
+ let innerIteratorAtBeginning: boolean = false;
36
+ if (!this.innerIterators.hasStarted())
37
+ {
38
+ this.innerIterators.next().await();
39
+ innerIteratorAtBeginning = true;
40
+ }
41
+
42
+ while (this.innerIterators.hasCurrent())
43
+ {
44
+ const innerIterator: Iterator<T> = this.innerIterators.getCurrent();
45
+ if (innerIteratorAtBeginning)
46
+ {
47
+ innerIterator.start().await();
48
+ }
49
+ else
50
+ {
51
+ innerIterator.next().await();
52
+ }
53
+
54
+ if (innerIterator.hasCurrent())
55
+ {
56
+ break;
57
+ }
58
+ else
59
+ {
60
+ this.innerIterators.next().await();
61
+ innerIteratorAtBeginning = true;
62
+ }
63
+ }
64
+
65
+ return this.hasCurrent();
66
+ });
67
+ }
68
+
69
+ public hasStarted(): boolean
70
+ {
71
+ return this.innerIterators.hasStarted();
72
+ }
73
+
74
+ public hasCurrent(): boolean
75
+ {
76
+ return this.innerIterators.hasCurrent();
77
+ }
78
+
79
+ public getCurrent(): T
80
+ {
81
+ PreCondition.assertTrue(this.hasCurrent(), "this.hasCurrent()");
82
+
83
+ return this.innerIterators.getCurrent().getCurrent();
84
+ }
85
+
86
+ public start(): SyncResult<this>
87
+ {
88
+ return Iterator.start<T, this>(this);
89
+ }
90
+
91
+ public takeCurrent(): SyncResult<T>
92
+ {
93
+ return Iterator.takeCurrent(this);
94
+ }
95
+
96
+ public any(): SyncResult<boolean>
97
+ {
98
+ return Iterator.any(this);
99
+ }
100
+
101
+ public getCount(): SyncResult<number>
102
+ {
103
+ return Iterator.getCount(this);
104
+ }
105
+
106
+ public toArray(): SyncResult<T[]>
107
+ {
108
+ return Iterator.toArray(this);
109
+ }
110
+
111
+ public concatenate(...toConcatenate: JavascriptIterable<T>[]): Iterator<T>
112
+ {
113
+ return Iterator.concatenate(this, ...toConcatenate);
114
+ }
115
+
116
+ public where(condition: (value: T) => (boolean | SyncResult<boolean>)): Iterator<T>
117
+ {
118
+ return Iterator.where(this, condition);
119
+ }
120
+
121
+ public map<TOutput>(mapping: (value: T) => TOutput | SyncResult<TOutput>): Iterator<TOutput>
122
+ {
123
+ return Iterator.map(this, mapping);
124
+ }
125
+
126
+ public flatMap<TOutput>(mapping: (value: T) => JavascriptIterable<TOutput>): Iterator<TOutput>
127
+ {
128
+ return Iterator.flatMap(this, mapping);
129
+ }
130
+
131
+ public whereInstanceOf<U extends T>(typeCheck: (value: T) => value is U): Iterator<U>
132
+ {
133
+ return Iterator.whereInstanceOf(this, typeCheck);
134
+ }
135
+
136
+ public whereInstanceOfType<U extends T>(type: Type<U>): Iterator<U>
137
+ {
138
+ return Iterator.whereInstanceOfType(this, type);
139
+ }
140
+
141
+ public first(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>
142
+ {
143
+ return Iterator.first(this, condition);
144
+ }
145
+
146
+ public last(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>
147
+ {
148
+ return Iterator.last(this, condition);
149
+ }
150
+
151
+ public take(maximumToTake: number): Iterator<T>
152
+ {
153
+ return Iterator.take(this, maximumToTake);
154
+ }
155
+
156
+ public skip(maximumToSkip: number): Iterator<T>
157
+ {
158
+ return Iterator.skip(this, maximumToSkip);
159
+ }
160
+
161
+ public [Symbol.iterator](): JavascriptIterator<T>
162
+ {
163
+ return Iterator[Symbol.iterator](this);
164
+ }
165
+ }