@everyonesoftware/common 3.0.0 → 5.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 (176) hide show
  1. package/outputs/chunk-AY3YWKOM.js +7741 -0
  2. package/outputs/chunk-AY3YWKOM.js.map +1 -0
  3. package/outputs/sources.cjs +9007 -0
  4. package/outputs/sources.cjs.map +1 -0
  5. package/outputs/sources.d.cts +4082 -0
  6. package/outputs/sources.d.ts +4082 -0
  7. package/outputs/sources.js +1370 -0
  8. package/outputs/sources.js.map +1 -0
  9. package/outputs/tests.cjs +17208 -0
  10. package/outputs/tests.cjs.map +1 -0
  11. package/outputs/tests.d.cts +3 -0
  12. package/outputs/tests.d.ts +3 -0
  13. package/outputs/tests.js +9798 -0
  14. package/outputs/tests.js.map +1 -0
  15. package/package.json +6 -1
  16. package/.c8rc.json +0 -12
  17. package/.github/workflows/publish.yml +0 -54
  18. package/.mocharc.json +0 -9
  19. package/sources/assertMessageParameters.ts +0 -22
  20. package/sources/asyncIterator.ts +0 -437
  21. package/sources/asyncIteratorToJavascriptAsyncIteratorAdapter.ts +0 -48
  22. package/sources/asyncResult.ts +0 -95
  23. package/sources/basicDisposable.ts +0 -57
  24. package/sources/byteList.ts +0 -202
  25. package/sources/byteListStream.ts +0 -121
  26. package/sources/byteReadStream.ts +0 -24
  27. package/sources/byteWriteStream.ts +0 -16
  28. package/sources/bytes.ts +0 -25
  29. package/sources/characterList.ts +0 -195
  30. package/sources/characterListStream.ts +0 -151
  31. package/sources/characterReadStream.ts +0 -81
  32. package/sources/characterReadStreamIterator.ts +0 -128
  33. package/sources/characterWriteStream.ts +0 -45
  34. package/sources/commandLineParameter.ts +0 -45
  35. package/sources/commandLineParameters.ts +0 -21
  36. package/sources/comparable.ts +0 -144
  37. package/sources/comparer.ts +0 -133
  38. package/sources/comparison.ts +0 -20
  39. package/sources/concatenateIterable.ts +0 -119
  40. package/sources/concatenateIterator.ts +0 -165
  41. package/sources/condition.ts +0 -329
  42. package/sources/currentProcess.ts +0 -158
  43. package/sources/dateTime.ts +0 -130
  44. package/sources/depthFirstSearch.ts +0 -230
  45. package/sources/disposable.ts +0 -31
  46. package/sources/emptyError.ts +0 -10
  47. package/sources/english.ts +0 -45
  48. package/sources/equalFunctions.ts +0 -123
  49. package/sources/fetchHttpClient.ts +0 -89
  50. package/sources/fetchHttpResponse.ts +0 -106
  51. package/sources/flatMapIterable.ts +0 -104
  52. package/sources/flatMapIterator.ts +0 -152
  53. package/sources/generator.ts +0 -251
  54. package/sources/httpClient.ts +0 -36
  55. package/sources/httpHeader.ts +0 -37
  56. package/sources/httpHeaders.ts +0 -216
  57. package/sources/httpIncomingRequest.ts +0 -30
  58. package/sources/httpIncomingResponse.ts +0 -19
  59. package/sources/httpMethod.ts +0 -164
  60. package/sources/httpOutgoingRequest.ts +0 -119
  61. package/sources/httpOutgoingResponse.ts +0 -113
  62. package/sources/httpServer.ts +0 -34
  63. package/sources/inMemoryCharacterWriteStream.ts +0 -78
  64. package/sources/index.ts +0 -101
  65. package/sources/iterable.ts +0 -345
  66. package/sources/iterator.ts +0 -481
  67. package/sources/iteratorToJavascriptIteratorAdapter.ts +0 -48
  68. package/sources/javascript.ts +0 -59
  69. package/sources/javascriptArrayList.ts +0 -175
  70. package/sources/javascriptAsyncIteratorToAsyncIteratorAdapter.ts +0 -124
  71. package/sources/javascriptIteratorToIteratorAdapter.ts +0 -133
  72. package/sources/javascriptMapMap.ts +0 -143
  73. package/sources/javascriptSetSet.ts +0 -134
  74. package/sources/list.ts +0 -330
  75. package/sources/listQueue.ts +0 -62
  76. package/sources/listStack.ts +0 -62
  77. package/sources/luxonDateTime.ts +0 -109
  78. package/sources/map.ts +0 -302
  79. package/sources/mapAsyncIterator.ts +0 -141
  80. package/sources/mapIterable.ts +0 -105
  81. package/sources/mapIterator.ts +0 -145
  82. package/sources/mutableCondition.ts +0 -451
  83. package/sources/mutableHttpHeaders.ts +0 -204
  84. package/sources/mutableMap.ts +0 -292
  85. package/sources/network.ts +0 -18
  86. package/sources/node.ts +0 -37
  87. package/sources/nodeJSCharacterWriteStream.ts +0 -42
  88. package/sources/nodeJSHttpIncomingRequest.ts +0 -132
  89. package/sources/nodeJSHttpServer.ts +0 -134
  90. package/sources/notFoundError.ts +0 -12
  91. package/sources/postCondition.ts +0 -284
  92. package/sources/postConditionError.ts +0 -12
  93. package/sources/preCondition.ts +0 -284
  94. package/sources/preConditionError.ts +0 -12
  95. package/sources/promiseAsyncResult.ts +0 -174
  96. package/sources/property.ts +0 -63
  97. package/sources/queue.ts +0 -49
  98. package/sources/realNetwork.ts +0 -28
  99. package/sources/recreationDotGovClient.ts +0 -259
  100. package/sources/searchControl.ts +0 -42
  101. package/sources/set.ts +0 -244
  102. package/sources/skipAsyncIterator.ts +0 -145
  103. package/sources/skipIterator.ts +0 -155
  104. package/sources/stack.ts +0 -48
  105. package/sources/stringComparer.ts +0 -33
  106. package/sources/stringIterator.ts +0 -149
  107. package/sources/strings.ts +0 -322
  108. package/sources/syncResult.ts +0 -300
  109. package/sources/takeAsyncIterator.ts +0 -141
  110. package/sources/takeIterator.ts +0 -151
  111. package/sources/toStringFunctions.ts +0 -185
  112. package/sources/types.ts +0 -371
  113. package/sources/whereAsyncIterator.ts +0 -143
  114. package/sources/whereIterable.ts +0 -108
  115. package/sources/whereIterator.ts +0 -157
  116. package/sources/wonderlandTrailClient.ts +0 -1503
  117. package/tests/assertTest.ts +0 -113
  118. package/tests/assertTestTests.ts +0 -75
  119. package/tests/basicTestSkip.ts +0 -51
  120. package/tests/byteListStreamTests.ts +0 -390
  121. package/tests/byteListTests.ts +0 -27
  122. package/tests/bytesTests.ts +0 -43
  123. package/tests/characterListStreamTests.ts +0 -391
  124. package/tests/characterListTests.ts +0 -250
  125. package/tests/characterWriteStreamTests.ts +0 -12
  126. package/tests/comparerTests.ts +0 -92
  127. package/tests/conditionTests.ts +0 -877
  128. package/tests/consoleTestRunner.ts +0 -404
  129. package/tests/consoleTestRunnerTests.ts +0 -651
  130. package/tests/dateTimeTests.ts +0 -30
  131. package/tests/depthFirstSearchTests.ts +0 -106
  132. package/tests/disposableTests.ts +0 -121
  133. package/tests/englishTests.ts +0 -103
  134. package/tests/equalFunctionsTests.ts +0 -223
  135. package/tests/failedTest.ts +0 -43
  136. package/tests/fetchHttpClientTests.ts +0 -33
  137. package/tests/generatorTests.ts +0 -86
  138. package/tests/httpClientTests.ts +0 -18
  139. package/tests/inMemoryCharacterWriteStreamTests.ts +0 -117
  140. package/tests/iterableTests.ts +0 -141
  141. package/tests/iteratorTests.ts +0 -1086
  142. package/tests/javascriptMapMapTests.ts +0 -21
  143. package/tests/listTests.ts +0 -338
  144. package/tests/mapIteratorTests.ts +0 -55
  145. package/tests/mapTests.ts +0 -104
  146. package/tests/mutableConditionTests.ts +0 -273
  147. package/tests/mutableMapTests.ts +0 -154
  148. package/tests/nodeJSHttpServerTests.ts +0 -75
  149. package/tests/notFoundErrorTests.ts +0 -24
  150. package/tests/postConditionErrorTests.ts +0 -24
  151. package/tests/preConditionErrorTests.ts +0 -24
  152. package/tests/promiseAsyncResultTests.ts +0 -688
  153. package/tests/propertyTests.ts +0 -63
  154. package/tests/queueTests.ts +0 -29
  155. package/tests/recreationDotGovClientTests.ts +0 -191
  156. package/tests/setTests.ts +0 -140
  157. package/tests/skippedTest.ts +0 -39
  158. package/tests/stackTests.ts +0 -66
  159. package/tests/stringComparerTests.ts +0 -60
  160. package/tests/stringIteratorTests.ts +0 -156
  161. package/tests/stringsTests.ts +0 -516
  162. package/tests/syncResultTests.ts +0 -1251
  163. package/tests/test.ts +0 -228
  164. package/tests/testAction.ts +0 -75
  165. package/tests/testActionTests.ts +0 -93
  166. package/tests/testFailureTests.ts +0 -12
  167. package/tests/testRunner.ts +0 -267
  168. package/tests/testRunnerTests.ts +0 -895
  169. package/tests/testSkip.ts +0 -34
  170. package/tests/tests.ts +0 -103
  171. package/tests/toStringFunctionsTests.ts +0 -55
  172. package/tests/typesTests.ts +0 -257
  173. package/tests/whereIteratorTests.ts +0 -77
  174. package/tests/wonderlandTrailClientTests.ts +0 -452
  175. package/tsconfig.json +0 -20
  176. package/tsup.config.ts +0 -13
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../sources/index.ts","../sources/bytes.ts","../sources/comparison.ts","../sources/comparer.ts","../sources/condition.ts","../sources/emptyError.ts","../sources/types.ts","../sources/promiseAsyncResult.ts","../sources/syncResult.ts","../sources/flatMapIterator.ts","../sources/iteratorToJavascriptIteratorAdapter.ts","../sources/javascriptIteratorToIteratorAdapter.ts","../sources/mapIterator.ts","../sources/strings.ts","../sources/notFoundError.ts","../sources/skipIterator.ts","../sources/takeIterator.ts","../sources/whereIterator.ts","../sources/iterator.ts","../sources/javascriptArrayList.ts","../sources/javascript.ts","../sources/javascriptMapMap.ts","../sources/mutableMap.ts","../sources/map.ts","../sources/javascriptSetSet.ts","../sources/set.ts","../sources/toStringFunctions.ts","../sources/list.ts","../sources/concatenateIterator.ts","../sources/concatenateIterable.ts","../sources/flatMapIterable.ts","../sources/mapIterable.ts","../sources/whereIterable.ts","../sources/iterable.ts","../sources/equalFunctions.ts","../sources/mutableCondition.ts","../sources/preConditionError.ts","../sources/preCondition.ts","../sources/asyncIteratorToJavascriptAsyncIteratorAdapter.ts","../sources/javascriptAsyncIteratorToAsyncIteratorAdapter.ts","../sources/mapAsyncIterator.ts","../sources/skipAsyncIterator.ts","../sources/takeAsyncIterator.ts","../sources/whereAsyncIterator.ts","../sources/asyncIterator.ts","../sources/asyncResult.ts","../sources/basicDisposable.ts","../sources/byteList.ts","../sources/byteListStream.ts","../sources/byteReadStream.ts","../sources/byteWriteStream.ts","../sources/stringIterator.ts","../sources/characterList.ts","../sources/characterReadStream.ts","../sources/postConditionError.ts","../sources/postCondition.ts","../sources/characterWriteStream.ts","../sources/characterListStream.ts","../sources/characterReadStreamIterator.ts","../sources/commandLineParameter.ts","../sources/commandLineParameters.ts","../sources/comparable.ts","../sources/nodeJSCharacterWriteStream.ts","../sources/property.ts","../sources/httpHeader.ts","../sources/mutableHttpHeaders.ts","../sources/httpHeaders.ts","../sources/httpIncomingResponse.ts","../sources/fetchHttpResponse.ts","../sources/httpMethod.ts","../sources/httpOutgoingRequest.ts","../sources/fetchHttpClient.ts","../sources/network.ts","../sources/nodeJSHttpServer.ts","../sources/httpServer.ts","../sources/httpOutgoingResponse.ts","../sources/realNetwork.ts","../sources/currentProcess.ts","../sources/luxonDateTime.ts","../sources/dateTime.ts","../sources/listStack.ts","../sources/stack.ts","../sources/depthFirstSearch.ts","../sources/disposable.ts","../sources/english.ts","../sources/generator.ts","../sources/httpClient.ts","../sources/httpIncomingRequest.ts","../sources/inMemoryCharacterWriteStream.ts","../sources/listQueue.ts","../sources/node.ts","../sources/nodeJSHttpIncomingRequest.ts","../sources/queue.ts","../sources/recreationDotGovClient.ts","../sources/searchControl.ts","../sources/stringComparer.ts","../sources/wonderlandTrailClient.ts"],"sourcesContent":["/**\n * @file Automatically generated by barrelsby.\n */\n\nexport * from \"./assertMessageParameters\";\nexport * from \"./asyncIterator\";\nexport * from \"./asyncIteratorToJavascriptAsyncIteratorAdapter\";\nexport * from \"./asyncResult\";\nexport * from \"./basicDisposable\";\nexport * from \"./byteList\";\nexport * from \"./byteListStream\";\nexport * from \"./byteReadStream\";\nexport * from \"./byteWriteStream\";\nexport * from \"./bytes\";\nexport * from \"./characterList\";\nexport * from \"./characterListStream\";\nexport * from \"./characterReadStream\";\nexport * from \"./characterReadStreamIterator\";\nexport * from \"./characterWriteStream\";\nexport * from \"./commandLineParameter\";\nexport * from \"./commandLineParameters\";\nexport * from \"./comparable\";\nexport * from \"./comparer\";\nexport * from \"./comparison\";\nexport * from \"./concatenateIterable\";\nexport * from \"./concatenateIterator\";\nexport * from \"./condition\";\nexport * from \"./currentProcess\";\nexport * from \"./dateTime\";\nexport * from \"./depthFirstSearch\";\nexport * from \"./disposable\";\nexport * from \"./emptyError\";\nexport * from \"./english\";\nexport * from \"./equalFunctions\";\nexport * from \"./fetchHttpClient\";\nexport * from \"./fetchHttpResponse\";\nexport * from \"./flatMapIterable\";\nexport * from \"./flatMapIterator\";\nexport * from \"./generator\";\nexport * from \"./httpClient\";\nexport * from \"./httpHeader\";\nexport * from \"./httpHeaders\";\nexport * from \"./httpIncomingRequest\";\nexport * from \"./httpIncomingResponse\";\nexport * from \"./httpMethod\";\nexport * from \"./httpOutgoingRequest\";\nexport * from \"./httpOutgoingResponse\";\nexport * from \"./httpServer\";\nexport * from \"./inMemoryCharacterWriteStream\";\nexport * from \"./iterable\";\nexport * from \"./iterator\";\nexport * from \"./iteratorToJavascriptIteratorAdapter\";\nexport * from \"./javascript\";\nexport * from \"./javascriptArrayList\";\nexport * from \"./javascriptAsyncIteratorToAsyncIteratorAdapter\";\nexport * from \"./javascriptIteratorToIteratorAdapter\";\nexport * from \"./javascriptMapMap\";\nexport * from \"./javascriptSetSet\";\nexport * from \"./list\";\nexport * from \"./listQueue\";\nexport * from \"./listStack\";\nexport * from \"./luxonDateTime\";\nexport * from \"./map\";\nexport * from \"./mapAsyncIterator\";\nexport * from \"./mapIterable\";\nexport * from \"./mapIterator\";\nexport * from \"./mutableCondition\";\nexport * from \"./mutableHttpHeaders\";\nexport * from \"./mutableMap\";\nexport * from \"./network\";\nexport * from \"./node\";\nexport * from \"./nodeJSCharacterWriteStream\";\nexport * from \"./nodeJSHttpIncomingRequest\";\nexport * from \"./nodeJSHttpServer\";\nexport * from \"./notFoundError\";\nexport * from \"./postCondition\";\nexport * from \"./postConditionError\";\nexport * from \"./preCondition\";\nexport * from \"./preConditionError\";\nexport * from \"./promiseAsyncResult\";\nexport * from \"./property\";\nexport * from \"./queue\";\nexport * from \"./realNetwork\";\nexport * from \"./recreationDotGovClient\";\nexport * from \"./searchControl\";\nexport * from \"./set\";\nexport * from \"./skipAsyncIterator\";\nexport * from \"./skipIterator\";\nexport * from \"./stack\";\nexport * from \"./stringComparer\";\nexport * from \"./stringIterator\";\nexport * from \"./strings\";\nexport * from \"./syncResult\";\nexport * from \"./takeAsyncIterator\";\nexport * from \"./takeIterator\";\nexport * from \"./toStringFunctions\";\nexport * from \"./types\";\nexport * from \"./whereAsyncIterator\";\nexport * from \"./whereIterable\";\nexport * from \"./whereIterator\";\nexport * from \"./wonderlandTrailClient\";\n","/**\r\n * A collection of values and functions for interacting with bytes.\r\n */\r\nexport abstract class Bytes\r\n{\r\n /**\r\n * The minimum value that a byte can have.\r\n */\r\n public static readonly minimumValue: number = 0;\r\n\r\n /**\r\n * The maximum value (inclusive) that a byte can have.\r\n */\r\n public static readonly maximumValue: number = 255;\r\n\r\n /**\r\n * Get whether the provided value is within the range of a valid byte (between 0 and\r\n * 255).\r\n * @param value The value to check.\r\n */\r\n public static isByte(value: number): boolean\r\n {\r\n return Bytes.minimumValue <= value && value <= Bytes.maximumValue;\r\n }\r\n}","/**\r\n * The result of comparing two values.\r\n */\r\nexport enum Comparison\r\n{\r\n /**\r\n * The left value is less than the right value.\r\n */\r\n LessThan,\r\n\r\n /**\r\n * The two values are equal.\r\n */\r\n Equal,\r\n\r\n /**\r\n * The left value is greater than the right value.\r\n */\r\n GreaterThan,\r\n}","import { Comparison } from \"./comparison\";\r\n\r\n/**\r\n * A type that can be used to compare values.\r\n */\r\nexport abstract class Comparer<TLeft, TRight = TLeft>\r\n{\r\n /**\r\n * Compare the two provided values.\r\n * @param left The left value to compare.\r\n * @param right The right value to compare.\r\n */\r\n public abstract compare(left: TLeft, right: TRight): Comparison;\r\n\r\n /**\r\n * Get whether the left value is less than the right value.\r\n * @param left The left value to compare.\r\n * @param right The right value to compare.\r\n */\r\n public lessThan(left: TLeft, right: TRight): boolean\r\n {\r\n return this.compare(left, right) === Comparison.LessThan;\r\n }\r\n\r\n /**\r\n * Get whether the left value is less than or equal to the right value.\r\n * @param left The left value to compare.\r\n * @param right The right value to compare.\r\n */\r\n public lessThanOrEqual(left: TLeft, right: TRight): boolean\r\n {\r\n return this.compare(left, right) !== Comparison.GreaterThan;\r\n }\r\n\r\n /**\r\n * Get whether the left value equals the right value.\r\n * @param left The left value to compare.\r\n * @param right The right value to compare.\r\n */\r\n public equal(left: TLeft, right: TRight): boolean\r\n {\r\n return this.compare(left, right) === Comparison.Equal;\r\n }\r\n\r\n /**\r\n * Get whether the left value is greater than or equal to the right value.\r\n * @param left The left value to compare.\r\n * @param right The right value to compare.\r\n */\r\n public greaterThanOrEqualTo(left: TLeft, right: TRight): boolean\r\n {\r\n return this.compare(left, right) !== Comparison.LessThan;\r\n }\r\n\r\n /**\r\n * Get whether the left value is greater than the right value.\r\n * @param left The left value to compare.\r\n * @param right The right value to compare.\r\n */\r\n public greaterThan(left: TLeft, right: TRight): boolean\r\n {\r\n return this.compare(left, right) === Comparison.GreaterThan;\r\n }\r\n\r\n /**\r\n * Attempt to compare the left and right values. The comparison will be done on whether they are\r\n * the same value (left === right) or whether one is undefined or null. If they aren't the same\r\n * value and neither is undefined or null, then this function can't compare them and will return\r\n * undefined.\r\n * @param left The left value of the comparison.\r\n * @param right The right value of the comparison.\r\n */\r\n public static compareSameUndefinedNull(left: unknown, right: unknown): Comparison | undefined\r\n {\r\n let result: Comparison | undefined = undefined;\r\n if (left === right)\r\n {\r\n result = Comparison.Equal;\r\n }\r\n else if (left === undefined)\r\n {\r\n result = Comparison.LessThan;\r\n }\r\n else if (right === undefined)\r\n {\r\n result = Comparison.GreaterThan;\r\n }\r\n else if (left === null)\r\n {\r\n result = Comparison.LessThan;\r\n }\r\n else if (right === null)\r\n {\r\n result = Comparison.GreaterThan;\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Get whether the left and right values are equal. The comparison will be done on whether they\r\n * are the same value (left === right) or whether one is undefined or null. If they aren't the\r\n * same value and neither is undefined or null, then this function can't determine whether they\r\n * are equal and will return undefined.\r\n * @param left The left value of the comparison.\r\n * @param right The right value of the comparison.\r\n */\r\n public static equalSameUndefinedNull(left: unknown, right: unknown): boolean | undefined\r\n {\r\n let result: Comparison | undefined = Comparer.compareSameUndefinedNull(left, right);\r\n return result === undefined ? undefined : result === Comparison.Equal;\r\n }\r\n\r\n public static compareNumbers(left: number | undefined | null, right: number | undefined | null): Comparison\r\n {\r\n let result: Comparison | undefined = Comparer.compareSameUndefinedNull(left, right);\r\n if (result === undefined)\r\n {\r\n if (left! < right!)\r\n {\r\n result = Comparison.LessThan;\r\n }\r\n // else if (left === right)\r\n // {\r\n // result = Comparison.Equal;\r\n // }\r\n else\r\n {\r\n result = Comparison.GreaterThan;\r\n }\r\n }\r\n return result;\r\n }\r\n}","import { Bytes } from \"./bytes\";\r\nimport { JavascriptIterable } from \"./javascript\";\r\nimport { MutableCondition } from \"./mutableCondition\";\r\nimport { Type } from \"./types\";\r\n\r\n/**\r\n * A collection of condition methods that can be used to assert the state of an application.\r\n */\r\nexport abstract class Condition\r\n{\r\n protected constructor()\r\n {\r\n }\r\n\r\n /**\r\n * Create a new {@link MutableCondition} object.\r\n */\r\n public static create(): MutableCondition\r\n {\r\n return MutableCondition.create();\r\n }\r\n\r\n /**\r\n * Assert that the provided value is undefined.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public assertUndefined(value: unknown, expression?: string, message?: string): asserts value is undefined\r\n {\r\n Condition.assertUndefined(this, value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is undefined.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public static assertUndefined(condition: Condition, value: unknown, expression?: string, message?: string): asserts value is undefined\r\n {\r\n condition.assertSame(undefined, value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is not undefined and not null.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public assertNotUndefined<T>(value: T, expression?: string, message?: string): asserts value is NonNullable<T>\r\n {\r\n Condition.assertNotUndefined(this, value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is not undefined and not null.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public static assertNotUndefined<T>(condition: Condition, value: T, expression?: string, message?: string): asserts value is NonNullable<T>\r\n {\r\n condition.assertNotSame(undefined, value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is not undefined and not null.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public assertNotUndefinedAndNotNull<T>(value: T, expression?: string, message?: string): asserts value is NonNullable<T>\r\n {\r\n Condition.assertNotUndefinedAndNotNull(this, value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is not undefined and not null.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public static assertNotUndefinedAndNotNull<T>(condition: Condition, value: T, expression?: string, message?: string): asserts value is NonNullable<T>\r\n {\r\n condition.assertNotSame(undefined, value, expression, message);\r\n condition.assertNotSame(null, value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is true.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public assertTrue(value: boolean, expression?: string, message?: string): asserts value is true\r\n {\r\n Condition.assertTrue(this, value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is true.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public static assertTrue(condition: Condition, value: boolean, expression?: string, message?: string): asserts value is true\r\n {\r\n condition.assertSame(true, value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is false.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public assertFalse(value: boolean, expression?: string, message?: string): asserts value is false\r\n {\r\n Condition.assertFalse(this, value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is false.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public static assertFalse(condition: Condition, value: boolean, expression?: string, message?: string): asserts value is false\r\n {\r\n condition.assertSame(false, value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided actual value is the same as the provided expected value.\r\n * @param expected The expected value.\r\n * @param actual The actual value.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public abstract assertSame<T>(expected: T, actual: T, expression?: string, message?: string): void;\r\n\r\n /**\r\n * Assert that the provided actual value is not the same as the provided expected value.\r\n * @param expected The expected value.\r\n * @param actual The actual value.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public abstract assertNotSame<T>(expected: T, actual: T, expression?: string, message?: string): void;\r\n\r\n /**\r\n * Assert that the provided actual value is equal to the provided expected value.\r\n * @param expected The expected value.\r\n * @param actual The actual value.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public abstract assertEqual<T>(expected: T, actual: T, expression?: string, message?: string): void;\r\n\r\n /**\r\n * Assert that the provided actual value is not equal to the provided expected value.\r\n * @param notExpected The not expected value.\r\n * @param actual The actual value.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public abstract assertNotEqual<T>(notExpected: T, actual: T, expression?: string, message?: string): void;\r\n\r\n /**\r\n * Assert that the provided value is not empty.\r\n * @param value The value to check.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public abstract assertNotEmpty(value: JavascriptIterable<unknown> | string | undefined | null, expression?: string, message?: string): void;\r\n\r\n /**\r\n * Assert that the provided value is less than the provided upperBound.\r\n * @param value The value to check.\r\n * @param upperBound The upperBound that the value must be less than.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public abstract assertLessThan(value: number, upperBound: number, expression?: string, message?: string): void;\r\n\r\n /**\r\n * Assert that the provided value is less than or equal to the provided upperBound.\r\n * @param value The value to check.\r\n * @param upperBound The upperBound that the value must be less than.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public abstract assertLessThanOrEqualTo(value: number, upperBound: number, expression?: string, message?: string): void;\r\n\r\n /**\r\n * Assert that the provided value is greater than or equal to the provided lowerBound.\r\n * @param value The value to check.\r\n * @param lowerBound The lowerBound that the value must be greater than or equal to.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public abstract assertGreaterThanOrEqualTo(value: number, lowerBound: number, expression?: string, message?: string): void;\r\n\r\n /**\r\n * Assert that the provided value is greater than the provided lowerBound.\r\n * @param value The value to check.\r\n * @param lowerBound The lowerBound that the value must be greater than.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public abstract assertGreaterThan(value: number, lowerBound: number, expression?: string, message?: string): void;\r\n\r\n /**\r\n * Assert that the value is greater than or equal to the lowerBound and less than or equal to\r\n * the upperBound.\r\n * @param lowerBound The lowerBound that the value must be greater than or equal to.\r\n * @param value The value to check.\r\n * @param upperBound The upperBound that the value must be less than or equal to.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public abstract assertBetween(lowerBound: number, value: number, upperBound: number, expression?: string, message?: string): void;\r\n\r\n /**\r\n * Assert that the index is within the access bounds of an indexable with the provided count.\r\n * @param index The index to check.\r\n * @param count The number of elements in the indexable.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public assertAccessIndex(index: number, count: number, expression?: string, message?: string): void\r\n {\r\n Condition.assertAccessIndex(this, index, count, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the index is within the access bounds of an indexable with the provided count.\r\n * @param index The index to check.\r\n * @param count The number of elements in the indexable.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertAccessIndex(condition: Condition, index: number, count: number, expression?: string, message?: string): void\r\n {\r\n condition.assertBetween(0, index, count - 1, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the index is within the insertion bounds of a {@link List} with the provided count.\r\n * @param index The index to check.\r\n * @param count The number of elements in the indexable.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public assertInsertIndex(index: number, count: number, expression?: string, message?: string): void\r\n {\r\n Condition.assertInsertIndex(this, index, count, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the index is within the insertion bounds of a {@link List} with the provided count.\r\n * @param index The index to check.\r\n * @param count The number of elements in the indexable.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertInsertIndex(condition: Condition, index: number, count: number, expression?: string, message?: string): void\r\n {\r\n condition.assertBetween(0, index, count, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the value is one of the possibilities.\r\n * @param possibilities The possible values that the value can be.\r\n * @param value The value to check.\r\n * @param expression The expression that produced the value.\r\n * @param message An optional error message.\r\n */\r\n public abstract assertOneOf<T>(possibilities: JavascriptIterable<T>, value: T, expression?: string, message?: string): void;\r\n\r\n /**\r\n * Assert that the value is within the bounds of a byte.\r\n * @param value The value to check.\r\n * @param expression The expression that produced the value.\r\n * @param message An optional error message.\r\n */\r\n public assertByte(value: number, expression?: string, message?: string): void\r\n {\r\n Condition.assertByte(this, value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the value is within the bounds of a byte.\r\n * @param value The value to check.\r\n * @param expression The expression that produced the value.\r\n * @param message An optional error message.\r\n */\r\n public static assertByte(condition: Condition, value: number, expression?: string, message?: string): void\r\n {\r\n condition.assertBetween(Bytes.minimumValue, value, Bytes.maximumValue, expression, message);\r\n condition.assertInteger(value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the value is an integer.\r\n * @param value The value to check.\r\n * @param expression The expression that produced the value.\r\n * @param message An optional error message.\r\n */\r\n public abstract assertInteger(value: number, expression?: string, message?: string): void;\r\n\r\n /**\r\n * Assert that the provided value is an instance of the provided {@link Type}.\r\n * @param value The value to check.\r\n * @param type The {@link Type} to check.\r\n * @param expression The expression that produced the value.\r\n * @param message An optional error message.\r\n */\r\n public abstract assertInstanceOf<T>(value: unknown, type: Type<T>, typeCheck?: (value: unknown) => value is T, expression?: string, message?: string): asserts value is T;\r\n /**\r\n * Assert that the provided value is an instance of the provided {@link Type}.\r\n * @param value The value to check.\r\n * @param type The {@link Type} to check.\r\n * @param expression The expression that produced the value.\r\n * @param message An optional error message.\r\n */\r\n public abstract assertInstanceOf<T>(parameters: { value: unknown, type: Type<T>, typeCheck?: (value: unknown) => value is T, expression?: string, message?: string }): void;\r\n}","/**\r\n * An {@link Error} that is created when something is empty.\r\n */\r\nexport class EmptyError extends Error\r\n{\r\n public constructor(message?: string)\r\n {\r\n super(message);\r\n }\r\n}","import { Iterable } from \"./iterable\";\r\nimport { Iterator } from \"./iterator\";\r\nimport { JavascriptAsyncIterable, JavascriptAsyncIterator, JavascriptIterable, JavascriptIterator } from \"./javascript\";\r\n\r\n/**\r\n * A {@link Type} that can be used to pass types as parameters.\r\n */\r\nexport type Type<T> = Function & { prototype: T };\r\n\r\n/**\r\n * Get whether the provided value is an instance of {@link Type} {@link T}.\r\n * @param typeOrTypeCheck The {@link Type} to look for or type check {@link Function} to determine\r\n * if the provided value is a {@link T}.\r\n * @param value The value to check.\r\n */\r\nexport function instanceOf<T>(value: unknown, typeCheck: (value: unknown) => value is T): value is T;\r\n/**\r\n * Get whether the provided value is an instance of {@link Type} {@link T}.\r\n * @param typeOrTypeCheck The {@link Type} to look for or type check {@link Function} to determine\r\n * if the provided value is a {@link T}.\r\n * @param value The value to check.\r\n */\r\nexport function instanceOf<T>(value: unknown, type: Type<T>, typeCheck?: (value: unknown) => value is T): value is T;\r\nexport function instanceOf<T>(value: unknown, typeOrTypeCheck: Type<T> | ((value: unknown) => value is T), typeCheck?: (value: unknown) => value is T): value is T\r\n{\r\n let result: boolean;\r\n if (!isUndefinedOrNull(typeCheck))\r\n {\r\n result = typeCheck(value);\r\n }\r\n else if (value instanceof typeOrTypeCheck)\r\n {\r\n result = true;\r\n }\r\n else if (isFunctionWithParameterCount(typeOrTypeCheck, 1))\r\n {\r\n typeCheck = typeOrTypeCheck as ((value: unknown) => value is T);\r\n result = typeCheck(value);\r\n }\r\n else\r\n {\r\n result = false;\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Get whether the provided value is an instance of the provided {@link Type}. This will return\r\n * false if value only implements the provided {@link Type} but doesn't extend it.\r\n * @param value The value to check.\r\n * @param type The {@link Type} to see if value is an instance of.\r\n */\r\nexport function instanceOfType<T>(value: unknown, type: Type<T>): value is T\r\n{\r\n return value instanceof type;\r\n}\r\n\r\n/**\r\n * If the provided {@link value} is of type {@link T} (according to the provided {@link typeCheck}),\r\n * then return the {@link value}. Otherwise return undefined.\r\n * @param value The value to check.\r\n * @param typeOrTypeCheck The {@link Type} to look for or type check {@link Function} to determine\r\n * if the provided value is a {@link T}.\r\n */\r\nexport function as<T>(value: unknown, typeOrTypeCheck: Type<T> | ((value: unknown) => value is T)): T | undefined\r\n{\r\n return instanceOf(value, typeOrTypeCheck) ? value as T : undefined;\r\n}\r\n\r\n/**\r\n * Get whether the provided value is undefined.\r\n * @param value The value to check.\r\n */\r\nexport function isUndefined(value: unknown): value is undefined\r\n{\r\n return value === undefined;\r\n}\r\n\r\n/**\r\n * Get whether the provided value is null.\r\n * @param value The value to check.\r\n */\r\nexport function isNull(value: unknown): value is null\r\n{\r\n return value === null;\r\n}\r\n\r\n/**\r\n * Return the provided value if it is null, otherwise return undefined.\r\n * @param value The value to check.\r\n */\r\nexport function asNull(value: unknown): null | undefined\r\n{\r\n return as(value, isNull);\r\n}\r\n\r\n/**\r\n * Get whether the provided value is undefined or null.\r\n * @param value The value to check.\r\n */\r\nexport function isUndefinedOrNull(value: unknown): value is undefined | null\r\n{\r\n return isUndefined(value) || isNull(value);\r\n}\r\n\r\n/**\r\n * Get whether the provided value is a {@link boolean}.\r\n * @param value The value to check.\r\n */\r\nexport function isBoolean(value: unknown): value is boolean\r\n{\r\n return typeof value === \"boolean\";\r\n}\r\n\r\n/**\r\n * Return the provided value if it is a boolean, otherwise return undefined.\r\n * @param value The value to check.\r\n */\r\nexport function asBoolean(value: unknown): boolean | undefined\r\n{\r\n return as(value, isBoolean);\r\n}\r\n\r\n/**\r\n * Get whether the provided value is a {@link number}.\r\n * @param value The value to check.\r\n */\r\nexport function isNumber(value: unknown): value is number\r\n{\r\n return typeof value === \"number\";\r\n}\r\n\r\n/**\r\n * Return the provided value if it is a number, otherwise return undefined.\r\n * @param value The value to check.\r\n */\r\nexport function asNumber(value: unknown): number | undefined\r\n{\r\n return as(value, isNumber);\r\n}\r\n\r\n/**\r\n * Get whether the provided value is a {@link string}.\r\n * @param value The value to check.\r\n */\r\nexport function isString(value: unknown): value is string\r\n{\r\n return typeof value === \"string\";\r\n}\r\n\r\n/**\r\n * Return the provided value if it is a string, otherwise return undefined.\r\n * @param value The value to check.\r\n */\r\nexport function asString(value: unknown): string | undefined\r\n{\r\n return as(value, isString);\r\n}\r\n\r\n/**\r\n * Get whether the provided value is a {@link function}.\r\n * @param value The value to check.\r\n */\r\nexport function isFunction(value: unknown): value is Function\r\n{\r\n return typeof value === \"function\";\r\n}\r\n\r\n/**\r\n * Return the provided value if it is a function, otherwise return undefined.\r\n * @param value The value to check.\r\n */\r\nexport function asFunction(value: unknown): Function | undefined\r\n{\r\n return as(value, isFunction);\r\n}\r\n\r\n/**\r\n * Get the number of parameters that the provided {@link Function} takes.\r\n * @param value The {@link Function} to get the parameter count for.\r\n */\r\nexport function getParameterCount(value: Function): number\r\n{\r\n return value.length;\r\n}\r\n\r\n/**\r\n * Get whether the provided value is a function with the provided parameter count.\r\n * @param value The value to check.\r\n * @param parameterCount The number of parameters the function must have.\r\n */\r\nexport function isFunctionWithParameterCount(value: unknown, parameterCount: number): value is Function\r\n{\r\n return isFunction(value) && getParameterCount(value) === parameterCount;\r\n}\r\n\r\n/**\r\n * Return the provided value if it is a function with the provided {@link parameterCount}, otherwise\r\n * return undefined.\r\n * @param value The value to check.\r\n */\r\nexport function asFunctionWithParameterCount(value: unknown, parameterCount: number): Function | undefined\r\n{\r\n return as(value, (v: unknown) => isFunctionWithParameterCount(v, parameterCount));\r\n}\r\n\r\n/**\r\n * Get whether the provided value is an {@link Array}.\r\n * @param value The value to check.\r\n */\r\nexport function isArray(value: unknown): value is unknown[]\r\n{\r\n return Array.isArray(value);\r\n}\r\n\r\n/**\r\n * Return the provided value if it is an array, otherwise return undefined.\r\n * @param value The value to check.\r\n */\r\nexport function asArray(value: unknown): unknown[] | undefined\r\n{\r\n return as(value, isArray);\r\n}\r\n\r\n/**\r\n * Get whether the provided value is an {@link Object} or is null.\r\n * @param value The value to check.\r\n */\r\nexport function isObjectOrArrayOrNull(value: unknown): value is {} | unknown[] | null\r\n{\r\n return typeof value === \"object\";\r\n}\r\n\r\n/**\r\n * Return the provided value if it is an array, otherwise return undefined.\r\n * @param value The value to check.\r\n */\r\nexport function asObjectOrArrayOrNull(value: unknown): {} | unknown[] | null | undefined\r\n{\r\n return as(value, isObjectOrArrayOrNull);\r\n}\r\n\r\n/**\r\n * Get whether the provided value is an {@link Object}.\r\n * @param value The value to check.\r\n * @returns \r\n */\r\nexport function isObject(value: unknown): value is {}\r\n{\r\n return isObjectOrArrayOrNull(value) && !!value && !isArray(value);\r\n}\r\n\r\n/**\r\n * Return the provided value if it is an {@link Object}, otherwise return undefined.\r\n * @param value The value to check.\r\n */\r\nexport function asObject(value: unknown): {} | undefined\r\n{\r\n return as(value, isObject);\r\n}\r\n\r\n/**\r\n * Get an {@link Iterator} that can be used to iterate through the properties of the provided value.\r\n * @param value The value to iterate over.\r\n */\r\nexport function getPropertyNames(value: {}): Iterable<string>\r\n{\r\n return Iterable.create(Object.keys(value));\r\n}\r\n\r\n/**\r\n * Get whether the provided value has a property with the provided key.\r\n * @param value The value to check.\r\n * @param propertyKey The key of the property to look for.\r\n */\r\nexport function hasProperty<TValue, TPropertyKey extends PropertyKey>(value: TValue, propertyKey: TPropertyKey): value is TValue & Record<TPropertyKey, unknown>\r\n{\r\n return value !== undefined && value !== null && (value as any)[propertyKey] !== undefined;\r\n}\r\n\r\n/**\r\n * Get whether the value has a function with the provided name.\r\n * @param value The value to check.\r\n * @param functionName The name of the function to look for.\r\n */\r\nexport function hasFunction<TValue, TPropertyKey extends PropertyKey>(value: TValue, functionName: TPropertyKey, parameterCount?: number): value is TValue & Record<TPropertyKey,Function>\r\n{\r\n let result: boolean = false;\r\n if (value !== undefined && value !== null)\r\n {\r\n const func: unknown = (value as any)[functionName];\r\n if (isUndefinedOrNull(parameterCount))\r\n {\r\n result = isFunction(func);\r\n }\r\n else\r\n {\r\n result = isFunctionWithParameterCount(func, parameterCount);\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Get whether the provided value is a {@link JavascriptIterator}.\r\n * @param value The value to check.\r\n */\r\nexport function isJavascriptIterator<T>(value: unknown): value is JavascriptIterator<T>\r\n{\r\n return hasFunction(value, \"next\");\r\n}\r\n\r\n/**\r\n * Get whether the provided value is a {@link JavascriptIterable}.\r\n * @param value The value to check.\r\n */\r\nexport function isJavascriptIterable<T>(value: unknown): value is JavascriptIterable<T>\r\n{\r\n return hasFunction(value, Symbol.iterator);\r\n}\r\n\r\nexport function isIterable<T>(value: unknown): value is Iterable<T>\r\n{\r\n return isJavascriptIterable(value) &&\r\n hasFunction(value, \"iterate\", 0);\r\n}\r\n\r\n/**\r\n * Get whether the provided value is a {@link JavascriptAsyncIterator}.\r\n * @param value The value to check.\r\n */\r\nexport function isJavascriptAsyncIterator<T>(value: unknown): value is JavascriptAsyncIterator<T>\r\n{\r\n return hasFunction(value, \"next\");\r\n}\r\n\r\n/**\r\n * Get whether the provided value is a {@link JavascriptAsyncIterable}.\r\n * @param value The value to check.\r\n */\r\nexport function isJavascriptAsyncIterable<T>(value: unknown): value is JavascriptAsyncIterable<T>\r\n{\r\n return hasFunction(value, Symbol.asyncIterator);\r\n}\r\n\r\nexport function isAsyncIterable<T>(value: unknown): value is AsyncIterable<T>\r\n{\r\n return isJavascriptAsyncIterable(value) &&\r\n hasFunction(value, \"iterate\", 0);\r\n}\r\n\r\n/**\r\n * Get the name of the provided {@link Type}.\r\n * @param type The {@link Type} to get the name of.\r\n */\r\nexport function getName(type: Type<unknown>): string\r\n{\r\n return type.name;\r\n}\r\n\r\nexport function isPromiseLike<T>(value: unknown): value is PromiseLike<T>\r\n{\r\n return hasFunction(value, \"then\", 2);\r\n}\r\n\r\nexport function isPromise<T>(value: unknown): value is Promise<T>\r\n{\r\n return isPromiseLike<T>(value) &&\r\n hasFunction(value, \"catch\", 1) &&\r\n hasFunction(value, \"finally\", 1);\r\n}","import { PreCondition } from \"./preCondition\";\nimport { AsyncResult } from \"./asyncResult\";\nimport { instanceOfType, isPromise, isUndefinedOrNull, Type } from \"./types\";\n\nexport class PromiseAsyncResult<T> implements AsyncResult<T>\n{\n private readonly promise: Promise<T>;\n\n private constructor(promise: Promise<T>)\n {\n PreCondition.assertNotUndefinedAndNotNull(promise, \"promise\");\n\n this.promise = promise;\n }\n\n public static create<T>(action: () => (T | Promise<T>)): PromiseAsyncResult<T>;\n public static create<T>(promise: Promise<T>): PromiseAsyncResult<T>;\n static create<T>(actionOrPromise: (() => (T | Promise<T>)) | Promise<T>): PromiseAsyncResult<T>\n {\n PreCondition.assertNotUndefinedAndNotNull(actionOrPromise, \"action or promise\");\n\n return new PromiseAsyncResult(Promise.resolve(isPromise<T>(actionOrPromise) ? actionOrPromise : actionOrPromise()));\n }\n\n public static value<T>(value: T): PromiseAsyncResult<T>\n {\n return PromiseAsyncResult.create(Promise.resolve(value));\n }\n\n public static error<T>(error: unknown): PromiseAsyncResult<T>\n {\n return PromiseAsyncResult.create(Promise.reject(error));\n }\n\n public static yield(): PromiseAsyncResult<void>\n {\n return PromiseAsyncResult.create(Promise.resolve());\n }\n\n public then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null | undefined, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined): PromiseAsyncResult<TResult1 | TResult2>\n {\n return PromiseAsyncResult.create(this.promise.then(onfulfilled, onrejected));\n }\n\n public onValue(onValueFunction: (value: T) => (void | Promise<void>)): PromiseAsyncResult<T>\n {\n return this.then<T>(async (value: T) =>\n {\n let result: PromiseAsyncResult<T>;\n try\n {\n await onValueFunction(value);\n result = this;\n }\n catch (error)\n {\n result = PromiseAsyncResult.error(error);\n }\n return result;\n })\n }\n\n public catch<TResult = never>(onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null): PromiseAsyncResult<T | TResult>\n public catch<TError,TResult = never>(errorType: Type<TError>, onrejected: (reason: TError) => (TResult | PromiseLike<TResult>)): PromiseAsyncResult<T | TResult>\n catch<TResult = never>(errorTypeOrOnRejected?: Type<Error> | ((reason: unknown) => TResult | PromiseLike<TResult>) | null, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null): PromiseAsyncResult<T | TResult>\n {\n let errorType: Type<Error> | undefined;\n if (!isUndefinedOrNull(onrejected))\n {\n errorType = errorTypeOrOnRejected as Type<unknown>;\n\n PreCondition.assertNotUndefinedAndNotNull(errorType, \"errorType\");\n }\n else\n {\n onrejected = errorTypeOrOnRejected as ((reason: any) => TResult | PromiseLike<TResult>) | null;\n }\n\n return PromiseAsyncResult.create<T | TResult>(this.promise.catch((reason: unknown) =>\n {\n let value: TResult | PromiseLike<TResult> | undefined;\n if (errorType && !instanceOfType(reason, errorType))\n {\n throw reason;\n }\n else if (!isUndefinedOrNull(onrejected))\n {\n value = onrejected(reason);\n }\n return value!;\n }));\n }\n\n public onError(onErrorFunction: (reason: unknown) => (void | PromiseLike<void>)): PromiseAsyncResult<T>;\n public onError<TError>(errorType: Type<TError>, onErrorFunction: (reason: TError) => (void | PromiseLike<void>)): PromiseAsyncResult<T>;\n onError(errorTypeOrOnErrorFunction: Type<unknown> | ((reason: unknown) => (void | PromiseLike<void>)), onErrorFunction?: (reason: unknown) => (void | PromiseLike<void>)): PromiseAsyncResult<T>\n {\n let errorType: Type<unknown> | undefined;\n if (!isUndefinedOrNull(onErrorFunction))\n {\n errorType = errorTypeOrOnErrorFunction as Type<unknown>;\n\n PreCondition.assertNotUndefinedAndNotNull(errorType, \"errorType\");\n }\n else\n {\n onErrorFunction = errorTypeOrOnErrorFunction as ((reason: unknown) => void | PromiseLike<void>);\n }\n PreCondition.assertNotUndefinedAndNotNull(onErrorFunction, \"onErrorFunction\");\n\n let result: PromiseAsyncResult<T>;\n if (errorType)\n {\n result = this.catch(errorType, async (reason: unknown) =>\n {\n await onErrorFunction(reason);\n throw reason;\n });\n }\n else\n {\n result = this.catch(async (reason: unknown) =>\n {\n await onErrorFunction(reason);\n throw reason;\n });\n }\n\n return result;\n }\n\n public convertError(convertErrorFunction: (reason: unknown) => (unknown | PromiseLike<unknown>)): PromiseAsyncResult<T>;\n public convertError<TError>(errorType: Type<TError>, convertErrorFunction: (reason: TError) => (unknown | PromiseLike<unknown>)): PromiseAsyncResult<T>;\n convertError(errorTypeOrConvertErrorFunction: Type<unknown> | ((reason: unknown) => (unknown | PromiseLike<unknown>)), convertErrorFunction?: (reason: unknown) => (unknown | PromiseLike<unknown>)): PromiseAsyncResult<T>\n {\n let errorType: Type<unknown> | undefined;\n if (!isUndefinedOrNull(convertErrorFunction))\n {\n errorType = errorTypeOrConvertErrorFunction as Type<unknown>;\n\n PreCondition.assertNotUndefinedAndNotNull(errorType, \"errorType\");\n }\n else\n {\n convertErrorFunction = errorTypeOrConvertErrorFunction as ((reason: unknown) => void | PromiseLike<void>);\n }\n PreCondition.assertNotUndefinedAndNotNull(convertErrorFunction, \"convertErrorFunction\");\n\n let result: PromiseAsyncResult<T>;\n if (errorType)\n {\n result = this.catch(errorType, async (reason: unknown) =>\n {\n throw await convertErrorFunction(reason);\n });\n }\n else\n {\n result = this.catch(async (reason: unknown) =>\n {\n throw await convertErrorFunction(reason);\n });\n }\n\n return result;\n }\n\n public finally(onfinally?: (() => (void | Promise<void>)) | null): PromiseAsyncResult<T>\n {\n return PromiseAsyncResult.create(this.promise.finally(onfinally));\n }\n \n readonly [Symbol.toStringTag]: string = \"AsyncResult\";\n}","import { PreCondition } from \"./preCondition\";\nimport { PromiseAsyncResult } from \"./promiseAsyncResult\";\nimport { instanceOfType, isPromise, isPromiseLike, isUndefinedOrNull, Type } from \"./types\";\nimport { AsyncResult } from \"./asyncResult\";\n\nexport class SyncResult<T> implements AsyncResult<T>\n{\n private value: T | undefined;\n private error: unknown | undefined;\n\n private constructor(value: T | undefined, error: unknown | undefined)\n {\n PreCondition.assertTrue(value === undefined || error === undefined, \"value === undefined || error === undefined\", \"Either value or error must be undefined.\");\n\n this.value = value;\n this.error = error;\n }\n\n public static create<T>(action: () => T): SyncResult<T>\n {\n PreCondition.assertNotUndefinedAndNotNull(action, \"action\");\n\n let value: T | undefined;\n let error: unknown | undefined;\n try\n {\n value = action();\n }\n catch (e)\n {\n error = e;\n }\n return new SyncResult(value, error);\n }\n\n public static value<T>(value: T): SyncResult<T>\n {\n return new SyncResult(value, undefined);\n }\n\n public static error<T>(error: unknown): SyncResult<T>\n {\n return new SyncResult<T>(undefined, error);\n }\n\n public await(): T\n {\n if (this.error)\n {\n throw this.error;\n }\n return this.value!;\n }\n\n public then<TResult1 = T, TResult2 = never>(onfullfilled?: ((value: T) => TResult1) | null, onrejected?: ((reason: unknown) => TResult2) | null): SyncResult<TResult1 | TResult2>;\n public then<TResult1 = T, TResult2 = never>(onfullfilled?: ((value: T) => (TResult1 | PromiseLike<TResult1>)) | null, onrejected?: ((reason: unknown) => (TResult2 | PromiseLike<TResult2>)) | null): SyncResult<TResult1 | TResult2>;\n then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => (TResult1 | PromiseLike<TResult1>)) | null, onrejected?: ((reason: unknown) => (TResult2 | PromiseLike<TResult2>)) | null): SyncResult<TResult1 | TResult2> | PromiseAsyncResult<TResult1 | TResult2>\n {\n let result: SyncResult<TResult1 | TResult2> | PromiseAsyncResult<TResult1 | TResult2>;\n if (this.error)\n {\n if (onrejected)\n {\n try\n {\n const onRejectedResult: TResult2 | PromiseLike<TResult2> = onrejected(this.error);\n if (onRejectedResult instanceof SyncResult || onRejectedResult instanceof PromiseAsyncResult)\n {\n result = onRejectedResult;\n }\n else if (isPromise<TResult2>(onRejectedResult))\n {\n result = PromiseAsyncResult.create(onRejectedResult);\n }\n else\n {\n result = SyncResult.value(onRejectedResult as TResult2);\n }\n }\n catch (error)\n {\n result = SyncResult.error(error);\n }\n }\n else\n {\n result = SyncResult.error<TResult2>(this.error);\n }\n }\n else\n {\n if (onfulfilled)\n {\n try\n {\n const onFullfilledResult: TResult1 | PromiseLike<TResult1> = onfulfilled(this.value!);\n if (onFullfilledResult instanceof SyncResult || onFullfilledResult instanceof PromiseAsyncResult)\n {\n result = onFullfilledResult;\n }\n else if (isPromise<TResult1>(onFullfilledResult))\n {\n result = PromiseAsyncResult.create(onFullfilledResult);\n }\n else\n {\n result = SyncResult.value(onFullfilledResult as TResult1);\n }\n }\n catch (error)\n {\n result = SyncResult.error(error);\n }\n }\n else\n {\n result = SyncResult.value<TResult1>(this.value as TResult1);\n }\n }\n return result;\n }\n\n public onValue(onValueFunction: (value: T) => void): SyncResult<T>;\n public onValue(onValueFunction: (value: T) => Promise<void>): PromiseAsyncResult<T>;\n onValue(onValueFunction: (value: T) => (void | Promise<void>)): SyncResult<T> | PromiseAsyncResult<T>\n {\n return this.then<T>((value: T) =>\n {\n let result: SyncResult<T> | PromiseAsyncResult<T>;\n try\n {\n const onValueFunctionResult: (void | Promise<void>) = onValueFunction(value);\n if (isPromise(onValueFunctionResult))\n {\n result = PromiseAsyncResult.create(onValueFunctionResult.then(() => value));\n }\n else\n {\n result = this;\n }\n }\n catch (error)\n {\n result = SyncResult.error(error);\n }\n return result;\n })\n }\n\n public catch<TResult = never>(onrejected: (reason: unknown) => TResult): SyncResult<T | TResult>;\n public catch<TResult = never>(onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null): SyncResult<T | TResult> | PromiseAsyncResult<T | TResult>\n public catch<TError, TResult = never>(errorType: Type<TError>, onrejected: (reason: TError) => TResult): SyncResult<T | TResult>;\n public catch<TError, TResult = never>(errorType: Type<TError>, onrejected: (reason: TError) => PromiseLike<TResult>): PromiseAsyncResult<T | TResult>;\n catch<TResult = never>(errorTypeOrOnRejected?: Type<unknown> | ((reason: unknown) => TResult | PromiseLike<TResult>) | null, onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null): SyncResult<T | TResult> | PromiseAsyncResult<T | TResult>\n {\n let errorType: Type<TypeError> | undefined;\n if (!isUndefinedOrNull(onrejected))\n {\n errorType = errorTypeOrOnRejected as Type<unknown>;\n\n PreCondition.assertNotUndefinedAndNotNull(errorType, \"errorType\");\n }\n else\n {\n onrejected = errorTypeOrOnRejected as ((reason: any) => TResult | PromiseLike<TResult>) | null;\n }\n PreCondition.assertNotUndefinedAndNotNull(onrejected, \"onrejected\");\n\n let result: SyncResult<T | TResult> | PromiseAsyncResult<T | TResult> = this;\n if (this.error && (!errorType || instanceOfType(this.error, errorType)))\n {\n try\n {\n const onRejectedResult: TResult | PromiseLike<TResult> = onrejected(this.error);\n if (onRejectedResult instanceof SyncResult || onRejectedResult instanceof PromiseAsyncResult)\n {\n result = onRejectedResult;\n }\n else if (isPromise<TResult>(onRejectedResult))\n {\n result = PromiseAsyncResult.create(onRejectedResult);\n }\n else\n {\n result = SyncResult.value(onRejectedResult as TResult);\n }\n }\n catch (error)\n {\n result = SyncResult.error(error);\n }\n }\n return result;\n }\n\n public onError(onErrorFunction: (reason: unknown) => void): SyncResult<T>;\n public onError(onErrorFunction: (reason: unknown) => PromiseLike<void>): PromiseAsyncResult<T>;\n public onError<TError>(errorType: Type<TError>, onErrorFunction: (reason: TError) => void): SyncResult<T>;\n public onError<TError>(errorType: Type<TError>, onErrorFunction: (reason: TError) => PromiseLike<void>): PromiseAsyncResult<T>;\n onError(errorTypeOrOnErrorFunction: Type<unknown> | ((reason: unknown) => (void | PromiseLike<void>)), onErrorFunction?: (reason: unknown) => (void | PromiseLike<void>)): SyncResult<T> | PromiseAsyncResult<T>\n {\n let errorType: Type<TypeError> | undefined;\n if (!isUndefinedOrNull(onErrorFunction))\n {\n errorType = errorTypeOrOnErrorFunction as Type<unknown>;\n\n PreCondition.assertNotUndefinedAndNotNull(errorType, \"errorType\");\n }\n else\n {\n onErrorFunction = errorTypeOrOnErrorFunction as ((reason: any) => void | PromiseLike<void>);\n }\n PreCondition.assertNotUndefinedAndNotNull(onErrorFunction, \"onErrorFunction\");\n\n let result: SyncResult<T> | PromiseAsyncResult<T> = this;\n if (this.error && (!errorType || instanceOfType(this.error, errorType)))\n {\n try\n {\n const onErrorResult: void | PromiseLike<void> = onErrorFunction(this.error);\n if (isPromise(onErrorResult))\n {\n result = PromiseAsyncResult.create(onErrorResult).then(() => this);\n }\n }\n catch (error)\n {\n result = SyncResult.error(error);\n }\n }\n return result;\n }\n\n public convertError(convertErrorFunction: (reason: unknown) => unknown): SyncResult<T>;\n public convertError(onErrorFunction: (reason: unknown) => PromiseLike<unknown>): PromiseAsyncResult<T>;\n public convertError<TError>(errorType: Type<TError>, convertErrorFunction: (reason: TError) => unknown): SyncResult<T>;\n public convertError<TError>(errorType: Type<TError>, convertErrorFunction: (reason: TError) => PromiseLike<unknown>): PromiseAsyncResult<T>;\n convertError(errorTypeOrConvertErrorFunction: Type<unknown> | ((reason: unknown) => (unknown | PromiseLike<unknown>)), convertErrorFunction?: (reason: unknown) => (unknown | PromiseLike<unknown>)): SyncResult<T> | PromiseAsyncResult<T>\n {\n let errorType: Type<TypeError> | undefined;\n if (!isUndefinedOrNull(convertErrorFunction))\n {\n errorType = errorTypeOrConvertErrorFunction as Type<unknown>;\n\n PreCondition.assertNotUndefinedAndNotNull(errorType, \"errorType\");\n }\n else\n {\n convertErrorFunction = errorTypeOrConvertErrorFunction as ((reason: any) => void | PromiseLike<void>);\n }\n PreCondition.assertNotUndefinedAndNotNull(convertErrorFunction, \"convertErrorFunction\");\n\n let result: SyncResult<T> | PromiseAsyncResult<T> = this;\n if (this.error && (!errorType || instanceOfType(this.error, errorType)))\n {\n try\n {\n const convertErrorResult: unknown | PromiseLike<unknown> = convertErrorFunction(this.error);\n if (isPromise(convertErrorResult))\n {\n result = PromiseAsyncResult.error(convertErrorResult);\n }\n else\n {\n result = SyncResult.error(convertErrorResult);\n }\n }\n catch (error)\n {\n result = SyncResult.error(error);\n }\n }\n return result;\n }\n\n public finally(onfinally?: (() => void) | null): SyncResult<T>\n public finally(onfinally?: (() => Promise<void>) | null): PromiseAsyncResult<T>\n finally(onfinally?: (() => (void | Promise<void>)) | null | undefined): PromiseAsyncResult<T> | SyncResult<T>\n {\n let result: PromiseAsyncResult<T> | SyncResult<T> = this;\n if (onfinally)\n {\n try\n {\n const onfinallyResult: void | Promise<void> = onfinally();\n if (isPromiseLike(onfinallyResult))\n {\n result = PromiseAsyncResult.create(onfinallyResult).then(() => this);\n }\n }\n catch (error)\n {\n result = SyncResult.error(error);\n }\n }\n return result;\n }\n\n readonly [Symbol.toStringTag]: string = \"SyncResult2\";\n}","import { JavascriptIterable, JavascriptIterator } from \"./javascript\";\nimport { PreCondition } from \"./preCondition\";\nimport { Iterator } from \"./iterator\";\nimport { SyncResult } from \"./syncResult\";\nimport { Type } from \"./types\";\n\nexport class FlatMapIterator<TInput,TOutput> implements Iterator<TOutput>\n{\n private readonly innerIterator: Iterator<TInput>;\n private readonly mapping: (value: TInput) => JavascriptIterable<TOutput>;\n private mappingIterator: Iterator<TOutput> | undefined;\n private started: boolean;\n\n private constructor(innerIterator: Iterator<TInput>, mapping: (value: TInput) => JavascriptIterable<TOutput>)\n {\n PreCondition.assertNotUndefinedAndNotNull(innerIterator, \"innerIterator\");\n PreCondition.assertNotUndefinedAndNotNull(mapping, \"mapping\");\n\n this.innerIterator = innerIterator;\n this.mapping = mapping;\n this.started = false;\n }\n\n public static create<TInput,TOutput>(innerIterator: Iterator<TInput>, mapping: (value: TInput) => JavascriptIterable<TOutput>): FlatMapIterator<TInput,TOutput>\n {\n return new FlatMapIterator(innerIterator, mapping);\n }\n\n public next(): SyncResult<boolean>\n {\n return SyncResult.create(() =>\n {\n this.innerIterator.start().await();\n\n while (this.innerIterator.hasCurrent())\n {\n if (this.mappingIterator === undefined)\n {\n this.mappingIterator = Iterator.create(this.mapping(this.innerIterator.getCurrent()));\n }\n\n if (this.mappingIterator.next().await())\n {\n break;\n }\n else if (this.innerIterator.next().await())\n {\n this.mappingIterator = undefined;\n }\n }\n\n return this.hasCurrent();\n });\n }\n\n public hasStarted(): boolean\n {\n return this.started;\n }\n\n public hasCurrent(): boolean\n {\n return this.mappingIterator?.hasCurrent() ?? false;\n }\n\n public getCurrent(): TOutput\n {\n PreCondition.assertTrue(this.hasCurrent(), \"this.hasCurrent()\");\n\n return this.mappingIterator!.getCurrent();\n }\n\n public start(): SyncResult<this>\n {\n return Iterator.start<TOutput,this>(this);\n }\n\n public takeCurrent(): SyncResult<TOutput>\n {\n return Iterator.takeCurrent(this);\n }\n\n public any(): SyncResult<boolean>\n {\n return Iterator.any(this);\n }\n\n public getCount(): SyncResult<number>\n {\n return Iterator.getCount(this);\n }\n\n public toArray(): SyncResult<TOutput[]>\n {\n return Iterator.toArray(this);\n }\n\n public concatenate(...toConcatenate: JavascriptIterable<TOutput>[]): Iterator<TOutput>\n {\n return Iterator.concatenate(this, ...toConcatenate);\n }\n\n public where(condition: (value: TOutput) => (boolean | SyncResult<boolean>)): Iterator<TOutput>\n {\n return Iterator.where(this, condition);\n }\n\n public map<TOutput2>(mapping: (value: TOutput) => (TOutput2 | SyncResult<TOutput2>)): Iterator<TOutput2>\n {\n return Iterator.map(this, mapping);\n }\n\n public flatMap<TOutput2>(mapping: (value: TOutput) => JavascriptIterable<TOutput2>): Iterator<TOutput2>\n {\n return Iterator.flatMap(this, mapping);\n }\n\n public whereInstanceOf<U extends TOutput>(typeCheck: (value: TOutput) => value is U): Iterator<U>\n {\n return Iterator.whereInstanceOf(this, typeCheck);\n }\n\n public whereInstanceOfType<U extends TOutput>(type: Type<U>): Iterator<U>\n {\n return Iterator.whereInstanceOfType(this, type);\n }\n\n public first(condition?: ((value: TOutput) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<TOutput>\n {\n return Iterator.first(this, condition);\n }\n\n public last(condition?: ((value: TOutput) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<TOutput>\n {\n return Iterator.last(this, condition);\n }\n\n public take(maximumToTake: number): Iterator<TOutput>\n {\n return Iterator.take(this, maximumToTake);\n }\n\n public skip(maximumToSkip: number): Iterator<TOutput>\n {\n return Iterator.skip(this, maximumToSkip);\n }\n\n public [Symbol.iterator](): JavascriptIterator<TOutput>\n {\n return Iterator[Symbol.iterator](this);\n }\n}","import { Iterator } from \"./iterator\";\r\nimport { JavascriptIterator, JavascriptIteratorResult } from \"./javascript\";\r\nimport { PreCondition } from \"./preCondition\";\r\n\r\n/**\r\n * A JavaScript/TypeScript object that is used to iterate over a collection of values.\r\n */\r\nexport class IteratorToJavascriptIteratorAdapter<T> implements JavascriptIterator<T>\r\n{\r\n private readonly iterator: Iterator<T>;\r\n private hasStarted: boolean;\r\n\r\n private constructor(iterator: Iterator<T>)\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\r\n\r\n this.iterator = iterator;\r\n this.hasStarted = false;\r\n }\r\n\r\n public static create<T>(iterator: Iterator<T>): IteratorToJavascriptIteratorAdapter<T>\r\n {\r\n return new IteratorToJavascriptIteratorAdapter<T>(iterator);\r\n }\r\n \r\n public next(): JavascriptIteratorResult<T>\r\n {\r\n if (!this.hasStarted)\r\n {\r\n this.hasStarted = true;\r\n this.iterator.start();\r\n }\r\n else\r\n {\r\n this.iterator.next();\r\n }\r\n\r\n const result: JavascriptIteratorResult<T> = {\r\n done: !this.iterator.hasCurrent(),\r\n value: undefined!,\r\n };\r\n if (!result.done)\r\n {\r\n result.value = this.iterator.getCurrent();\r\n }\r\n return result;\r\n }\r\n}","import { Iterator } from \"./iterator\";\r\nimport { JavascriptIterable, JavascriptIterator, JavascriptIteratorResult } from \"./javascript\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { SyncResult } from \"./syncResult\";\r\nimport { isJavascriptIterable, Type } from \"./types\";\r\n\r\nexport class JavascriptIteratorToIteratorAdapter<T> implements Iterator<T>\r\n{\r\n private readonly javascriptIterator: JavascriptIterator<T>;\r\n private javascriptIteratorResult?: JavascriptIteratorResult<T>;\r\n\r\n private constructor(javascriptIterator: JavascriptIterator<T>)\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(javascriptIterator, \"javascriptIterator\");\r\n\r\n this.javascriptIterator = javascriptIterator;\r\n }\r\n\r\n public static create<T>(javascriptIterator: JavascriptIterator<T> | JavascriptIterable<T>): JavascriptIteratorToIteratorAdapter<T>\r\n {\r\n if (isJavascriptIterable<T>(javascriptIterator))\r\n {\r\n javascriptIterator = javascriptIterator[Symbol.iterator]();\r\n }\r\n return new JavascriptIteratorToIteratorAdapter(javascriptIterator);\r\n }\r\n\r\n public next(): SyncResult<boolean>\r\n {\r\n return SyncResult.create(() =>\r\n {\r\n this.javascriptIteratorResult = this.javascriptIterator.next();\r\n return this.hasCurrent();\r\n });\r\n }\r\n\r\n public hasStarted(): boolean\r\n {\r\n return this.javascriptIteratorResult !== undefined;\r\n }\r\n\r\n public hasCurrent(): boolean\r\n {\r\n return this.javascriptIteratorResult?.done === false;\r\n }\r\n\r\n public getCurrent(): T\r\n {\r\n PreCondition.assertTrue(this.hasCurrent(), \"this.hasCurrent()\");\r\n\r\n return this.javascriptIteratorResult!.value;\r\n }\r\n\r\n public start(): SyncResult<this>\r\n {\r\n return Iterator.start<T, this>(this);\r\n }\r\n\r\n public takeCurrent(): SyncResult<T>\r\n {\r\n return Iterator.takeCurrent(this);\r\n }\r\n\r\n public any(): SyncResult<boolean>\r\n {\r\n return Iterator.any(this);\r\n }\r\n\r\n public getCount(): SyncResult<number>\r\n {\r\n return Iterator.getCount(this);\r\n }\r\n\r\n public toArray(): SyncResult<T[]>\r\n {\r\n return Iterator.toArray(this);\r\n }\r\n\r\n public concatenate(...toConcatenate: JavascriptIterable<T>[]): Iterator<T>\r\n {\r\n return Iterator.concatenate(this, ...toConcatenate);\r\n }\r\n\r\n public map<TOutput>(mapping: (value: T) => (TOutput | SyncResult<TOutput>)): Iterator<TOutput>\r\n {\r\n return Iterator.map(this, mapping);\r\n }\r\n\r\n public flatMap<TOutput>(mapping: (value: T) => JavascriptIterable<TOutput>): Iterator<TOutput>\r\n {\r\n return Iterator.flatMap(this, mapping);\r\n }\r\n\r\n public [Symbol.iterator](): JavascriptIterator<T>\r\n {\r\n return Iterator[Symbol.iterator](this);\r\n }\r\n\r\n public first(condition?: (value: T) => boolean): SyncResult<T>\r\n {\r\n return Iterator.first(this, condition);\r\n }\r\n\r\n public last(): SyncResult<T>\r\n {\r\n return Iterator.last(this);\r\n }\r\n\r\n public where(condition: (value: T) => boolean): Iterator<T>\r\n {\r\n return Iterator.where(this, condition);\r\n }\r\n\r\n public whereInstanceOf<U extends T>(typeCheck: (value: T) => value is U): Iterator<U>\r\n {\r\n return Iterator.whereInstanceOf(this, typeCheck);\r\n }\r\n\r\n public whereInstanceOfType<U extends T>(type: Type<U>): Iterator<U>\r\n {\r\n return Iterator.whereInstanceOfType(this, type);\r\n }\r\n\r\n public take(maximumToTake: number): Iterator<T>\r\n {\r\n return Iterator.take(this, maximumToTake);\r\n }\r\n\r\n public skip(maximumToSkip: number): Iterator<T>\r\n {\r\n return Iterator.skip(this, maximumToSkip);\r\n }\r\n}","import { Iterator } from \"./iterator\";\r\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { SyncResult } from \"./syncResult\";\r\nimport { Type } from \"./types\";\r\n\r\n/**\r\n * An {@link Iterator} that maps {@link TInput} values to {@link TOutput} values.\r\n */\r\nexport class MapIterator<TInput, TOutput> implements Iterator<TOutput>\r\n{\r\n private readonly inputIterator: Iterator<TInput>;\r\n private readonly mapping: (value: TInput) => (TOutput | SyncResult<TOutput>);\r\n private started: boolean;\r\n\r\n protected constructor(inputIterator: Iterator<TInput>, mapping: (value: TInput) => (TOutput | SyncResult<TOutput>))\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(inputIterator, \"inputIterator\");\r\n PreCondition.assertNotUndefinedAndNotNull(mapping, \"mapping\");\r\n\r\n this.inputIterator = inputIterator;\r\n this.mapping = mapping;\r\n this.started = false;\r\n }\r\n\r\n public static create<TInput, TOutput>(inputIterator: Iterator<TInput>, mapping: (value: TInput) => (TOutput | SyncResult<TOutput>)): MapIterator<TInput, TOutput>\r\n {\r\n return new MapIterator(inputIterator, mapping);\r\n }\r\n\r\n public next(): SyncResult<boolean>\r\n {\r\n return SyncResult.create(() =>\r\n {\r\n if (!this.hasStarted())\r\n {\r\n this.started = true;\r\n this.inputIterator.start();\r\n }\r\n else\r\n {\r\n this.inputIterator.next();\r\n }\r\n return this.inputIterator.hasCurrent();\r\n });\r\n }\r\n\r\n public hasStarted(): boolean\r\n {\r\n return this.started;\r\n }\r\n\r\n public hasCurrent(): boolean\r\n {\r\n return this.hasStarted() && this.inputIterator.hasCurrent();\r\n }\r\n\r\n public getCurrent(): TOutput\r\n {\r\n PreCondition.assertTrue(this.hasCurrent(), \"this.hasCurrent()\");\r\n\r\n const mappingResult: TOutput | SyncResult<TOutput> = this.mapping(this.inputIterator.getCurrent());\r\n return mappingResult instanceof SyncResult ? mappingResult.await() : mappingResult;\r\n }\r\n\r\n public start(): SyncResult<this>\r\n {\r\n return Iterator.start<TOutput, this>(this);\r\n }\r\n\r\n public takeCurrent(): SyncResult<TOutput>\r\n {\r\n return Iterator.takeCurrent(this);\r\n }\r\n\r\n public any(): SyncResult<boolean>\r\n {\r\n return Iterator.any(this);\r\n }\r\n\r\n public getCount(): SyncResult<number>\r\n {\r\n return Iterator.getCount(this);\r\n }\r\n\r\n public toArray(): SyncResult<TOutput[]>\r\n {\r\n return Iterator.toArray(this);\r\n }\r\n\r\n public concatenate(toConcatenate: JavascriptIterable<TOutput>): Iterator<TOutput>\r\n {\r\n return Iterator.concatenate(this, toConcatenate);\r\n }\r\n\r\n public map<TOutput2>(mapping: (value: TOutput) => (TOutput2 | SyncResult<TOutput2>)): Iterator<TOutput2>\r\n {\r\n return Iterator.map(this, mapping);\r\n }\r\n\r\n public flatMap<TOutput2>(mapping: (value: TOutput) => JavascriptIterable<TOutput2>): Iterator<TOutput2>\r\n {\r\n return Iterator.flatMap(this, mapping);\r\n }\r\n\r\n public [Symbol.iterator](): JavascriptIterator<TOutput>\r\n {\r\n return Iterator[Symbol.iterator](this);\r\n }\r\n\r\n public first(condition?: (value: TOutput) => boolean): SyncResult<TOutput>\r\n {\r\n return Iterator.first(this, condition);\r\n }\r\n\r\n public last(): SyncResult<TOutput>\r\n {\r\n return Iterator.last(this);\r\n }\r\n\r\n public where(condition: (value: TOutput) => boolean): Iterator<TOutput>\r\n {\r\n return Iterator.where(this, condition);\r\n }\r\n\r\n public whereInstanceOf<U extends TOutput>(typeCheck: (value: TOutput) => value is U): Iterator<U>\r\n {\r\n return Iterator.whereInstanceOf(this, typeCheck);\r\n }\r\n\r\n public whereInstanceOfType<U extends TOutput>(type: Type<U>): Iterator<U>\r\n {\r\n return Iterator.whereInstanceOfType(this, type);\r\n }\r\n\r\n public take(maximumToTake: number): Iterator<TOutput>\r\n {\r\n return Iterator.take(this, maximumToTake);\r\n }\r\n\r\n public skip(maximumToSkip: number): Iterator<TOutput>\r\n {\r\n return Iterator.skip(this, maximumToSkip);\r\n }\r\n}","import { JavascriptIterable } from \"./javascript\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { isString } from \"./types\";\r\n\r\nexport function getLength(value: string | undefined | null): number\r\n{\r\n return value !== undefined && value !== null ? value.length : 0;\r\n}\r\n\r\nexport function toString(value: undefined | null | { toString(): string }): string\r\n{\r\n let result: string;\r\n if (value === undefined)\r\n {\r\n result = \"undefined\";\r\n }\r\n else if (value === null)\r\n {\r\n result = \"null\";\r\n }\r\n else\r\n {\r\n result = value.toString();\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Join the provided values with the provided separator in between each value.\r\n * @param separator The value to use to separate the individual values.\r\n * @param values The values to join.\r\n * @returns The joined {@link string}.\r\n */\r\nexport function join(separator: string, values: JavascriptIterable<string>): string;\r\nexport function join(parameters: { separator: string, values: JavascriptIterable<string> }): string;\r\nexport function join(separatorOrParameters: string | { separator: string, values: JavascriptIterable<string> }, values?: JavascriptIterable<string>): string\r\n{\r\n let separator: string;\r\n if (isString(separatorOrParameters) || separatorOrParameters === undefined || separatorOrParameters === null)\r\n {\r\n separator = separatorOrParameters;\r\n }\r\n else\r\n {\r\n separator = separatorOrParameters.separator;\r\n values = separatorOrParameters.values;\r\n }\r\n\r\n PreCondition.assertNotUndefinedAndNotNull(separator, \"separator\");\r\n PreCondition.assertNotUndefinedAndNotNull(values, \"values\");\r\n\r\n return Array.from(values).join(separator);\r\n}\r\n\r\nexport function escape(value: string | undefined | null, dontEscape?: string[]): string;\r\nexport function escape(parameters: { value: string | undefined | null, dontEscape?: string[] }): string;\r\nexport function escape(valueOrParameters: string | undefined | null | { value: string | undefined | null, dontEscape?: string[] }, dontEscape?: string[]): string\r\n{\r\n let value: string | undefined | null;\r\n if (isString(valueOrParameters) || valueOrParameters === undefined || valueOrParameters === null)\r\n {\r\n value = valueOrParameters;\r\n }\r\n else\r\n {\r\n value = valueOrParameters.value;\r\n dontEscape = valueOrParameters.dontEscape;\r\n }\r\n\r\n let result: string;\r\n if (value === undefined)\r\n {\r\n result = \"undefined\";\r\n }\r\n else if (value === null)\r\n {\r\n result = \"null\";\r\n }\r\n else\r\n {\r\n if (!dontEscape)\r\n {\r\n dontEscape = [];\r\n }\r\n\r\n result = \"\";\r\n for (const character of value)\r\n {\r\n if (dontEscape.includes(character))\r\n {\r\n result += character;\r\n }\r\n else\r\n {\r\n switch (character)\r\n {\r\n case \"\\n\":\r\n result += \"\\\\n\";\r\n break;\r\n\r\n case \"\\r\":\r\n result += \"\\\\r\";\r\n break;\r\n\r\n case \"\\t\":\r\n result += \"\\\\t\";\r\n break;\r\n\r\n case \"\\'\":\r\n result += \"\\\\\\'\";\r\n break;\r\n\r\n case \"\\\"\":\r\n result += \"\\\\\\\"\";\r\n break;\r\n\r\n default:\r\n result += character;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Get a version of the provided value that is quoted with the provided quote.\r\n * @param value The value to quote.\r\n * @param quote The quotes to surround the provided value with.\r\n */\r\nexport function quote(value: string | undefined | null, quote?: string): string;\r\n/**\r\n * Get a version of the provided value that is quoted with the provided quote.\r\n * @param parameters The parameters to use to invoke this function.\r\n */\r\nexport function quote(parameters: { value: string | undefined | null, quote?: string }): string;\r\nexport function quote(valueOrParameters: string | undefined | null | { value: string | undefined | null, quote?: string }, quote?: string): string\r\n{\r\n let value: string | undefined | null;\r\n if (isString(valueOrParameters) || valueOrParameters === undefined || valueOrParameters === null)\r\n {\r\n value = valueOrParameters;\r\n }\r\n else\r\n {\r\n value = valueOrParameters.value;\r\n quote = valueOrParameters.quote;\r\n }\r\n\r\n let result: string;\r\n if (value === undefined)\r\n {\r\n result = \"undefined\";\r\n }\r\n else if (value === null)\r\n {\r\n result = \"null\";\r\n }\r\n else\r\n {\r\n if (quote === undefined)\r\n {\r\n quote = \"\\\"\";\r\n }\r\n result = `${quote}${value}${quote}`;\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Get a version of the provided value where the characters are escaped and quoted.\r\n * @param value The value to escape and quote.\r\n * @param quoteString The quote to surround the value with.\r\n * @param dontEscape The characters to not escape.\r\n */\r\nexport function escapeAndQuote(value: string | undefined | null, quoteString?: string, dontEscape?: string[]): string;\r\nexport function escapeAndQuote(parameters: { value: string | undefined | null, quoteString?: string, dontEscape?: string[] }): string;\r\nexport function escapeAndQuote(valueOrParameters: string | undefined | null | { value: string | undefined | null, quoteString?: string, dontEscape?: string[] }, quoteString?: string, dontEscape?: string[]): string\r\n{\r\n let value: string | undefined | null;\r\n if (isString(valueOrParameters) || valueOrParameters === undefined || valueOrParameters === null)\r\n {\r\n value = valueOrParameters;\r\n }\r\n else\r\n {\r\n value = valueOrParameters.value;\r\n quoteString = valueOrParameters.quoteString;\r\n dontEscape = valueOrParameters.dontEscape;\r\n }\r\n\r\n let result: string;\r\n if (value === undefined)\r\n {\r\n result = \"undefined\";\r\n }\r\n else if (value === null)\r\n {\r\n result = \"null\";\r\n }\r\n else\r\n {\r\n result = escape(value, dontEscape);\r\n result = quote(result, quoteString);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Get whether the provided value only contains whitespace characters.\r\n * @param value The value to check.\r\n */\r\nexport function isWhitespace(value: string): boolean\r\n{\r\n PreCondition.assertNotUndefinedAndNotNull(value, \"value\");\r\n PreCondition.assertSame(1, value.length, \"value.length\");\r\n\r\n let result: boolean = true;\r\n switch (value[0])\r\n {\r\n case \" \":\r\n case \"\\r\":\r\n case \"\\n\":\r\n case \"\\t\":\r\n result = true;\r\n break;\r\n\r\n default:\r\n result = false;\r\n break;\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Get whether the provided value only contains letters.\r\n * @param value The value to check.\r\n */\r\nexport function isLetter(value: string): boolean\r\n{\r\n PreCondition.assertNotUndefinedAndNotNull(value, \"value\");\r\n PreCondition.assertSame(1, value.length, \"value.length\");\r\n \r\n const character: string = value[0];\r\n let result: boolean = false;\r\n if (\"A\" <= character)\r\n {\r\n result = (character <= \"Z\");\r\n if (!result && \"a\" <= character)\r\n {\r\n result = (character <= \"z\");\r\n }\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * Get whether the provided value only contains letters.\r\n * @param value The value to check.\r\n */\r\nexport function isLowercasedLetter(value: string): boolean\r\n{\r\n PreCondition.assertNotUndefinedAndNotNull(value, \"value\");\r\n PreCondition.assertSame(1, value.length, \"value.length\");\r\n\r\n const character: string = value[0];\r\n return (\"a\" <= character && character <= \"z\");\r\n}\r\n\r\n/**\r\n * Get whether the provided value only contains letters.\r\n * @param value The value to check.\r\n */\r\nexport function isUppercasedLetter(value: string): boolean\r\n{\r\n PreCondition.assertNotUndefinedAndNotNull(value, \"value\");\r\n PreCondition.assertSame(1, value.length, \"value.length\");\r\n\r\n const character: string = value[0];\r\n return (\"A\" <= character && character <= \"Z\");\r\n}\r\n\r\n/**\r\n * Get whether the provided value only contains digits.\r\n * @param value The value to check.\r\n */\r\nexport function isDigit(value: string): boolean\r\n{\r\n PreCondition.assertNotUndefinedAndNotNull(value, \"value\");\r\n PreCondition.assertSame(1, value.length, \"value.length\");\r\n\r\n const character: string = value[0];\r\n return (\"0\" <= character && character <= \"9\");\r\n}\r\n\r\n/**\r\n * Get whether the provided value only contains letters and digits.\r\n * @param value The value to check.\r\n */\r\nexport function isLetterOrDigit(value: string): boolean\r\n{\r\n PreCondition.assertNotUndefinedAndNotNull(value, \"value\");\r\n PreCondition.assertSame(1, value.length, \"value.length\");\r\n\r\n const character: string = value[0];\r\n let result: boolean = false;\r\n if (\"0\" <= character)\r\n {\r\n result = (character <= \"9\");\r\n if (!result && \"A\" <= character)\r\n {\r\n result = (character <= \"Z\");\r\n if (!result && \"a\" <= character)\r\n {\r\n result = (character <= \"z\");\r\n }\r\n }\r\n }\r\n return result;\r\n}","import { join } from \"./strings\";\r\n\r\n/**\r\n * An {@link Error} that is thrown when a value is not found.\r\n */\r\nexport class NotFoundError extends Error\r\n{\r\n public constructor(...message: string[])\r\n {\r\n super(join(\"\\n\", message));\r\n }\r\n}","import { Iterator } from \"./iterator\";\r\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { SyncResult } from \"./syncResult\";\r\nimport { Type } from \"./types\";\r\n\r\n/**\r\n * An {@link Iterator} that skips the first maximum number of values from an inner {@link Iterator}\r\n * before beginning to return values.\r\n */\r\nexport class SkipIterator<T> implements Iterator<T>\r\n{\r\n private readonly innerIterator: Iterator<T>;\r\n private started: boolean;\r\n private readonly maximumToSkip: number;\r\n\r\n private constructor(innerIterator: Iterator<T>, maximumToSkip: number)\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(innerIterator, \"innerIterator\");\r\n PreCondition.assertNotUndefinedAndNotNull(maximumToSkip, \"maximumToSkip\");\r\n PreCondition.assertInteger(maximumToSkip, \"maximumToSkip\");\r\n PreCondition.assertGreaterThanOrEqualTo(maximumToSkip, 0, \"maximumToSkip\");\r\n\r\n this.innerIterator = innerIterator;\r\n this.started = false;\r\n this.maximumToSkip = maximumToSkip;\r\n }\r\n\r\n public static create<T>(innerIterator: Iterator<T>, maximumToSkip: number)\r\n {\r\n return new SkipIterator(innerIterator, maximumToSkip);\r\n }\r\n\r\n public next(): SyncResult<boolean>\r\n {\r\n return SyncResult.create(() =>\r\n {\r\n if (!this.hasStarted())\r\n {\r\n this.started = true;\r\n this.innerIterator.start().await();\r\n\r\n for (let i = 0; i < this.maximumToSkip; i++)\r\n {\r\n if (!this.innerIterator.next().await())\r\n {\r\n break;\r\n }\r\n }\r\n }\r\n else\r\n {\r\n this.innerIterator.next().await();\r\n }\r\n return this.hasCurrent();\r\n });\r\n }\r\n\r\n public hasStarted(): boolean\r\n {\r\n return this.started;\r\n }\r\n\r\n public hasCurrent(): boolean\r\n {\r\n return this.hasStarted() && this.innerIterator.hasCurrent();\r\n }\r\n\r\n public getCurrent(): T\r\n {\r\n PreCondition.assertTrue(this.hasCurrent(), \"this.hasCurrent()\");\r\n\r\n return this.innerIterator.getCurrent();\r\n }\r\n\r\n public start(): SyncResult<this>\r\n {\r\n return Iterator.start<T, this>(this);\r\n }\r\n\r\n public takeCurrent(): SyncResult<T>\r\n {\r\n return Iterator.takeCurrent(this);\r\n }\r\n\r\n public any(): SyncResult<boolean>\r\n {\r\n return Iterator.any(this);\r\n }\r\n\r\n public getCount(): SyncResult<number>\r\n {\r\n return Iterator.getCount(this);\r\n }\r\n\r\n public toArray(): SyncResult<T[]>\r\n {\r\n return Iterator.toArray(this);\r\n }\r\n\r\n public concatenate(...toConcatenate: JavascriptIterable<T>[]): Iterator<T>\r\n {\r\n return Iterator.concatenate(this, ...toConcatenate);\r\n }\r\n\r\n public where(condition: (value: T) => boolean): Iterator<T>\r\n {\r\n return Iterator.where(this, condition);\r\n }\r\n\r\n public whereInstanceOf<U extends T>(typeCheck: (value: T) => value is U): Iterator<U>\r\n {\r\n return Iterator.whereInstanceOf(this, typeCheck);\r\n }\r\n\r\n public whereInstanceOfType<U extends T>(type: Type<U>): Iterator<U>\r\n {\r\n return Iterator.whereInstanceOfType(this, type);\r\n }\r\n\r\n public map<TOutput>(mapping: (value: T) => (TOutput | SyncResult<TOutput>)): Iterator<TOutput>\r\n {\r\n return Iterator.map(this, mapping);\r\n }\r\n\r\n public flatMap<TOutput>(mapping: (value: T) => JavascriptIterable<TOutput>): Iterator<TOutput>\r\n {\r\n return Iterator.flatMap(this, mapping);\r\n }\r\n\r\n public first(condition?: (value: T) => boolean): SyncResult<T>\r\n {\r\n return Iterator.first(this, condition);\r\n }\r\n\r\n public last(condition?: (value: T) => boolean): SyncResult<T>\r\n {\r\n return Iterator.last(this, condition);\r\n }\r\n\r\n public [Symbol.iterator](): JavascriptIterator<T>\r\n {\r\n return Iterator[Symbol.iterator](this);\r\n }\r\n\r\n public take(maximumToTake: number): Iterator<T>\r\n {\r\n return Iterator.take(this, maximumToTake);\r\n }\r\n\r\n public skip(maximumToSkip: number): Iterator<T>\r\n {\r\n return Iterator.skip(this, maximumToSkip);\r\n }\r\n}","import { Iterator } from \"./iterator\";\r\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { SyncResult } from \"./syncResult\";\r\nimport { Type } from \"./types\";\r\n\r\n/**\r\n * An {@link Iterator} that iterates over a maximum number of values.\r\n */\r\nexport class TakeIterator<T> implements Iterator<T>\r\n{\r\n private readonly innerIterator: Iterator<T>;\r\n private started: boolean;\r\n private readonly maximumToTake: number;\r\n private taken: number;\r\n\r\n private constructor(innerIterator: Iterator<T>, maximumToTake: number)\r\n {\r\n PreCondition.assertGreaterThanOrEqualTo(maximumToTake, 0, \"maximumToTake\");\r\n\r\n this.innerIterator = innerIterator;\r\n this.started = false;\r\n this.maximumToTake = maximumToTake;\r\n this.taken = 0;\r\n }\r\n\r\n public static create<T>(innerIterator: Iterator<T>, maximumToTake: number)\r\n {\r\n return new TakeIterator(innerIterator, maximumToTake);\r\n }\r\n\r\n public hasCurrent(): boolean\r\n {\r\n return this.hasStarted() && this.taken <= this.maximumToTake && this.innerIterator.hasCurrent();\r\n }\r\n\r\n public next(): SyncResult<boolean>\r\n {\r\n return SyncResult.create(() =>\r\n {\r\n if (this.maximumToTake <= 0)\r\n {\r\n return false;\r\n }\r\n else if (!this.hasStarted())\r\n {\r\n this.started = true;\r\n this.innerIterator.start().await();\r\n this.taken++;\r\n }\r\n else if (this.taken <= this.maximumToTake)\r\n {\r\n this.innerIterator.next().await();\r\n this.taken++;\r\n }\r\n return this.hasCurrent();\r\n });\r\n }\r\n\r\n public hasStarted(): boolean\r\n {\r\n return this.started;\r\n }\r\n\r\n public getCurrent(): T\r\n {\r\n PreCondition.assertTrue(this.hasCurrent(), \"this.hasCurrent()\");\r\n\r\n return this.innerIterator.getCurrent();\r\n }\r\n\r\n public start(): SyncResult<this>\r\n {\r\n return Iterator.start<T, this>(this);\r\n }\r\n\r\n public takeCurrent(): SyncResult<T>\r\n {\r\n return Iterator.takeCurrent(this);\r\n }\r\n\r\n public any(): SyncResult<boolean>\r\n {\r\n return Iterator.any(this);\r\n }\r\n\r\n public getCount(): SyncResult<number>\r\n {\r\n return Iterator.getCount(this);\r\n }\r\n\r\n public toArray(): SyncResult<T[]>\r\n {\r\n return Iterator.toArray(this);\r\n }\r\n\r\n public concatenate(...toConcatenate: JavascriptIterable<T>[]): Iterator<T>\r\n {\r\n return Iterator.concatenate(this, ...toConcatenate);\r\n }\r\n\r\n public where(condition: (value: T) => boolean): Iterator<T>\r\n {\r\n return Iterator.where(this, condition);\r\n }\r\n\r\n public whereInstanceOf<U extends T>(typeCheck: (value: T) => value is U): Iterator<U>\r\n {\r\n return Iterator.whereInstanceOf(this, typeCheck);\r\n }\r\n\r\n public whereInstanceOfType<U extends T>(type: Type<U>): Iterator<U>\r\n {\r\n return Iterator.whereInstanceOfType(this, type);\r\n }\r\n\r\n public map<TOutput>(mapping: (value: T) => (TOutput | SyncResult<TOutput>)): Iterator<TOutput>\r\n {\r\n return Iterator.map(this, mapping);\r\n }\r\n\r\n public flatMap<TOutput>(mapping: (value: T) => JavascriptIterable<TOutput>): Iterator<TOutput>\r\n {\r\n return Iterator.flatMap(this, mapping);\r\n }\r\n\r\n public first(condition?: (value: T) => boolean): SyncResult<T>\r\n {\r\n return Iterator.first(this, condition);\r\n }\r\n\r\n public last(condition?: (value: T) => boolean): SyncResult<T>\r\n {\r\n return Iterator.last(this, condition);\r\n }\r\n\r\n public [Symbol.iterator](): JavascriptIterator<T>\r\n {\r\n return Iterator[Symbol.iterator](this);\r\n }\r\n\r\n public take(maximumToTake: number): Iterator<T>\r\n {\r\n return Iterator.take(this, maximumToTake);\r\n }\r\n\r\n public skip(maximumToSkip: number): Iterator<T>\r\n {\r\n return Iterator.skip(this, maximumToSkip);\r\n }\r\n}","import { Iterator } from \"./iterator\";\r\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { SyncResult } from \"./syncResult\";\r\nimport { isBoolean, Type } from \"./types\";\r\n\r\n/**\r\n * An {@link Iterator} that only returns values that match a condition.\r\n */\r\nexport class WhereIterator<T> implements Iterator<T>\r\n{\r\n // WhereIterator cannot extend Iterator because their create() functions are different.\r\n private readonly innerIterator: Iterator<T>;\r\n private started: boolean;\r\n private readonly condition: (value: T) => (boolean | SyncResult<boolean>);\r\n\r\n private constructor(innerIterator: Iterator<T>, condition: (value: T) => (boolean | SyncResult<boolean>))\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(innerIterator, \"innerIterator\");\r\n PreCondition.assertNotUndefinedAndNotNull(condition, \"condition\");\r\n\r\n this.innerIterator = innerIterator;\r\n this.started = false;\r\n this.condition = condition;\r\n }\r\n\r\n public static create<T>(innerIterator: Iterator<T>, condition: (value: T) => (boolean | SyncResult<boolean>)): WhereIterator<T>\r\n {\r\n return new WhereIterator(innerIterator, condition);\r\n }\r\n\r\n public hasStarted(): boolean\r\n {\r\n return this.started;\r\n }\r\n\r\n public hasCurrent(): boolean\r\n {\r\n return this.hasStarted() && this.innerIterator.hasCurrent();\r\n }\r\n\r\n public getCurrent(): T\r\n {\r\n PreCondition.assertTrue(this.hasCurrent(), \"this.hasCurrent()\");\r\n\r\n return this.innerIterator.getCurrent();\r\n }\r\n\r\n public next(): SyncResult<boolean>\r\n {\r\n return SyncResult.create(() =>\r\n {\r\n if (!this.hasStarted())\r\n {\r\n this.innerIterator.start().await();\r\n this.started = true;\r\n }\r\n else\r\n {\r\n this.innerIterator.next().await();\r\n }\r\n\r\n while (this.hasCurrent())\r\n {\r\n const conditionResult: boolean | SyncResult<boolean> = this.condition(this.getCurrent());\r\n const conditionBoolean: boolean = isBoolean(conditionResult) ? conditionResult : conditionResult.await();\r\n if (conditionBoolean)\r\n {\r\n break;\r\n }\r\n \r\n this.innerIterator.next().await();\r\n }\r\n return this.hasCurrent();\r\n });\r\n }\r\n\r\n public start(): SyncResult<this>\r\n {\r\n return Iterator.start<T, this>(this);\r\n }\r\n\r\n public takeCurrent(): SyncResult<T>\r\n {\r\n return Iterator.takeCurrent(this);\r\n }\r\n\r\n public any(): SyncResult<boolean>\r\n {\r\n return Iterator.any(this);\r\n }\r\n\r\n public getCount(): SyncResult<number>\r\n {\r\n return Iterator.getCount(this);\r\n }\r\n\r\n public toArray(): SyncResult<T[]>\r\n {\r\n return Iterator.toArray(this);\r\n }\r\n \r\n public concatenate(...toConcatenate: JavascriptIterable<T>[]): Iterator<T>\r\n {\r\n return Iterator.concatenate(this, ...toConcatenate);\r\n }\r\n\r\n public where(condition: (value: T) => boolean): Iterator<T>\r\n {\r\n return Iterator.where(this, condition);\r\n }\r\n\r\n public map<TOutput>(mapping: (value: T) => (TOutput | SyncResult<TOutput>)): Iterator<TOutput>\r\n {\r\n return Iterator.map(this, mapping);\r\n }\r\n\r\n public flatMap<TOutput>(mapping: (value: T) => JavascriptIterable<TOutput>): Iterator<TOutput>\r\n {\r\n return Iterator.flatMap(this, mapping);\r\n }\r\n\r\n public whereInstanceOf<U extends T>(typeCheck: (value: T) => value is U): Iterator<U>\r\n {\r\n return Iterator.whereInstanceOf(this, typeCheck);\r\n }\r\n\r\n public whereInstanceOfType<U extends T>(type: Type<U>): Iterator<U>\r\n {\r\n return Iterator.whereInstanceOfType(this, type);\r\n }\r\n\r\n public first(condition?: (value: T) => boolean): SyncResult<T>\r\n {\r\n return Iterator.first(this, condition);\r\n }\r\n\r\n public last(condition?: (value: T) => boolean): SyncResult<T>\r\n {\r\n return Iterator.last(this, condition);\r\n }\r\n\r\n public take(maximumToTake: number): Iterator<T>\r\n {\r\n return Iterator.take(this, maximumToTake);\r\n }\r\n\r\n public skip(maximumToSkip: number): Iterator<T>\r\n {\r\n return Iterator.skip(this, maximumToSkip);\r\n }\r\n\r\n public [Symbol.iterator](): JavascriptIterator<T>\r\n {\r\n return Iterator[Symbol.iterator](this);\r\n }\r\n}","import { Comparable } from \"./comparable\";\nimport { ConcatenateIterator } from \"./concatenateIterator\";\nimport { EmptyError } from \"./emptyError\";\nimport { FlatMapIterator } from \"./flatMapIterator\";\nimport { IteratorToJavascriptIteratorAdapter } from \"./iteratorToJavascriptIteratorAdapter\";\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\nimport { JavascriptIteratorToIteratorAdapter } from \"./javascriptIteratorToIteratorAdapter\";\nimport { MapIterator } from \"./mapIterator\";\nimport { NotFoundError } from \"./notFoundError\";\nimport { PreCondition } from \"./preCondition\";\nimport { SkipIterator } from \"./skipIterator\";\nimport { SyncResult } from \"./syncResult\";\nimport { TakeIterator } from \"./takeIterator\";\nimport { instanceOfType, isJavascriptIterator, isUndefinedOrNull, Type } from \"./types\";\nimport { WhereIterator } from \"./whereIterator\";\n\n/**\n * A type that can be used to iterate over a collection.\n */\nexport abstract class Iterator<T> implements JavascriptIterable<T>\n{\n /**\n * Create a new {@link Iterator} that contains the provided values.\n * @param values The values that the new {@link Iterator} will iterate over.\n */\n public static create<T>(values: JavascriptIterator<T> | JavascriptIterable<T>): Iterator<T>\n {\n PreCondition.assertNotUndefinedAndNotNull(values, \"values\");\n\n return JavascriptIteratorToIteratorAdapter.create(values);\n }\n\n /**\n * Move to the next value in the collection. Return whether this {@link Iterator} points to a\n * value after the move.\n */\n public abstract next(): SyncResult<boolean>;\n\n /**\n * Get whether this {@link Iterator} has started iterating over the values in the collection.\n */\n public abstract hasStarted(): boolean;\n\n /**\n * Get whether this {@link Iterator} currently points at a value in the collection.\n */\n public abstract hasCurrent(): boolean;\n\n /**\n * Get the value that this {@link Iterator} points to.\n */\n public abstract getCurrent(): T;\n\n /**\n * Move to the first value if this {@link Iterator} hasn't started yet.\n * @returns This object for method chaining.\n */\n public start(): SyncResult<this>\n {\n return Iterator.start(this);\n }\n\n /**\n * Move the provided {@link Iterator} to its first value if it hasn't started yet.\n */\n public static start<T, TIterator extends Iterator<T>>(iterator: TIterator): SyncResult<TIterator>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n\n return SyncResult.create(() =>\n {\n if (!iterator.hasStarted())\n {\n iterator.next().await();\n }\n return iterator;\n });\n }\n\n /**\n * Get the current value from this {@link Iterator} and advance this {@link Iterator} to the\n * next value.\n */\n public takeCurrent(): SyncResult<T>\n {\n return Iterator.takeCurrent(this);\n }\n\n public static takeCurrent<T>(iterator: Iterator<T>): SyncResult<T>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n PreCondition.assertTrue(iterator.hasCurrent(), \"iterator.hasCurrent()\");\n\n return SyncResult.create(() =>\n {\n const result: T = iterator.getCurrent();\n iterator.next().await();\n return result;\n });\n }\n\n public [Symbol.iterator](): JavascriptIterator<T>\n {\n return Iterator[Symbol.iterator](this);\n }\n\n /**\n * Convert the provided {@link Iterator} to a {@link IteratorToJavascriptIteratorAdapter}.\n * @param iterator The {@link Iterator} to convert.\n */\n public static [Symbol.iterator]<T>(iterator: Iterator<T>): JavascriptIterator<T>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n\n return IteratorToJavascriptIteratorAdapter.create(iterator);\n }\n\n /**\n * Get whether this {@link Iterator} contains any values.\n * Note: This may advance the {@link Iterator} to the first value if it hasn't been\n * started yet.\n */\n public any(): SyncResult<boolean>\n {\n return Iterator.any(this);\n }\n\n /**\n * Get whether this {@link Iterator} contains any values.\n * Note: This may advance the {@link Iterator} to the first value if it hasn't been\n * started yet.\n */\n public static any<T>(iterator: Iterator<T>): SyncResult<boolean>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n\n return SyncResult.create(() =>\n {\n iterator.start().await();\n return iterator.hasCurrent();\n });\n\n }\n\n /**\n * Get the number of values in this {@link Iterator}.\n * Note: This will consume all of the values in this {@link Iterator}.\n */\n public getCount(): SyncResult<number>\n {\n return Iterator.getCount(this);\n }\n\n /**\n * Get the number of values in the provided {@link Iterator}.\n * Note: This will consume all of the values in the provided {@link Iterator}.\n */\n public static getCount<T>(iterator: Iterator<T>): SyncResult<number>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n\n return SyncResult.create(() =>\n {\n let result: number = 0;\n if (iterator.hasCurrent())\n {\n result++;\n }\n while (iterator.next().await())\n {\n result++;\n }\n return result;\n });\n }\n\n /**\n * Get all of the remaining values in this {@link Iterator} in a {@link T} {@link Array}.\n */\n public toArray(): SyncResult<T[]>\n {\n return Iterator.toArray(this);\n }\n\n /**\n * Get all of the remaining values in the provided {@link Iterator} in a {@link T}\n * {@link Array}.\n */\n public static toArray<T>(iterator: Iterator<T>): SyncResult<T[]>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n\n return SyncResult.create(() =>\n {\n const result: T[] = [];\n\n if (iterator.hasCurrent())\n {\n result.push(iterator.getCurrent());\n }\n while (iterator.next().await())\n {\n result.push(iterator.getCurrent());\n }\n\n return result;\n });\n }\n\n public concatenate(...toConcatenate: JavascriptIterable<T>[]): Iterator<T>\n {\n return Iterator.concatenate(this, ...toConcatenate);\n }\n\n public static concatenate<T>(iterator: Iterator<T>, ...toConcatenate: JavascriptIterable<T>[]): Iterator<T>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n PreCondition.assertNotUndefinedAndNotNull(toConcatenate, \"toConcatenate\");\n\n return ConcatenateIterator.create(iterator, ...toConcatenate);\n }\n\n /**\n * Get an {@link Iterator} that will only return values that match the provided condition.\n * @param condition The condition to run against each of the values in this {@link Iterator}.\n */\n public where(condition: (value: T) => (boolean | SyncResult<boolean>)): Iterator<T>\n {\n return Iterator.where(this, condition);\n }\n\n public static where<T>(iterator: Iterator<T>, condition: (value: T) => (boolean | SyncResult<boolean>)): Iterator<T>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n PreCondition.assertNotUndefinedAndNotNull(condition, \"condition\");\n\n return WhereIterator.create(iterator, condition);\n }\n\n /**\n * Get a {@link MapIterator} that will map all {@link T} values from this {@link Iterator} to\n * {@link TOutput} values.\n * @param mapping The mapping that maps {@link T} values to {@link TOutput} values.\n */\n public map<TOutput>(mapping: (value: T) => (TOutput | SyncResult<TOutput>)): Iterator<TOutput>\n {\n return Iterator.map(this, mapping);\n }\n\n public static map<T, TOutput>(iterator: Iterator<T>, mapping: (value: T) => (TOutput | SyncResult<TOutput>)): Iterator<TOutput>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n PreCondition.assertNotUndefinedAndNotNull(mapping, \"mapping\");\n\n return MapIterator.create(iterator, mapping);\n }\n\n public flatMap<TOutput>(mapping: (value: T) => JavascriptIterable<TOutput>): Iterator<TOutput>\n {\n return Iterator.flatMap(this, mapping);\n }\n\n public static flatMap<T,TOutput>(iterator: Iterator<T>, mapping: (value: T) => JavascriptIterable<TOutput>): Iterator<TOutput>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n PreCondition.assertNotUndefinedAndNotNull(mapping, \"mapping\");\n\n return FlatMapIterator.create(iterator, mapping);\n }\n\n /**\n * Get an {@link Iterator} that will filter this {@link Iterator} to only the values that are\n * instances of {@link U} based on the provided type check {@link Function}.\n * @param typeCheck The {@link Function} that will be used to determine if values are of type\n * {@link U}.\n */\n public whereInstanceOf<U extends T>(typeCheck: (value: T) => value is U): Iterator<U>\n {\n return Iterator.whereInstanceOf(this, typeCheck);\n }\n\n public static whereInstanceOf<T, U extends T>(iterator: Iterator<T>, typeCheck: (value: T) => value is U): Iterator<U>\n {\n PreCondition.assertNotUndefinedAndNotNull(typeCheck, \"typeCheck\");\n\n return iterator.where(typeCheck)\n .map((value: T) => value as U);\n }\n\n /**\n * Get an {@link Iterator} that will filter this {@link Iterator} to only the values that are\n * instances of the provided {@link Type}.\n * @param type The type of values to return from the new {@link Iterator}.\n */\n public whereInstanceOfType<U extends T>(type: Type<U>): Iterator<U>\n {\n return Iterator.whereInstanceOfType(this, type);\n }\n\n public static whereInstanceOfType<T, U extends T>(iterator: Iterator<T>, type: Type<U>): Iterator<U>\n {\n PreCondition.assertNotUndefinedAndNotNull(type, \"type\");\n\n return iterator.whereInstanceOf((value: T) => instanceOfType(value, type));\n }\n\n /**\n * If the condition function is undefined, then this function will return the first value in\n * this {@link Iterator}. If this condition function is provided, then this function will return\n * the first value that matches the provided condition.\n * @param condition The condition that the returned value must satisfy.\n */\n public first(condition?: (value: T) => (boolean | SyncResult<boolean>)): SyncResult<T>\n {\n return Iterator.first(this, condition);\n }\n\n /**\n * If the condition function is undefined, then this function will return the first value in\n * the {@link Iterator}. If this condition function is provided, then this function will return\n * the first value that matches the provided condition.\n * @param iterator The {@link Iterator} to get the first value from.\n */\n public static first<T>(iterator: Iterator<T>, condition?: (value: T) => (boolean | SyncResult<boolean>)): SyncResult<T>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n\n return SyncResult.create(() =>\n {\n iterator.start().await();\n if (isUndefinedOrNull(condition))\n {\n if (!iterator.hasCurrent())\n {\n throw new EmptyError();\n }\n }\n else\n {\n while (iterator.hasCurrent() && !condition(iterator.getCurrent()))\n {\n const conditionResult: boolean | SyncResult<boolean> = condition(iterator.getCurrent());\n const conditionBoolean: boolean = conditionResult instanceof SyncResult ? conditionResult.await() : conditionResult;\n if (conditionBoolean)\n {\n break;\n }\n else\n {\n iterator.next().await();\n }\n }\n\n if (!iterator.hasCurrent())\n {\n throw new NotFoundError(\"No value was found in the Iterator that matched the provided condition.\");\n }\n }\n return iterator.getCurrent();\n });\n }\n\n /**\n * If the condition function is undefined, then this function will return the last value in this\n * {@link Iterator}. If this condition function is provided, then this function will return the\n * last value that matches the provided condition.\n * @param condition The condition that the returned value must satisfy.\n */\n public last(condition?: (value: T) => (boolean | SyncResult<boolean>)): SyncResult<T>\n {\n return Iterator.last(this, condition);\n }\n\n /**\n * If the condition function is undefined, then this function will return the last value in the\n * {@link Iterator}. If this condition function is provided, then this function will return the\n * last value that matches the provided condition.\n * @param iterator The {@link Iterator} to get the last value from.\n */\n public static last<T>(iterator: Iterator<T>, condition?: (value: T) => (boolean | SyncResult<boolean>)): SyncResult<T>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n\n return SyncResult.create(() =>\n {\n iterator.start().await();\n\n if (!iterator.hasCurrent())\n {\n throw new EmptyError();\n }\n\n let result: T;\n let found: boolean = false;\n do\n {\n if (!condition || condition(iterator.getCurrent()))\n {\n result = iterator.getCurrent();\n found = true;\n }\n }\n while (iterator.next().await());\n\n if (!found)\n {\n if (!condition)\n {\n throw new EmptyError();\n }\n else\n {\n throw new NotFoundError(\"No value was found in the Iterator that matched the provided condition.\");\n }\n }\n\n return result!;\n });\n }\n\n /**\n * Find the maximum value in the provided {@link Iterator}.\n * @param iterator The values to find the maximum of.\n */\n public static findMaximum<T extends Comparable<T>>(iterator: JavascriptIterator<T> | Iterator<T>): SyncResult<T>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterable\");\n\n return SyncResult.create(() =>\n {\n if (isJavascriptIterator(iterator))\n {\n iterator = Iterator.create(iterator);\n }\n\n let result: T = iterator.first()\n .convertError(EmptyError, () => new EmptyError(\"Can't find the maximum of an empty Iterator.\"))\n .await();\n while (iterator.next().await())\n {\n const currentValue: T = iterator.getCurrent();\n if (result.lessThan(currentValue))\n {\n result = currentValue;\n }\n }\n\n return result;\n });\n }\n\n /**\n * Get a new {@link Iterator} that wraps around this {@link Iterator} and only\n * returns a maximum number of values from this {@link Iterator}.\n * @param maximumToTake The maximum number of values to take from this {@link Iterator}.\n */\n public take(maximumToTake: number): Iterator<T>\n {\n return Iterator.take(this, maximumToTake);\n }\n\n public static take<T>(iterator: Iterator<T>, maximumToTake: number): Iterator<T>\n {\n return TakeIterator.create(iterator, maximumToTake);\n }\n\n /**\n * Get a new {@link Iterator} that wraps around this {@link Iterator} and will skip the initial\n * provided number of values before beginning to return values.\n * @param maximumToSkip The maximum number of values to skip from this {@link Iterator}.\n */\n public skip(maximumToSkip: number): Iterator<T>\n {\n return Iterator.skip(this, maximumToSkip);\n }\n\n public static skip<T>(iterator: Iterator<T>, maximumToSkip: number): Iterator<T>\n {\n return SkipIterator.create(iterator, maximumToSkip);\n }\n}","import { EqualFunctions } from \"./equalFunctions\";\r\nimport { Iterable } from \"./iterable\";\r\nimport { Iterator } from \"./iterator\";\r\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\r\nimport { List } from \"./list\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { SyncResult } from \"./syncResult\";\r\nimport { ToStringFunctions } from \"./toStringFunctions\";\r\nimport { Type } from \"./types\";\r\n\r\nexport class JavascriptArrayList<T> implements List<T>\r\n{\r\n private readonly array: T[];\r\n\r\n private constructor()\r\n {\r\n this.array = [];\r\n }\r\n\r\n public static create<T>(values?: JavascriptIterable<T>): JavascriptArrayList<T>\r\n {\r\n const result: JavascriptArrayList<T> = new JavascriptArrayList<T>();\r\n if (values)\r\n {\r\n result.addAll(values);\r\n }\r\n return result;\r\n }\r\n\r\n public set(index: number, value: T): this\r\n {\r\n PreCondition.assertAccessIndex(index, this.getCount().await(), \"index\");\r\n\r\n this.array[index] = value;\r\n\r\n return this;\r\n }\r\n\r\n public iterate(): Iterator<T>\r\n {\r\n return Iterator.create(this.array);\r\n }\r\n\r\n public getCount(): SyncResult<number>\r\n {\r\n return SyncResult.value(this.array.length);\r\n }\r\n\r\n public get(index: number): SyncResult<T>\r\n {\r\n PreCondition.assertAccessIndex(index, this.getCount().await(), \"index\");\r\n\r\n return SyncResult.value(this.array[index]);\r\n }\r\n\r\n public insert(index: number, value: T): this\r\n {\r\n PreCondition.assertInsertIndex(index, this.getCount().await(), \"index\");\r\n\r\n this.array.splice(index, 0, value);\r\n\r\n return this;\r\n }\r\n\r\n public insertAll(index: number, values: JavascriptIterable<T>): this\r\n {\r\n PreCondition.assertInsertIndex(index, this.getCount().await(), \"index\");\r\n PreCondition.assertNotUndefinedAndNotNull(values, \"values\");\r\n\r\n this.array.splice(index, 0, ...values);\r\n\r\n return this;\r\n }\r\n\r\n public removeAt(index: number): SyncResult<T>\r\n {\r\n PreCondition.assertAccessIndex(index, this.getCount().await(), \"index\");\r\n\r\n return SyncResult.value(this.array.splice(index, 1)[0]);\r\n }\r\n\r\n public removeFirst(): SyncResult<T>\r\n {\r\n PreCondition.assertNotEmpty(this, \"this\");\r\n\r\n return SyncResult.value(this.array.shift()!);\r\n }\r\n\r\n public removeLast(): SyncResult<T>\r\n {\r\n PreCondition.assertNotEmpty(this, \"this\");\r\n\r\n return SyncResult.value(this.array.pop()!);\r\n }\r\n\r\n public add(value: T): this\r\n {\r\n return List.add(this, value);\r\n }\r\n\r\n public addAll(values: JavascriptIterable<T>): this\r\n {\r\n return List.addAll(this, values);\r\n }\r\n\r\n public remove(value: T, equalFunctions?: EqualFunctions): SyncResult<T>\r\n {\r\n return List.remove(this, value, equalFunctions);\r\n }\r\n\r\n public toArray(): SyncResult<T[]>\r\n {\r\n return SyncResult.value(this.array.slice());\r\n }\r\n\r\n public any(): SyncResult<boolean>\r\n {\r\n return List.any(this);\r\n }\r\n\r\n public equals(right: JavascriptIterable<T>, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return List.equals(this, right, equalFunctions);\r\n }\r\n\r\n public toString(toStringFunctions?: ToStringFunctions): string\r\n {\r\n return List.toString(this, toStringFunctions);\r\n }\r\n\r\n public concatenate(...toConcatenate: JavascriptIterable<T>[]): Iterable<T>\r\n {\r\n return List.concatenate(this, ...toConcatenate);\r\n }\r\n\r\n public map<TOutput>(mapping: (value: T) => (TOutput | SyncResult<TOutput>)): Iterable<TOutput>\r\n {\r\n return List.map(this, mapping);\r\n }\r\n\r\n public flatMap<TOutput>(mapping: (value: T) => JavascriptIterable<TOutput>): Iterable<TOutput>\r\n {\r\n return List.flatMap(this, mapping);\r\n }\r\n\r\n public where(condition: (value: T) => (boolean | SyncResult<boolean>)): Iterable<T>\r\n {\r\n return List.where(this, condition);\r\n }\r\n\r\n public instanceOf<TOutput extends T>(typeOrTypeCheck: Type<TOutput> | ((value: T) => value is TOutput)): Iterable<TOutput>\r\n {\r\n return List.instanceOf(this, typeOrTypeCheck);\r\n }\r\n\r\n public first(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>\r\n {\r\n return List.first(this, condition);\r\n }\r\n\r\n public last(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>\r\n {\r\n return List.last(this, condition);\r\n }\r\n\r\n public [Symbol.iterator](): JavascriptIterator<T>\r\n {\r\n return List[Symbol.iterator](this);\r\n }\r\n\r\n public contains(value: T, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return List.contains(this, value, equalFunctions);\r\n }\r\n}","/**\r\n * The built-in {@link Array} type.\r\n * \r\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array\r\n */\r\nexport type JavascriptArray<T> = Array<T>;\r\n\r\n/**\r\n * The built-in {@link Iterator} type.\r\n * \r\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators#iterators\r\n */\r\nexport type JavascriptIterator<T> = Iterator<T>;\r\n\r\n/**\r\n * The built-in {@link IteratorResult} type.\r\n */\r\nexport type JavascriptIteratorResult<T> = IteratorResult<T,T>;\r\n\r\n/**\r\n * The built-in {@link Iterable} type.\r\n * \r\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators#iterables\r\n */\r\nexport type JavascriptIterable<T> = Iterable<T>;\r\n\r\n/**\r\n * The built-in {@link Map} type.\r\n * \r\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map\r\n */\r\nexport type JavascriptMap<TKey,TValue> = Map<TKey,TValue>;\r\n/**\r\n * The built-in {@link Map} type.\r\n * \r\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map\r\n */\r\nexport const JavascriptMap = Map;\r\n\r\n/**\r\n * The built-in {@link AsyncIterator} type.\r\n * \r\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AsyncIterator\r\n */\r\nexport type JavascriptAsyncIterator<T> = AsyncIterator<T>;\r\n\r\nexport interface JavascriptAsyncIterable<T>\r\n{\r\n [Symbol.asyncIterator](): JavascriptAsyncIterator<T>;\r\n}\r\n\r\n/**\r\n * The built-in {@link Set} type.\r\n * \r\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set\r\n */\r\nexport type JavascriptSet<T> = Set<T>;\r\n\r\nexport const JavascriptSet = Set;","import { EqualFunctions } from \"./equalFunctions\";\r\nimport { Iterable } from \"./iterable\";\r\nimport { Iterator } from \"./iterator\";\r\nimport { JavascriptIterable, JavascriptIterator, JavascriptMap } from \"./javascript\";\r\nimport { MapEntry } from \"./map\";\r\nimport { MutableMap } from \"./mutableMap\";\r\nimport { NotFoundError } from \"./notFoundError\";\r\nimport { SyncResult } from \"./syncResult\";\r\nimport { ToStringFunctions } from \"./toStringFunctions\";\r\nimport { Type } from \"./types\";\r\n\r\nexport class JavascriptMapMap<TKey,TValue> implements MutableMap<TKey,TValue>\r\n{\r\n private readonly javascriptMap: JavascriptMap<TKey,TValue>;\r\n\r\n private constructor()\r\n {\r\n this.javascriptMap = new JavascriptMap();\r\n }\r\n\r\n public static create<TKey,TValue>(): JavascriptMapMap<TKey,TValue>\r\n {\r\n return new JavascriptMapMap<TKey,TValue>();\r\n }\r\n\r\n public any(): SyncResult<boolean>\r\n {\r\n return SyncResult.value(this.javascriptMap.size > 0);\r\n }\r\n\r\n public getCount(): SyncResult<number>\r\n {\r\n return SyncResult.value(this.javascriptMap.size);\r\n }\r\n\r\n public containsKey(key: TKey): SyncResult<boolean>\r\n {\r\n return SyncResult.value(this.javascriptMap.has(key));\r\n }\r\n\r\n public get(key: TKey): SyncResult<TValue>\r\n {\r\n return this.containsKey(key).await()\r\n ? SyncResult.value(this.javascriptMap.get(key)!)\r\n : SyncResult.error(new NotFoundError(`The key ${JSON.stringify(key)} was not found in the map.`));\r\n }\r\n\r\n public set(key: TKey, value: TValue): this\r\n {\r\n this.javascriptMap.set(key, value);\r\n\r\n return this;\r\n }\r\n\r\n public remove(key: TKey): SyncResult<TValue>\r\n {\r\n const value: TValue | undefined = this.javascriptMap.get(key);\r\n return this.javascriptMap.delete(key)\r\n ? SyncResult.value(value!)\r\n : SyncResult.error(new NotFoundError(`The key ${JSON.stringify(key)} was not found in the map.`));\r\n }\r\n\r\n public iterate(): Iterator<MapEntry<TKey,TValue>>\r\n {\r\n return Iterator.create(this.javascriptMap.entries())\r\n .map((entry: [TKey,TValue]) => { return {key: entry[0], value: entry[1]}; });\r\n }\r\n\r\n public iterateKeys(): Iterator<TKey>\r\n {\r\n return Iterator.create(this.javascriptMap.keys());\r\n }\r\n\r\n public iterateValues(): Iterator<TValue>\r\n {\r\n return Iterator.create(this.javascriptMap.values());\r\n }\r\n\r\n public toArray(): SyncResult<MapEntry<TKey, TValue>[]>\r\n {\r\n return MutableMap.toArray(this);\r\n }\r\n\r\n public equals(right: Iterable<MapEntry<TKey, TValue>>, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return MutableMap.equals(this, right, equalFunctions);\r\n }\r\n\r\n public toString(toStringFunctions?: ToStringFunctions): string\r\n {\r\n return MutableMap.toString(this, toStringFunctions);\r\n }\r\n\r\n public concatenate(...toConcatenate: JavascriptIterable<MapEntry<TKey, TValue>>[]): Iterable<MapEntry<TKey, TValue>>\r\n {\r\n return MutableMap.concatenate(this, ...toConcatenate);\r\n }\r\n\r\n public map<TOutput>(mapping: (value: MapEntry<TKey, TValue>) => (TOutput | SyncResult<TOutput>)): Iterable<TOutput>\r\n {\r\n return MutableMap.map(this, mapping);\r\n }\r\n\r\n public flatMap<TOutput>(mapping: (value: MapEntry<TKey, TValue>) => JavascriptIterable<TOutput>): Iterable<TOutput>\r\n {\r\n return MutableMap.flatMap(this, mapping);\r\n }\r\n\r\n public where(condition: (value: MapEntry<TKey, TValue>) => (boolean | SyncResult<boolean>)): Iterable<MapEntry<TKey, TValue>>\r\n {\r\n return MutableMap.where(this, condition);\r\n }\r\n\r\n public instanceOf<T extends MapEntry<TKey, TValue>>(typeOrTypeCheck: Type<T> | ((value: MapEntry<TKey, TValue>) => value is T)): Iterable<T>\r\n {\r\n return MutableMap.instanceOf(this, typeOrTypeCheck);\r\n }\r\n\r\n public first(condition?: ((entry: MapEntry<TKey, TValue>) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<MapEntry<TKey, TValue>>\r\n {\r\n return MutableMap.first(this, condition);\r\n }\r\n\r\n public last(condition?: ((entry: MapEntry<TKey, TValue>) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<MapEntry<TKey, TValue>>\r\n {\r\n return MutableMap.last(this, condition);\r\n }\r\n\r\n public getOrSet(key: TKey, valueCreator: () => TValue | SyncResult<TValue>): SyncResult<TValue>\r\n {\r\n return MutableMap.getOrSet(this, key, valueCreator);\r\n }\r\n\r\n public [Symbol.iterator](): JavascriptIterator<MapEntry<TKey, TValue>>\r\n {\r\n return MutableMap[Symbol.iterator](this);\r\n }\r\n\r\n public contains(value: MapEntry<TKey, TValue>, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return MutableMap.contains(this, value, equalFunctions);\r\n }\r\n}","import { EqualFunctions } from \"./equalFunctions\";\nimport { Iterable } from \"./iterable\";\nimport { Iterator } from \"./iterator\";\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\nimport { JavascriptMapMap } from \"./javascriptMapMap\";\nimport { NotFoundError } from \"./notFoundError\";\nimport { PreCondition } from \"./preCondition\";\nimport { SyncResult } from \"./syncResult\";\nimport { ToStringFunctions } from \"./toStringFunctions\";\nimport { hasFunction, Type } from \"./types\";\nimport { isMap, Map, MapEntry } from \"./map\";\n\n/**\n * Get whether the provided value is {@link Map}.\n * @param value The value to check.\n */\nexport function isMutableMap(value: unknown): value is MutableMap<unknown, unknown>\n{\n return value instanceof MutableMap ||\n (\n isMap(value) && \n hasFunction(value, \"set\", 2) &&\n hasFunction(value, \"getOrSet\", 2)\n );\n}\n\n/**\n * A type that maps {@link TKey} values to {@link TValue} values.\n */\nexport abstract class MutableMap<TKey, TValue> implements Map<TKey, TValue>\n{\n /**\n * Create a new instance of the default {@link Map} implementation.\n */\n public static create<TKey, TValue>(): MutableMap<TKey, TValue>\n {\n return JavascriptMapMap.create();\n }\n\n /**\n * Iterate over the entries in this {@link MutableMap}.\n */\n public abstract iterate(): Iterator<MapEntry<TKey, TValue>>;\n\n public any(): SyncResult<boolean>\n {\n return MutableMap.any(this);\n }\n\n public static any<TKey,TValue>(map: MutableMap<TKey,TValue>): SyncResult<boolean>\n {\n return Map.any(map);\n }\n\n public toArray(): SyncResult<MapEntry<TKey, TValue>[]>\n {\n return MutableMap.toArray(this);\n }\n\n public static toArray<TKey,TValue>(map: MutableMap<TKey,TValue>): SyncResult<MapEntry<TKey,TValue>[]>\n {\n return Map.toArray(map);\n }\n\n public equals(right: Iterable<MapEntry<TKey, TValue>>, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return MutableMap.equals(this, right, equalFunctions);\n }\n\n public static equals<TKey, TValue>(left: MutableMap<TKey, TValue>, right: Iterable<MapEntry<TKey, TValue>>, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return Map.equals(left, right, equalFunctions);\n }\n\n /**\n * Get the {@link String} representation of this {@link MutableMap}.\n */\n public toString(toStringFunctions?: ToStringFunctions): string\n {\n return MutableMap.toString(this, toStringFunctions);\n }\n\n /**\n * Get the {@link String} representation of the provided {@link MutableMap}.\n */\n public static toString<TKey, TValue>(map: MutableMap<TKey, TValue>, toStringFunctions?: ToStringFunctions): string\n {\n return Map.toString(map, toStringFunctions);\n }\n\n public concatenate(...toConcatenate: JavascriptIterable<MapEntry<TKey, TValue>>[]): Iterable<MapEntry<TKey, TValue>>\n {\n return MutableMap.concatenate(this, ...toConcatenate);\n }\n\n public static concatenate<TKey,TValue>(map: MutableMap<TKey,TValue>, ...toConcatenate: JavascriptIterable<MapEntry<TKey, TValue>>[]): Iterable<MapEntry<TKey, TValue>>\n {\n return Map.concatenate(map, ...toConcatenate);\n }\n\n public map<TOutput>(mapping: (value: MapEntry<TKey, TValue>) => (TOutput | SyncResult<TOutput>)): Iterable<TOutput>\n {\n return MutableMap.map(this, mapping);\n }\n\n public static map<TKey,TValue,TOutput>(map: MutableMap<TKey,TValue>, mapping: (value: MapEntry<TKey,TValue>) => (TOutput | SyncResult<TOutput>)): Iterable<TOutput>\n {\n return Map.map(map, mapping);\n }\n\n public flatMap<TOutput>(mapping: (value: MapEntry<TKey, TValue>) => JavascriptIterable<TOutput>): Iterable<TOutput>\n {\n return MutableMap.flatMap(this, mapping);\n }\n\n public static flatMap<TKey,TValue,TOutput>(map: MutableMap<TKey,TValue>, mapping: (value: MapEntry<TKey,TValue>) => JavascriptIterable<TOutput>): Iterable<TOutput>\n {\n return Map.flatMap(map, mapping);\n }\n\n public where(condition: (value: MapEntry<TKey, TValue>) => (boolean | SyncResult<boolean>)): Iterable<MapEntry<TKey, TValue>>\n {\n return MutableMap.where(this, condition);\n }\n\n public static where<TKey,TValue>(map: MutableMap<TKey,TValue>, condition: (value: MapEntry<TKey,TValue>) => (boolean | SyncResult<boolean>)): Iterable<MapEntry<TKey,TValue>>\n {\n return Map.where(map, condition);\n }\n\n public instanceOf<T extends MapEntry<TKey, TValue>>(typeOrTypeCheck: Type<T> | ((value: MapEntry<TKey, TValue>) => value is T)): Iterable<T>\n {\n return MutableMap.instanceOf(this, typeOrTypeCheck);\n }\n\n public static instanceOf<TKey,TValue,T extends MapEntry<TKey, TValue>>(map: MutableMap<TKey,TValue>, typeOrTypeCheck: Type<T> | ((value: MapEntry<TKey, TValue>) => value is T)): Iterable<T>\n {\n return Map.instanceOf(map, typeOrTypeCheck);\n }\n\n public [Symbol.iterator](): JavascriptIterator<MapEntry<TKey, TValue>>\n {\n return MutableMap[Symbol.iterator](this);\n }\n\n public static [Symbol.iterator]<TKey,TValue>(map: MutableMap<TKey,TValue>): JavascriptIterator<MapEntry<TKey,TValue>>\n {\n return Map[Symbol.iterator](map);\n }\n\n /**\n * Get the number of entries in this {@link MutableMap}.\n */\n public getCount(): SyncResult<number>\n {\n return MutableMap.getCount(this);\n }\n\n public static getCount<TKey,TValue>(map: MutableMap<TKey,TValue>): SyncResult<number>\n {\n return Map.getCount(map);\n }\n\n public first(condition?: (entry: MapEntry<TKey,TValue>) => (boolean | SyncResult<boolean>)): SyncResult<MapEntry<TKey, TValue>>\n {\n return MutableMap.first(this, condition);\n }\n\n public static first<TKey,TValue>(map: MutableMap<TKey,TValue>, condition?: (entry: MapEntry<TKey,TValue>) => (boolean | SyncResult<boolean>)): SyncResult<MapEntry<TKey, TValue>>\n {\n return Map.first(map, condition);\n }\n\n public last(condition?: (entry: MapEntry<TKey,TValue>) => (boolean | SyncResult<boolean>)): SyncResult<MapEntry<TKey, TValue>>\n {\n return MutableMap.last(this, condition);\n }\n\n public static last<TKey,TValue>(map: MutableMap<TKey,TValue>, condition?: (entry: MapEntry<TKey,TValue>) => (boolean | SyncResult<boolean>)): SyncResult<MapEntry<TKey, TValue>>\n {\n return Map.last(map, condition);\n }\n\n /**\n * Get whether this {@link MutableMap} contains the provided key.\n * @param key The key to look for.\n */\n public abstract containsKey(key: TKey): SyncResult<boolean>;\n\n /**\n * Get the value associated with the provided key.\n * @param key The key of the value to get.\n */\n public abstract get(key: TKey): SyncResult<TValue>;\n\n /**\n * Set the key/value association in this {@link MutableMap}.\n * @param key The key associated with the value.\n * @param value The value associated with the key.\n */\n public abstract set(key: TKey, value: TValue): this;\n\n /**\n * Get the {@link TValue} associated with the provided {@link TKey}. If the provided\n * {@link TKey} doesn't exist in this {@link MutableMap}, then invoke the provided {@link valueCreator}\n * and associate the returned {@link TValue} with the provided {@link TKey}. Then return the new\n * {@link TValue}.\n * @param key The {@link TKey} of the {@link TValue} to get.\n * @param valueCreator The {@link Function} that will be invoked if the {@link TKey} doesn't\n * exist in this {@link MutableMap}.\n */\n public getOrSet(key: TKey, valueCreator: () => (TValue | SyncResult<TValue>)): SyncResult<TValue>\n {\n return MutableMap.getOrSet(this, key, valueCreator);\n }\n\n /**\n * Get the {@link TValue} associated with the provided {@link TKey}. If the provided\n * {@link TKey} doesn't exist in the {@link MutableMap}, then invoke the provided {@link valueCreator}\n * and associate the returned {@link TValue} with the provided {@link TKey}. Then return the new\n * {@link TValue}.\n * @param key The {@link TKey} of the {@link TValue} to get.\n * @param valueCreator The {@link Function} that will be invoked if the {@link TKey} doesn't\n * exist in this {@link MutableMap}.\n */\n public static getOrSet<TKey, TValue>(map: MutableMap<TKey, TValue>, key: TKey, valueCreator: () => (TValue | SyncResult<TValue>)): SyncResult<TValue>\n {\n PreCondition.assertNotUndefinedAndNotNull(map, \"map\");\n PreCondition.assertNotUndefinedAndNotNull(valueCreator, \"valueCreator\");\n\n return map.get(key)\n .catch(NotFoundError, () =>\n {\n const creatorResult: TValue | SyncResult<TValue> = valueCreator();\n const value: TValue = creatorResult instanceof SyncResult ? creatorResult.await() : creatorResult;\n map.set(key, value);\n return value;\n });\n }\n\n /**\n * Remove the provided {@link TKey} from this {@link MutableMap}. If the {@link TKey} doesn't exist in\n * this {@link MutableMap}, then return a {@link NotFoundError}. If the {@link TKey} does exist, then\n * return the {@link TValue} that was associated with it.\n * @param key The {@link TKey} to remove from this {@link MutableMap}.\n */\n public abstract remove(key: TKey): SyncResult<TValue>;\n\n /**\n * Iterate over the keys in this {@link MutableMap}.\n */\n public iterateKeys(): Iterator<TKey>\n {\n return MutableMap.iterateKeys(this);\n }\n\n /**\n * Iterate over the keys in the {@link MutableMap}.\n * @param map The map to iterate over.\n */\n public static iterateKeys<TKey, TValue>(map: MutableMap<TKey, TValue>): Iterator<TKey>\n {\n return Map.iterateKeys(map);\n }\n\n /**\n * Iterate over the values in this {@link MutableMap}.\n */\n public iterateValues(): Iterator<TValue>\n {\n return MutableMap.iterateValues(this);\n }\n\n /**\n * Iterate over the keys in the {@link MutableMap}.\n * @param map The map to iterate over.\n */\n public static iterateValues<TKey, TValue>(map: MutableMap<TKey, TValue>): Iterator<TValue>\n {\n return Map.iterateValues(map);\n }\n\n public contains(value: MapEntry<TKey,TValue>, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return MutableMap.contains(this, value, equalFunctions);\n }\n\n public static contains<TKey,TValue>(map: MutableMap<TKey,TValue>, value: MapEntry<TKey,TValue>, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return Map.contains(map, value, equalFunctions);\n }\n}","import { Comparer } from \"./comparer\";\r\nimport { EqualFunctions } from \"./equalFunctions\";\r\nimport { Iterable } from \"./iterable\";\r\nimport { Iterator } from \"./iterator\";\r\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\r\nimport { MutableMap } from \"./mutableMap\";\r\nimport { NotFoundError } from \"./notFoundError\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { join } from \"./strings\";\r\nimport { SyncResult } from \"./syncResult\";\r\nimport { ToStringFunctions } from \"./toStringFunctions\";\r\nimport { hasFunction, isUndefinedOrNull, Type } from \"./types\";\r\n\r\n/**\r\n * Get whether the provided value is {@link Map}.\r\n * @param value The value to check.\r\n */\r\nexport function isMap(value: unknown): value is Map<unknown, unknown>\r\n{\r\n return value instanceof Map ||\r\n (\r\n hasFunction(value, \"containsKey\", 1) &&\r\n hasFunction(value, \"get\", 1) &&\r\n hasFunction(value, \"set\", 2) &&\r\n hasFunction(value, \"iterateKeys\", 0) &&\r\n hasFunction(value, \"iterateValues\", 0)\r\n );\r\n}\r\n\r\n/**\r\n * An entry within a {@link Map}.\r\n */\r\nexport interface MapEntry<TKey, TValue>\r\n{\r\n /**\r\n * The key of the {@link MapEntry}.\r\n */\r\n readonly key: TKey,\r\n /**\r\n * The value of the {@link MapEntry}.\r\n */\r\n readonly value: TValue,\r\n}\r\n\r\n/**\r\n * A type that maps {@link TKey} values to {@link TValue} values.\r\n */\r\nexport abstract class Map<TKey, TValue> implements Iterable<MapEntry<TKey, TValue>>\r\n{\r\n /**\r\n * Create a new instance of the default {@link MutableMap} implementation.\r\n */\r\n public static create<TKey, TValue>(): MutableMap<TKey, TValue>\r\n {\r\n return MutableMap.create();\r\n }\r\n\r\n /**\r\n * Iterate over the entries in this {@link Map}.\r\n */\r\n public abstract iterate(): Iterator<MapEntry<TKey, TValue>>;\r\n\r\n public any(): SyncResult<boolean>\r\n {\r\n return Map.any(this);\r\n }\r\n\r\n public static any<TKey,TValue>(map: Map<TKey,TValue>): SyncResult<boolean>\r\n {\r\n return Iterable.any(map);\r\n }\r\n\r\n public toArray(): SyncResult<MapEntry<TKey, TValue>[]>\r\n {\r\n return Map.toArray(this);\r\n }\r\n\r\n public static toArray<TKey,TValue>(map: Map<TKey,TValue>): SyncResult<MapEntry<TKey,TValue>[]>\r\n {\r\n return Iterable.toArray(map);\r\n }\r\n\r\n public equals(right: Iterable<MapEntry<TKey, TValue>>, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return Map.equals(this, right, equalFunctions);\r\n }\r\n\r\n public static equals<TKey, TValue>(left: Map<TKey, TValue>, right: Iterable<MapEntry<TKey, TValue>>, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return SyncResult.create(() =>\r\n {\r\n if (isUndefinedOrNull(equalFunctions))\r\n {\r\n equalFunctions = EqualFunctions.create();\r\n }\r\n\r\n let result: boolean | undefined = Comparer.equalSameUndefinedNull(left, right);\r\n if (result === undefined)\r\n {\r\n result = true;\r\n for (const entry of right)\r\n {\r\n result = left.get(entry.key)\r\n .then((value: TValue) => equalFunctions!.areEqual(value, entry.value).await())\r\n .catch(() => false)\r\n .await();\r\n if (result === false)\r\n {\r\n break;\r\n }\r\n }\r\n }\r\n return result;\r\n });\r\n }\r\n\r\n /**\r\n * Get the {@link String} representation of this {@link Map}.\r\n */\r\n public toString(toStringFunctions?: ToStringFunctions): string\r\n {\r\n return Map.toString(this, toStringFunctions);\r\n }\r\n\r\n /**\r\n * Get the {@link String} representation of the provided {@link Map}.\r\n */\r\n public static toString<TKey, TValue>(map: Map<TKey, TValue>, toStringFunctions?: ToStringFunctions): string\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(map, \"iterable\");\r\n\r\n if (!toStringFunctions)\r\n {\r\n toStringFunctions = ToStringFunctions.create();\r\n }\r\n return `{${join(\",\", map.map((entry: MapEntry<unknown, unknown>) => `${toStringFunctions.toString(entry.key)}:${toStringFunctions.toString(entry.value)}`))}}`;\r\n }\r\n\r\n public concatenate(...toConcatenate: JavascriptIterable<MapEntry<TKey, TValue>>[]): Iterable<MapEntry<TKey, TValue>>\r\n {\r\n return Map.concatenate(this, ...toConcatenate);\r\n }\r\n\r\n public static concatenate<TKey,TValue>(map: Map<TKey,TValue>, ...toConcatenate: JavascriptIterable<MapEntry<TKey, TValue>>[]): Iterable<MapEntry<TKey, TValue>>\r\n {\r\n return Iterable.concatenate(map, ...toConcatenate);\r\n }\r\n\r\n public map<TOutput>(mapping: (value: MapEntry<TKey, TValue>) => (TOutput | SyncResult<TOutput>)): Iterable<TOutput>\r\n {\r\n return Map.map(this, mapping);\r\n }\r\n\r\n public static map<TKey,TValue,TOutput>(map: Map<TKey,TValue>, mapping: (value: MapEntry<TKey,TValue>) => (TOutput | SyncResult<TOutput>)): Iterable<TOutput>\r\n {\r\n return Iterable.map(map, mapping);\r\n }\r\n\r\n public flatMap<TOutput>(mapping: (value: MapEntry<TKey, TValue>) => JavascriptIterable<TOutput>): Iterable<TOutput>\r\n {\r\n return Map.flatMap(this, mapping);\r\n }\r\n\r\n public static flatMap<TKey,TValue,TOutput>(map: Map<TKey,TValue>, mapping: (value: MapEntry<TKey,TValue>) => JavascriptIterable<TOutput>): Iterable<TOutput>\r\n {\r\n return Iterable.flatMap(map, mapping);\r\n } \r\n\r\n public where(condition: (value: MapEntry<TKey, TValue>) => (boolean | SyncResult<boolean>)): Iterable<MapEntry<TKey, TValue>>\r\n {\r\n return Map.where(this, condition);\r\n }\r\n\r\n public static where<TKey,TValue>(map: Map<TKey,TValue>, condition: (value: MapEntry<TKey,TValue>) => (boolean | SyncResult<boolean>)): Iterable<MapEntry<TKey,TValue>>\r\n {\r\n return Iterable.where(map, condition);\r\n }\r\n\r\n public instanceOf<T extends MapEntry<TKey, TValue>>(typeOrTypeCheck: Type<T> | ((value: MapEntry<TKey, TValue>) => value is T)): Iterable<T>\r\n {\r\n return Map.instanceOf(this, typeOrTypeCheck);\r\n }\r\n\r\n public static instanceOf<TKey,TValue,T extends MapEntry<TKey, TValue>>(map: Map<TKey,TValue>, typeOrTypeCheck: Type<T> | ((value: MapEntry<TKey, TValue>) => value is T)): Iterable<T>\r\n {\r\n return Iterable.instanceOf(map, typeOrTypeCheck);\r\n }\r\n\r\n public [Symbol.iterator](): JavascriptIterator<MapEntry<TKey, TValue>>\r\n {\r\n return Map[Symbol.iterator](this);\r\n }\r\n\r\n public static [Symbol.iterator]<TKey,TValue>(map: Map<TKey,TValue>): JavascriptIterator<MapEntry<TKey,TValue>>\r\n {\r\n return Iterable[Symbol.iterator](map);\r\n }\r\n\r\n /**\r\n * Get the number of entries in this {@link Map}.\r\n */\r\n public getCount(): SyncResult<number>\r\n {\r\n return Map.getCount(this);\r\n }\r\n\r\n public static getCount<TKey,TValue>(map: Map<TKey,TValue>): SyncResult<number>\r\n {\r\n return Iterable.getCount(map);\r\n }\r\n\r\n public first(condition?: (entry: MapEntry<TKey,TValue>) => (boolean | SyncResult<boolean>)): SyncResult<MapEntry<TKey, TValue>>\r\n {\r\n return Map.first(this, condition);\r\n }\r\n\r\n public static first<TKey,TValue>(map: Map<TKey,TValue>, condition?: (entry: MapEntry<TKey,TValue>) => (boolean | SyncResult<boolean>)): SyncResult<MapEntry<TKey, TValue>>\r\n {\r\n return Iterable.first(map, condition);\r\n }\r\n\r\n public last(condition?: (entry: MapEntry<TKey,TValue>) => (boolean | SyncResult<boolean>)): SyncResult<MapEntry<TKey, TValue>>\r\n {\r\n return Map.last(this, condition);\r\n }\r\n\r\n public static last<TKey,TValue>(map: Map<TKey,TValue>, condition?: (entry: MapEntry<TKey,TValue>) => (boolean | SyncResult<boolean>)): SyncResult<MapEntry<TKey, TValue>>\r\n {\r\n return Iterable.last(map, condition);\r\n }\r\n\r\n /**\r\n * Get whether this {@link Map} contains the provided key.\r\n * @param key The key to look for.\r\n */\r\n public abstract containsKey(key: TKey): SyncResult<boolean>;\r\n\r\n /**\r\n * Get the value associated with the provided key.\r\n * @param key The key of the value to get.\r\n */\r\n public abstract get(key: TKey): SyncResult<TValue>;\r\n\r\n /**\r\n * Iterate over the keys in this {@link Map}.\r\n */\r\n public iterateKeys(): Iterator<TKey>\r\n {\r\n return Map.iterateKeys(this);\r\n }\r\n\r\n /**\r\n * Iterate over the keys in the {@link Map}.\r\n * @param map The map to iterate over.\r\n */\r\n public static iterateKeys<TKey, TValue>(map: Map<TKey, TValue>): Iterator<TKey>\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(map, \"map\");\r\n\r\n return map.iterate().map((entry: MapEntry<TKey, TValue>) => entry.key);\r\n }\r\n\r\n /**\r\n * Iterate over the values in this {@link Map}.\r\n */\r\n public iterateValues(): Iterator<TValue>\r\n {\r\n return Map.iterateValues(this);\r\n }\r\n\r\n /**\r\n * Iterate over the keys in the {@link Map}.\r\n * @param map The map to iterate over.\r\n */\r\n public static iterateValues<TKey, TValue>(map: Map<TKey, TValue>): Iterator<TValue>\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(map, \"map\");\r\n\r\n return map.iterate().map((entry: MapEntry<TKey, TValue>) => entry.value);\r\n }\r\n\r\n public contains(value: MapEntry<TKey,TValue>, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return Map.contains(this, value, equalFunctions);\r\n }\r\n\r\n public static contains<TKey,TValue>(map: Map<TKey,TValue>, value: MapEntry<TKey,TValue>, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return SyncResult.create(() =>\r\n {\r\n if (!equalFunctions)\r\n {\r\n equalFunctions = EqualFunctions.create();\r\n }\r\n\r\n return map.get(value.key)\r\n .then(entryValue => equalFunctions!.areEqual(entryValue, value.value).await())\r\n .catch(NotFoundError, () => false)\r\n .await();\r\n });\r\n }\r\n}","import { EqualFunctions } from \"./equalFunctions\";\nimport { Iterable } from \"./iterable\";\nimport { Iterator } from \"./iterator\";\nimport { JavascriptIterable, JavascriptIterator, JavascriptSet } from \"./javascript\";\nimport { NotFoundError } from \"./notFoundError\";\nimport { Set } from \"./set\";\nimport { SyncResult } from \"./syncResult\";\nimport { ToStringFunctions } from \"./toStringFunctions\";\nimport { Type } from \"./types\";\n\nexport class JavascriptSetSet<T> implements Set<T>\n{\n private readonly set: JavascriptSet<T>;\n\n private constructor()\n {\n this.set = new JavascriptSet<T>();\n }\n\n public static create<T>(initialValues?: JavascriptIterable<T>): JavascriptSetSet<T>\n {\n const result: JavascriptSetSet<T> = new JavascriptSetSet<T>();\n if (initialValues)\n {\n result.addAll(initialValues);\n }\n return result;\n }\n\n public add(value: T): this\n {\n this.set.add(value);\n\n return this;\n }\n\n public addAll(values: JavascriptIterable<T>): this\n {\n return Set.addAll(this, values);\n }\n\n public remove(value: T): SyncResult<void>\n {\n return SyncResult.create(() =>\n {\n if (!this.set.delete(value))\n {\n throw new NotFoundError(`Could not find ${JSON.stringify(value)}.`);\n }\n });\n }\n\n public union(values: JavascriptIterable<T>): Set<T>\n {\n return Set.union(this, values);\n }\n\n public iterate(): Iterator<T>\n {\n return Iterator.create(this.set);\n }\n\n public toArray(): SyncResult<T[]>\n {\n return Set.toArray(this);\n }\n\n public any(): SyncResult<boolean>\n {\n return Set.any(this);\n }\n\n public getCount(): SyncResult<number>\n {\n return SyncResult.value(this.set.size);\n }\n\n public equals(right: JavascriptIterable<T>, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return Set.equals(this, right, equalFunctions);\n }\n\n public toString(toStringFunctions?: ToStringFunctions): string\n {\n return Set.toString(this, toStringFunctions);\n }\n\n public concatenate(...toConcatenate: JavascriptIterable<T>[]): Iterable<T>\n {\n return Set.concatenate(this, ...toConcatenate);\n }\n\n public map<TOutput>(mapping: (value: T) => TOutput | SyncResult<TOutput>): Iterable<TOutput>\n {\n return Set.map(this, mapping);\n }\n\n public flatMap<TOutput>(mapping: (value: T) => JavascriptIterable<TOutput>): Iterable<TOutput>\n {\n return Set.flatMap(this, mapping);\n }\n\n public where(condition: (value: T) => (boolean | SyncResult<boolean>)): Iterable<T>\n {\n return Set.where(this, condition);\n }\n\n public instanceOf<TOutput extends T>(typeOrTypeCheck: Type<TOutput> | ((value: T) => value is TOutput)): Iterable<TOutput>\n {\n return Set.instanceOf(this, typeOrTypeCheck);\n }\n\n public first(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>\n {\n return Set.first(this, condition);\n }\n\n public last(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>\n {\n return Set.last(this, condition);\n }\n\n public contains(value: T, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return equalFunctions === undefined\n ? SyncResult.value(this.set.has(value))\n : Iterable.contains(this, value, equalFunctions);\n }\n\n public [Symbol.iterator](): JavascriptIterator<T>\n {\n return Set[Symbol.iterator](this);\n }\n}","import { EqualFunctions } from \"./equalFunctions\";\nimport { Iterable } from \"./iterable\";\nimport { Iterator } from \"./iterator\";\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\nimport { JavascriptSetSet } from \"./javascriptSetSet\";\nimport { PreCondition } from \"./preCondition\";\nimport { SyncResult } from \"./syncResult\";\nimport { ToStringFunctions } from \"./toStringFunctions\";\nimport { hasFunction, Type } from \"./types\";\n\n/**\n * Get whether the provided value is a {@link Set}.\n * @param value The value to check.\n */\nexport function isSet(value: unknown): value is Set<unknown>\n{\n return value instanceof Set ||\n (\n hasFunction(value, \"add\", 1) &&\n hasFunction(value, \"addAll\", 1) &&\n hasFunction(value, \"remove\", 1)\n );\n}\n\nexport abstract class Set<T> implements Iterable<T>\n{\n public static create<T>(initialValues?: JavascriptIterable<T>): JavascriptSetSet<T>\n {\n return JavascriptSetSet.create(initialValues);\n }\n\n /**\n * Add the provided value to this {@link Set}.\n * @param value The value to add to this {@link Set}.\n */\n public abstract add(value: T): this;\n\n public addAll(values: JavascriptIterable<T>): this\n {\n return Set.addAll(this, values);\n }\n\n public static addAll<T, TSet extends Set<T>>(set: TSet, values: JavascriptIterable<T>): TSet\n {\n PreCondition.assertNotUndefinedAndNotNull(set, \"set\");\n PreCondition.assertNotUndefinedAndNotNull(values, \"values\");\n\n for (const value of values)\n {\n set.add(value);\n }\n return set;\n }\n\n /**\n * Remove the provided value from this {@link Set}. Return a {@link NotFoundError} if the value\n * is not found.\n * @param value The value to remove.\n */\n public abstract remove(value: T): SyncResult<void>;\n\n public abstract iterate(): Iterator<T>;\n\n public union(values: JavascriptIterable<T>): Set<T>\n {\n return Set.union(this, values);\n }\n\n public static union<T>(set: Set<T>, values: JavascriptIterable<T>): Set<T>\n {\n PreCondition.assertNotUndefinedAndNotNull(set, \"set\");\n PreCondition.assertNotUndefinedAndNotNull(values, \"values\");\n\n const result: Set<T> = Set.create();\n result.addAll(set);\n result.addAll(values);\n return result;\n }\n\n public toArray(): SyncResult<T[]>\n {\n return Set.toArray(this);\n }\n\n public static toArray<T>(set: Set<T>): SyncResult<T[]>\n {\n return Iterable.toArray(set);\n }\n\n public any(): SyncResult<boolean>\n {\n return Set.any(this);\n }\n\n public static any<T>(set: Set<T>): SyncResult<boolean>\n {\n return SyncResult.create(() =>\n {\n return set.getCount().await() > 0;\n });\n }\n\n public getCount(): SyncResult<number>\n {\n return Set.getCount(this);\n }\n\n public static getCount<T>(set: Set<T>): SyncResult<number>\n {\n return Iterable.getCount(set);\n }\n\n public equals(right: JavascriptIterable<T>, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return Set.equals(this, right, equalFunctions);\n }\n\n public static equals<T>(left: Set<T>, right: JavascriptIterable<T>, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return isSet(right)\n ? Set.equalSet(left, right, equalFunctions)\n : Iterable.equals(left, right, equalFunctions);\n }\n\n public static equalSet<T>(left: Set<T>, right: Set<T>, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return SyncResult.create(() =>\n {\n let result: boolean = left.getCount().await() === right.getCount().await();\n if (result)\n {\n for (const leftValue of left)\n {\n if (!right.contains(leftValue, equalFunctions).await())\n {\n result = false;\n break;\n }\n }\n }\n return result;\n });\n }\n\n public toString(toStringFunctions?: ToStringFunctions): string\n {\n return Set.toString(this, toStringFunctions);\n }\n\n public static toString<T>(set: Set<T>, toStringFunctions?: ToStringFunctions): string\n {\n return Iterable.toString(set, toStringFunctions);\n }\n\n public concatenate(...toConcatenate: JavascriptIterable<T>[]): Iterable<T>\n {\n return Set.concatenate(this, ...toConcatenate);\n }\n\n public static concatenate<T>(set: Set<T>, ...toConcatenate: JavascriptIterable<T>[]): Iterable<T>\n {\n return Iterable.concatenate(set, ...toConcatenate);\n }\n\n public map<TOutput>(mapping: (value: T) => (TOutput | SyncResult<TOutput>)): Iterable<TOutput>\n {\n return Set.map<T, TOutput>(this, mapping);\n }\n\n public static map<TInput, TOutput>(set: Set<TInput>, mapping: (value: TInput) => (TOutput | SyncResult<TOutput>)): Iterable<TOutput>\n {\n return Iterable.map<TInput, TOutput>(set, mapping);\n }\n\n public flatMap<TOutput>(mapping: (value: T) => JavascriptIterable<TOutput>): Iterable<TOutput>\n {\n return Set.flatMap(this, mapping);\n }\n\n public static flatMap<TInput, TOutput>(set: Set<TInput>, mapping: (value: TInput) => JavascriptIterable<TOutput>): Iterable<TOutput>\n {\n return Iterable.flatMap<TInput, TOutput>(set, mapping);\n }\n\n public where(condition: (value: T) => (boolean | SyncResult<boolean>)): Iterable<T>\n {\n return Set.where(this, condition);\n }\n\n public static where<T>(set: Set<T>, condition: (value: T) => (boolean | SyncResult<boolean>)): Iterable<T>\n {\n return Iterable.where(set, condition);\n }\n\n public instanceOf<TOutput extends T>(typeOrTypeCheck: Type<TOutput> | ((value: T) => value is TOutput)): Iterable<TOutput>\n {\n return Set.instanceOf(this, typeOrTypeCheck);\n }\n\n public static instanceOf<TInput, TOutput extends TInput>(set: Set<TInput>, typeOrTypeCheck: Type<TOutput> | ((value: TInput) => value is TOutput)): Iterable<TOutput>\n {\n return Iterable.instanceOf(set, typeOrTypeCheck);\n }\n\n public first(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>\n {\n return Set.first(this, condition);\n }\n\n public static first<T>(set: Set<T>, condition?: (value: T) => (boolean | SyncResult<boolean>)): SyncResult<T>\n {\n return Iterable.first(set, condition);\n }\n\n public last(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>\n {\n return Set.last(this, condition);\n }\n\n public static last<T>(set: Set<T>, condition?: (value: T) => (boolean | SyncResult<boolean>)): SyncResult<T>\n {\n return Iterable.last(set, condition);\n }\n\n public [Symbol.iterator](): JavascriptIterator<T>\n {\n return Set[Symbol.iterator](this);\n }\n\n public static [Symbol.iterator]<T>(set: Set<T>): JavascriptIterator<T>\n {\n return Iterable[Symbol.iterator](set);\n }\n\n public contains(value: T, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return Set.contains(this, value, equalFunctions);\n }\n\n public static contains<T>(set: Set<T>, value: T, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return Iterable.contains(set, value, equalFunctions);\n }\n}","import { Iterable } from \"./iterable\";\r\nimport { Iterator } from \"./iterator\";\r\nimport { isMap, Map, MapEntry } from \"./map\";\r\nimport { isSet, Set } from \"./set\";\r\nimport { escapeAndQuote, join } from \"./strings\";\r\nimport { isArray, isIterable, isNumber, isObject, isString } from \"./types\";\r\n\r\n/**\r\n * A collection of {@link ToStringFunction}s.\r\n */\r\nexport class ToStringFunctions\r\n{\r\n private readonly functions: ((value: unknown) => (string | undefined))[];\r\n\r\n private constructor()\r\n {\r\n this.functions = [];\r\n }\r\n\r\n public static create(): ToStringFunctions\r\n {\r\n return new ToStringFunctions();\r\n }\r\n\r\n private defaultToString(value: unknown): string\r\n {\r\n let result: string;\r\n if (isMap(value))\r\n {\r\n result = this.mapToString(value);\r\n }\r\n else if (isSet(value))\r\n {\r\n result = this.setToString(value);\r\n }\r\n else if (isIterable(value))\r\n {\r\n result = this.iterableToString(value);\r\n }\r\n else if (isNumber(value))\r\n {\r\n result = value.toString();\r\n }\r\n else if (value === undefined)\r\n {\r\n result = \"undefined\";\r\n }\r\n else if (value === null)\r\n {\r\n result = \"null\";\r\n }\r\n else if (isString(value))\r\n {\r\n result = escapeAndQuote(value);\r\n }\r\n else if (isArray(value))\r\n {\r\n result = `[${join(\",\", value.map(x => this.toString(x)))}]`;\r\n }\r\n else if (isObject(value))\r\n {\r\n result = `{${join(\",\", Object.entries(value).map(p => join(\":\", p.map(x => this.toString(x)))))}}`;\r\n }\r\n else\r\n {\r\n result = JSON.stringify(value);\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Get the {@link String} representation of the value with the registered\r\n * {@link ToStringFunction}s.\r\n * @param value The value to get the {@link String} representation of.\r\n */\r\n public toString(value: unknown): string\r\n {\r\n let result: string | undefined;\r\n for (const toStringFunction of this.functions)\r\n {\r\n result = toStringFunction(value);\r\n if (result !== undefined)\r\n {\r\n break;\r\n }\r\n }\r\n\r\n if (result === undefined)\r\n {\r\n result = this.defaultToString(value);\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public add(toStringFunction: (value: unknown) => (string | undefined)): this;\r\n public add<T>(typeCheckFunction: (value: unknown) => value is T, typedToStringFunction: (value: T) => string): this;\r\n add<T>(typeCheckFunctionOrToStringFunction: ((value: unknown) => (string | undefined)) | ((value: unknown) => value is T), typedToStringFunction?: (value: T) => string): this\r\n {\r\n let toStringFunction: (value: unknown) => (string | undefined);\r\n if (typedToStringFunction)\r\n {\r\n const typeCheckFunction = typeCheckFunctionOrToStringFunction as (value: unknown) => value is T;\r\n toStringFunction = (value: unknown) =>\r\n {\r\n let result: string | undefined;\r\n if (typeCheckFunction(value))\r\n {\r\n result = typedToStringFunction!(value);\r\n }\r\n return result;\r\n };\r\n }\r\n else\r\n {\r\n toStringFunction = typeCheckFunctionOrToStringFunction as (value: unknown) => (string | undefined);\r\n }\r\n\r\n this.functions.unshift(toStringFunction);\r\n\r\n return this;\r\n }\r\n\r\n private iterableToString(values: Iterable<unknown>): string\r\n {\r\n let result: string = \"\";\r\n result += \"[\";\r\n\r\n const iterator: Iterator<unknown> = values.iterate().start().await();\r\n if (iterator.hasCurrent())\r\n {\r\n result += this.toString(iterator.takeCurrent().await());\r\n while (iterator.hasCurrent())\r\n {\r\n result += \",\";\r\n result += this.toString(iterator.takeCurrent().await());\r\n }\r\n }\r\n\r\n result += \"]\";\r\n return result;\r\n }\r\n\r\n private mapToString(values: Map<unknown,unknown>): string\r\n {\r\n let result = \"\";\r\n result += \"{\";\r\n\r\n const iterator: Iterator<MapEntry<unknown,unknown>> = values.iterate();\r\n if (iterator.next().await())\r\n {\r\n let entry: MapEntry<unknown,unknown> = iterator.getCurrent();\r\n result += `${this.toString(entry.key)}:${this.toString(entry.value)}`;\r\n while (iterator.next().await())\r\n {\r\n result += \",\";\r\n\r\n entry = iterator.getCurrent();\r\n result += `${this.toString(entry.key)}:${this.toString(entry.value)}`;\r\n }\r\n }\r\n\r\n result += \"}\";\r\n return result;\r\n }\r\n\r\n private setToString(values: Set<unknown>): string\r\n {\r\n let result = \"\";\r\n result += \"{\";\r\n\r\n const iterator: Iterator<unknown> = values.iterate();\r\n if (iterator.next().await())\r\n {\r\n result += this.toString(iterator.getCurrent());\r\n while (iterator.next().await())\r\n {\r\n result += `,${this.toString(iterator.getCurrent())}`;\r\n }\r\n }\r\n\r\n result += \"}\";\r\n return result;\r\n }\r\n}","import { EqualFunctions } from \"./equalFunctions\";\r\nimport { Iterable } from \"./iterable\";\r\nimport { Iterator } from \"./iterator\";\r\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\r\nimport { JavascriptArrayList } from \"./javascriptArrayList\";\r\nimport { NotFoundError } from \"./notFoundError\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { SyncResult } from \"./syncResult\";\r\nimport { ToStringFunctions } from \"./toStringFunctions\";\r\nimport { isUndefinedOrNull, Type } from \"./types\";\r\n\r\nexport abstract class List<T> implements Iterable<T>\r\n{\r\n // List cannot extend Iterable because List is the default implementation of List.\r\n\r\n public static create<T>(values?: JavascriptIterable<T>): List<T>\r\n {\r\n return JavascriptArrayList.create(values);\r\n }\r\n\r\n /**\r\n * Add the provided value to the end of this {@link List}.\r\n * @param value The value to add.\r\n */\r\n public add(value: T): this\r\n {\r\n return List.add(this, value);\r\n }\r\n\r\n /**\r\n * Add the provided value to the provided {@link List}.\r\n * @param list The {@link List} to add the value to.\r\n * @param value The value to add.\r\n */\r\n public static add<T, TList extends List<T>>(list: TList, value: T): TList\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(list, \"list\");\r\n\r\n return list.insert(list.getCount().await(), value);\r\n }\r\n\r\n /**\r\n * Add the provided values to the end of this {@link List}.\r\n * @param values The values to add.\r\n */\r\n public addAll(values: JavascriptIterable<T>): this\r\n {\r\n return List.addAll(this, values);\r\n }\r\n\r\n /**\r\n * Add the provided values to the end of the provided {@link List}.\r\n * @param list The {@link List} to add the values to.\r\n * @param values The values to add.\r\n */\r\n public static addAll<T, TList extends List<T>>(list: TList, values: JavascriptIterable<T>): TList\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(list, \"list\");\r\n PreCondition.assertNotUndefinedAndNotNull(values, \"values\");\r\n\r\n return list.insertAll(list.getCount().await(), values);\r\n }\r\n\r\n /**\r\n * Insert the value at the index in this {@link List}.\r\n * @param index The index to insert the value at.\r\n * @param value The value to insert.\r\n */\r\n public abstract insert(index: number, value: T): this;\r\n\r\n /**\r\n * Insert the values at the index in this {@link List}.\r\n * @param index The index to insert the values at.\r\n * @param values The values to insert.\r\n */\r\n public insertAll(index: number, values: JavascriptIterable<T>): this\r\n {\r\n return List.insertAll(this, index, values);\r\n }\r\n\r\n /**\r\n * Insert the values at the index in this {@link List}.\r\n * @param list The list to insert the values into.\r\n * @param index The index to insert the values at.\r\n * @param values The values to insert.\r\n */\r\n public static insertAll<T, TList extends List<T>>(list: TList, index: number, values: JavascriptIterable<T>): TList\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(list, \"list\");\r\n PreCondition.assertInsertIndex(index, list.getCount().await(), \"index\");\r\n PreCondition.assertNotUndefinedAndNotNull(values, \"values\");\r\n\r\n let insertIndex: number = index;\r\n for (const value of values)\r\n {\r\n list.insert(insertIndex, value);\r\n insertIndex++;\r\n }\r\n return list;\r\n }\r\n\r\n /**\r\n * Attempt to remove the first instance of the provided value from this {@link List}. Return\r\n * whether the removed value.\r\n * @param value The value to remove.\r\n */\r\n public remove(value: T, equalFunctions?: EqualFunctions): SyncResult<T>\r\n {\r\n return List.remove(this, value, equalFunctions);\r\n }\r\n\r\n public static remove<T>(list: List<T>, value: T, equalFunctions?: EqualFunctions): SyncResult<T>\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(list, \"list\");\r\n\r\n if (isUndefinedOrNull(equalFunctions))\r\n {\r\n equalFunctions = EqualFunctions.create();\r\n }\r\n\r\n return SyncResult.create(() =>\r\n {\r\n let foundValue: boolean = false;\r\n let result: T | undefined;\r\n\r\n const count: number = list.getCount().await();\r\n for (let i = 0; i < count; i++)\r\n {\r\n const currentValue: T = list.get(i).await();\r\n if (equalFunctions.areEqual(value, currentValue).await())\r\n {\r\n result = currentValue;\r\n list.removeAt(i).await();\r\n foundValue = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!foundValue)\r\n {\r\n const toStringFunctions: ToStringFunctions = ToStringFunctions.create();\r\n throw new NotFoundError(`Could not find the value to remove: ${toStringFunctions.toString(value)}`);\r\n }\r\n\r\n return result!;\r\n });\r\n }\r\n\r\n /**\r\n * Remove and return the value in this {@link List} at the provided index.\r\n * @param index The index to remove a value from.\r\n */\r\n public abstract removeAt(index: number): SyncResult<T>;\r\n\r\n /**\r\n * Remove the first value in this {@link List}.\r\n */\r\n public removeFirst(): SyncResult<T>\r\n {\r\n return List.removeFirst(this);\r\n }\r\n\r\n public static removeFirst<T, TList extends List<T>>(list: TList): SyncResult<T>\r\n {\r\n PreCondition.assertNotEmpty(list, \"list\");\r\n\r\n return list.removeAt(0);\r\n }\r\n\r\n /**\r\n * Remove the last value in this {@link List}.\r\n */\r\n public removeLast(): SyncResult<T>\r\n {\r\n return List.removeLast(this);\r\n }\r\n\r\n public static removeLast<T, TList extends List<T>>(list: TList): SyncResult<T>\r\n {\r\n PreCondition.assertNotEmpty(list, \"list\");\r\n\r\n return list.removeAt(list.getCount().await() - 1);\r\n }\r\n\r\n public abstract set(index: number, value: T): this;\r\n\r\n public abstract iterate(): Iterator<T>\r\n\r\n public abstract get(index: number): SyncResult<T>;\r\n\r\n public toArray(): SyncResult<T[]>\r\n {\r\n return List.toArray(this);\r\n }\r\n\r\n public static toArray<T>(list: List<T>): SyncResult<T[]>\r\n {\r\n return Iterable.toArray(list);\r\n }\r\n\r\n public any(): SyncResult<boolean>\r\n {\r\n return List.any(this);\r\n }\r\n\r\n public static any<T>(list: List<T>): SyncResult<boolean>\r\n {\r\n return Iterable.any(list);\r\n }\r\n\r\n public getCount(): SyncResult<number>\r\n {\r\n return List.getCount(this);\r\n }\r\n\r\n public static getCount<T>(list: List<T>): SyncResult<number>\r\n {\r\n return Iterable.getCount(list);\r\n }\r\n\r\n public equals(right: JavascriptIterable<T>, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return List.equals(this, right, equalFunctions);\r\n }\r\n\r\n public static equals<T>(left: List<T>, right: JavascriptIterable<T>, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return Iterable.equals(left, right, equalFunctions);\r\n }\r\n\r\n public toString(toStringFunctions?: ToStringFunctions): string\r\n {\r\n return List.toString(this, toStringFunctions);\r\n }\r\n\r\n public static toString<T>(list: List<T>, toStringFunctions?: ToStringFunctions): string\r\n {\r\n return Iterable.toString(list, toStringFunctions);\r\n }\r\n\r\n public concatenate(...toConcatenate: JavascriptIterable<T>[]): Iterable<T>\r\n {\r\n return List.concatenate(this, ...toConcatenate);\r\n }\r\n\r\n public static concatenate<T>(list: List<T>, ...toConcatenate: JavascriptIterable<T>[]): Iterable<T>\r\n {\r\n return Iterable.concatenate(list, ...toConcatenate);\r\n }\r\n\r\n public map<TOutput>(mapping: (value: T) => (TOutput | SyncResult<TOutput>)): Iterable<TOutput>\r\n {\r\n return List.map<T, TOutput>(this, mapping);\r\n }\r\n\r\n public static map<TInput, TOutput>(list: List<TInput>, mapping: (value: TInput) => (TOutput | SyncResult<TOutput>)): Iterable<TOutput>\r\n {\r\n return Iterable.map<TInput, TOutput>(list, mapping);\r\n }\r\n\r\n public flatMap<TOutput>(mapping: (value: T) => JavascriptIterable<TOutput>): Iterable<TOutput>\r\n {\r\n return List.flatMap(this, mapping);\r\n }\r\n\r\n public static flatMap<TInput, TOutput>(list: List<TInput>, mapping: (value: TInput) => JavascriptIterable<TOutput>): Iterable<TOutput>\r\n {\r\n return Iterable.flatMap<TInput, TOutput>(list, mapping);\r\n }\r\n\r\n public where(condition: (value: T) => (boolean | SyncResult<boolean>)): Iterable<T>\r\n {\r\n return List.where(this, condition);\r\n }\r\n\r\n public static where<T>(list: List<T>, condition: (value: T) => (boolean | SyncResult<boolean>)): Iterable<T>\r\n {\r\n return Iterable.where(list, condition);\r\n }\r\n\r\n public instanceOf<TOutput extends T>(typeOrTypeCheck: Type<TOutput> | ((value: T) => value is TOutput)): Iterable<TOutput>\r\n {\r\n return List.instanceOf(this, typeOrTypeCheck);\r\n }\r\n\r\n public static instanceOf<TInput, TOutput extends TInput>(list: List<TInput>, typeOrTypeCheck: Type<TOutput> | ((value: TInput) => value is TOutput)): Iterable<TOutput>\r\n {\r\n return Iterable.instanceOf(list, typeOrTypeCheck);\r\n }\r\n\r\n public first(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>\r\n {\r\n return List.first(this, condition);\r\n }\r\n\r\n public static first<T>(list: List<T>, condition?: (value: T) => (boolean | SyncResult<boolean>)): SyncResult<T>\r\n {\r\n return condition ? Iterable.first(list, condition) : list.get(0);\r\n }\r\n\r\n public last(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>\r\n {\r\n return List.last(this, condition);\r\n }\r\n\r\n public static last<T>(list: List<T>, condition?: (value: T) => (boolean | SyncResult<boolean>)): SyncResult<T>\r\n {\r\n return condition ? Iterable.last(list, condition) : list.get(list.getCount().await() - 1);\r\n }\r\n\r\n public [Symbol.iterator](): JavascriptIterator<T>\r\n {\r\n return List[Symbol.iterator](this);\r\n }\r\n\r\n public static [Symbol.iterator]<T>(list: List<T>): JavascriptIterator<T>\r\n {\r\n return Iterable[Symbol.iterator](list);\r\n }\r\n\r\n public contains(value: T, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return List.contains(this, value, equalFunctions);\r\n }\r\n\r\n public static contains<T>(list: List<T>, value: T, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return Iterable.contains(list, value, equalFunctions);\r\n }\r\n}","import { Iterator } from \"./iterator\";\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\nimport { List } from \"./list\";\nimport { PreCondition } from \"./preCondition\";\nimport { SyncResult } from \"./syncResult\";\nimport { Type } from \"./types\";\n\nexport class ConcatenateIterator<T> implements Iterator<T>\n{\n private readonly innerIterators: Iterator<Iterator<T>>;\n\n private constructor(innerIterators: Iterator<Iterator<T>>)\n {\n PreCondition.assertNotUndefinedAndNotNull(innerIterators, \"innerIterators\");\n\n this.innerIterators = innerIterators;\n }\n\n public static create<T>(...toConcatenate: JavascriptIterable<T>[]): ConcatenateIterator<T>\n {\n PreCondition.assertNotUndefinedAndNotNull(toConcatenate, \"toConcatenate\");\n\n const innerIterators: List<Iterator<T>> = List.create();\n for (const value of toConcatenate)\n {\n innerIterators.add(Iterator.create(value));\n }\n return new ConcatenateIterator<T>(innerIterators.iterate());\n }\n\n public next(): SyncResult<boolean>\n {\n return SyncResult.create(() =>\n {\n let innerIteratorAtBeginning: boolean = false;\n if (!this.innerIterators.hasStarted())\n {\n this.innerIterators.next().await();\n innerIteratorAtBeginning = true;\n }\n\n while (this.innerIterators.hasCurrent())\n {\n const innerIterator: Iterator<T> = this.innerIterators.getCurrent();\n if (innerIteratorAtBeginning)\n {\n innerIterator.start().await();\n }\n else\n {\n innerIterator.next().await();\n }\n\n if (innerIterator.hasCurrent())\n {\n break;\n }\n else\n {\n this.innerIterators.next().await();\n innerIteratorAtBeginning = true;\n }\n }\n\n return this.hasCurrent();\n });\n }\n\n public hasStarted(): boolean\n {\n return this.innerIterators.hasStarted();\n }\n\n public hasCurrent(): boolean\n {\n return this.innerIterators.hasCurrent();\n }\n\n public getCurrent(): T\n {\n PreCondition.assertTrue(this.hasCurrent(), \"this.hasCurrent()\");\n\n return this.innerIterators.getCurrent().getCurrent();\n }\n\n public start(): SyncResult<this>\n {\n return Iterator.start<T, this>(this);\n }\n\n public takeCurrent(): SyncResult<T>\n {\n return Iterator.takeCurrent(this);\n }\n\n public any(): SyncResult<boolean>\n {\n return Iterator.any(this);\n }\n\n public getCount(): SyncResult<number>\n {\n return Iterator.getCount(this);\n }\n\n public toArray(): SyncResult<T[]>\n {\n return Iterator.toArray(this);\n }\n\n public concatenate(...toConcatenate: JavascriptIterable<T>[]): Iterator<T>\n {\n return Iterator.concatenate(this, ...toConcatenate);\n }\n\n public where(condition: (value: T) => (boolean | SyncResult<boolean>)): Iterator<T>\n {\n return Iterator.where(this, condition);\n }\n\n public map<TOutput>(mapping: (value: T) => TOutput | SyncResult<TOutput>): Iterator<TOutput>\n {\n return Iterator.map(this, mapping);\n }\n\n public flatMap<TOutput>(mapping: (value: T) => JavascriptIterable<TOutput>): Iterator<TOutput>\n {\n return Iterator.flatMap(this, mapping);\n }\n\n public whereInstanceOf<U extends T>(typeCheck: (value: T) => value is U): Iterator<U>\n {\n return Iterator.whereInstanceOf(this, typeCheck);\n }\n\n public whereInstanceOfType<U extends T>(type: Type<U>): Iterator<U>\n {\n return Iterator.whereInstanceOfType(this, type);\n }\n\n public first(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>\n {\n return Iterator.first(this, condition);\n }\n\n public last(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>\n {\n return Iterator.last(this, condition);\n }\n\n public take(maximumToTake: number): Iterator<T>\n {\n return Iterator.take(this, maximumToTake);\n }\n\n public skip(maximumToSkip: number): Iterator<T>\n {\n return Iterator.skip(this, maximumToSkip);\n }\n\n public [Symbol.iterator](): JavascriptIterator<T>\n {\n return Iterator[Symbol.iterator](this);\n }\n}","import { ConcatenateIterator } from \"./concatenateIterator\";\nimport { EqualFunctions } from \"./equalFunctions\";\nimport { Iterable } from \"./iterable\";\nimport { Iterator } from \"./iterator\";\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\nimport { List } from \"./list\";\nimport { PreCondition } from \"./preCondition\";\nimport { SyncResult } from \"./syncResult\";\nimport { ToStringFunctions } from \"./toStringFunctions\";\nimport { Type } from \"./types\";\n\nexport class ConcatenateIterable<T> implements Iterable<T>\n{\n private readonly innerIterables: Iterable<Iterable<T>>;\n\n private constructor(innerIterables: Iterable<Iterable<T>>)\n {\n PreCondition.assertNotUndefinedAndNotNull(innerIterables, \"innerIterables\");\n\n this.innerIterables = innerIterables;\n }\n\n public static create<T>(innerIterable: Iterable<T>, ...toConcatenate: JavascriptIterable<T>[]): ConcatenateIterable<T>\n {\n PreCondition.assertNotUndefinedAndNotNull(innerIterable, \"innerIterable\");\n PreCondition.assertNotUndefinedAndNotNull(toConcatenate, \"toConcatenate\");\n\n const innerIterables: List<Iterable<T>> = List.create();\n innerIterables.add(innerIterable);\n for (const value of toConcatenate)\n {\n innerIterables.add(Iterable.create(value));\n }\n return new ConcatenateIterable<T>(innerIterables);\n }\n\n public iterate(): Iterator<T>\n {\n return ConcatenateIterator.create<T>(...this.innerIterables);\n }\n\n public toArray(): SyncResult<T[]>\n {\n return Iterable.toArray(this);\n }\n\n public any(): SyncResult<boolean>\n {\n return Iterable.any(this);\n }\n\n public getCount(): SyncResult<number>\n {\n return SyncResult.create(() =>\n {\n let result: number = 0;\n for (const innerIterable of this.innerIterables)\n {\n result += innerIterable.getCount().await();\n }\n return result;\n });\n }\n\n public equals(right: JavascriptIterable<T>, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return Iterable.equals(this, right, equalFunctions);\n }\n\n public toString(toStringFunctions?: ToStringFunctions): string\n {\n return Iterable.toString(this, toStringFunctions);\n }\n\n public concatenate(...toConcatenate: JavascriptIterable<T>[]): Iterable<T>\n {\n return Iterable.concatenate(this, ...toConcatenate);\n }\n\n public map<TOutput>(mapping: (value: T) => TOutput | SyncResult<TOutput>): Iterable<TOutput>\n {\n return Iterable.map(this, mapping);\n }\n\n public flatMap<TOutput>(mapping: (value: T) => JavascriptIterable<TOutput>): Iterable<TOutput>\n {\n return Iterable.flatMap(this, mapping);\n }\n\n public where(condition: (value: T) => (boolean | SyncResult<boolean>)): Iterable<T>\n {\n return Iterable.where(this, condition);\n }\n\n public instanceOf<TOutput extends T>(typeOrTypeCheck: Type<TOutput> | ((value: T) => value is TOutput)): Iterable<TOutput>\n {\n return Iterable.instanceOf(this, typeOrTypeCheck);\n }\n\n public first(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>\n {\n return Iterable.first(this, condition);\n }\n\n public last(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>\n {\n return Iterable.last(this, condition);\n }\n\n public contains(value: T, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return Iterable.contains(this, value, equalFunctions);\n }\n\n public [Symbol.iterator](): JavascriptIterator<T>\n {\n return Iterable[Symbol.iterator](this);\n }\n}","import { EqualFunctions } from \"./equalFunctions\";\nimport { Iterable } from \"./iterable\";\nimport { Iterator } from \"./iterator\";\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\nimport { PreCondition } from \"./preCondition\";\nimport { SyncResult } from \"./syncResult\";\nimport { ToStringFunctions } from \"./toStringFunctions\";\nimport { Type } from \"./types\";\n\nexport class FlatMapIterable<TInput,TOutput> implements Iterable<TOutput>\n{\n private readonly innerIterable: Iterable<TInput>;\n private readonly mapping: (value: TInput) => JavascriptIterable<TOutput>;\n\n private constructor(innerIterable: Iterable<TInput>, mapping: (value: TInput) => JavascriptIterable<TOutput>)\n {\n\n PreCondition.assertNotUndefinedAndNotNull(innerIterable, \"innerIterable\");\n PreCondition.assertNotUndefinedAndNotNull(mapping, \"mapping\");\n\n this.innerIterable = innerIterable;\n this.mapping = mapping;\n }\n\n public static create<TInput,TOutput>(innerIterable: Iterable<TInput>, mapping: (value: TInput) => JavascriptIterable<TOutput>): FlatMapIterable<TInput,TOutput>\n {\n return new FlatMapIterable(innerIterable, mapping);\n }\n\n public iterate(): Iterator<TOutput>\n {\n return this.innerIterable.iterate().flatMap(this.mapping);\n }\n\n public toArray(): SyncResult<TOutput[]>\n {\n return Iterable.toArray<TOutput>(this);\n }\n\n public any(): SyncResult<boolean>\n {\n return Iterable.any(this);\n }\n\n public getCount(): SyncResult<number>\n {\n return Iterable.getCount(this);\n }\n\n public equals(right: JavascriptIterable<TOutput>, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return Iterable.equals(this, right, equalFunctions);\n }\n\n public toString(toStringFunctions?: ToStringFunctions): string\n {\n return Iterable.toString(this, toStringFunctions);\n }\n\n public concatenate(...toConcatenate: JavascriptIterable<TOutput>[]): Iterable<TOutput>\n {\n return Iterable.concatenate<TOutput>(this, ...toConcatenate);\n }\n\n public map<TOutput2>(mapping: (value: TOutput) => TOutput2 | SyncResult<TOutput2>): Iterable<TOutput2>\n {\n return Iterable.map(this, mapping);\n }\n\n public flatMap<TOutput2>(mapping: (value: TOutput) => JavascriptIterable<TOutput2>): Iterable<TOutput2>\n {\n return Iterable.flatMap(this, mapping);\n }\n\n public where(condition: (value: TOutput) => (boolean | SyncResult<boolean>)): Iterable<TOutput>\n {\n return Iterable.where(this, condition);\n }\n\n public instanceOf<TOutput2 extends TOutput>(typeOrTypeCheck: Type<TOutput2> | ((value: TOutput2) => value is TOutput2)): Iterable<TOutput2>\n {\n return Iterable.instanceOf<TOutput,TOutput2>(this, typeOrTypeCheck);\n }\n\n public first(condition?: ((value: TOutput) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<TOutput>\n {\n return Iterable.first(this, condition);\n }\n\n public last(condition?: ((value: TOutput) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<TOutput>\n {\n return Iterable.last(this, condition);\n }\n\n public contains(value: TOutput, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return Iterable.contains(this, value, equalFunctions);\n }\n\n public [Symbol.iterator](): JavascriptIterator<TOutput>\n {\n return Iterable[Symbol.iterator](this);\n }\n}","import { EqualFunctions } from \"./equalFunctions\";\r\nimport { Iterable } from \"./iterable\";\r\nimport { Iterator } from \"./iterator\";\r\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { SyncResult } from \"./syncResult\";\r\nimport { Type } from \"./types\";\r\n\r\n/**\r\n * An {@link Iterable} that converts {@link TInput} values to {@link TOutput} values.\r\n */\r\nexport class MapIterable<TInput,TOutput> implements Iterable<TOutput>\r\n{\r\n private readonly innerIterable: Iterable<TInput>;\r\n private readonly mapping: (value: TInput) => (TOutput | SyncResult<TOutput>);\r\n\r\n protected constructor(innerIterable: Iterable<TInput>, mapping: (value: TInput) => (TOutput | SyncResult<TOutput>))\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(innerIterable, \"innerIterable\");\r\n PreCondition.assertNotUndefinedAndNotNull(mapping, \"mapping\");\r\n\r\n this.innerIterable = innerIterable;\r\n this.mapping = mapping;\r\n }\r\n\r\n public static create<TInput,TOutput>(innerIterable: Iterable<TInput>, mapping: (value: TInput) => (TOutput | SyncResult<TOutput>)): MapIterable<TInput,TOutput>\r\n {\r\n return new MapIterable<TInput,TOutput>(innerIterable, mapping);\r\n }\r\n\r\n public iterate(): Iterator<TOutput>\r\n {\r\n return this.innerIterable.iterate().map(this.mapping);\r\n }\r\n\r\n public toArray(): SyncResult<TOutput[]>\r\n {\r\n return Iterable.toArray(this);\r\n }\r\n\r\n public equals(right: Iterable<TOutput>, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return Iterable.equals(this, right, equalFunctions);\r\n }\r\n\r\n public toString(): string\r\n {\r\n return Iterable.toString(this);\r\n }\r\n\r\n public concatenate(...toConcatenate: JavascriptIterable<TOutput>[]): Iterable<TOutput>\r\n {\r\n return Iterable.concatenate(this, ...toConcatenate);\r\n }\r\n\r\n public map<TOutput2>(mapping: (value: TOutput) => (TOutput2 | SyncResult<TOutput2>)): Iterable<TOutput2>\r\n {\r\n return Iterable.map(this, mapping);\r\n }\r\n\r\n public flatMap<TOutput2>(mapping: (value: TOutput) => JavascriptIterable<TOutput2>): Iterable<TOutput2>\r\n {\r\n return Iterable.flatMap(this, mapping);\r\n }\r\n\r\n public where(condition: (value: TOutput) => boolean): Iterable<TOutput>\r\n {\r\n return Iterable.where(this, condition);\r\n }\r\n\r\n public instanceOf<TOutput2 extends TOutput>(typeOrTypeCheck: Type<TOutput2> | ((value: TOutput) => value is TOutput2)): Iterable<TOutput2>\r\n {\r\n return Iterable.instanceOf(this, typeOrTypeCheck);\r\n }\r\n\r\n public [Symbol.iterator](): JavascriptIterator<TOutput>\r\n {\r\n return Iterable[Symbol.iterator](this);\r\n }\r\n\r\n public any(): SyncResult<boolean>\r\n {\r\n return this.innerIterable.any();\r\n }\r\n\r\n public getCount(): SyncResult<number>\r\n {\r\n return this.innerIterable.getCount();\r\n }\r\n\r\n public first(): SyncResult<TOutput>\r\n {\r\n return Iterable.first(this);\r\n }\r\n\r\n public last(): SyncResult<TOutput>\r\n {\r\n return Iterable.last(this);\r\n }\r\n\r\n public contains(value: TOutput, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return Iterable.contains(this, value, equalFunctions);\r\n }\r\n}","import { EqualFunctions } from \"./equalFunctions\";\r\nimport { Iterable } from \"./iterable\";\r\nimport { Iterator } from \"./iterator\";\r\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { SyncResult } from \"./syncResult\";\r\nimport { ToStringFunctions } from \"./toStringFunctions\";\r\nimport { Type } from \"./types\";\r\n\r\n/**\r\n * An {@link Iterable} that only returns values that match a condition.\r\n */\r\nexport class WhereIterable<T> implements Iterable<T>\r\n{\r\n // WhereIterable cannot extend Iterable because their create() functions are different.\r\n\r\n private readonly innerIterable: Iterable<T>;\r\n private readonly condition: (value: T) => (boolean | SyncResult<boolean>);\r\n\r\n private constructor(innerIterable: Iterable<T>, condition: (value: T) => (boolean | SyncResult<boolean>))\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(innerIterable, \"innerIterable\");\r\n PreCondition.assertNotUndefinedAndNotNull(condition, \"condition\");\r\n\r\n this.innerIterable = innerIterable;\r\n this.condition = condition;\r\n }\r\n\r\n public static create<T>(innerIterable: Iterable<T>, condition: (value: T) => (boolean | SyncResult<boolean>)): WhereIterable<T>\r\n {\r\n return new WhereIterable(innerIterable, condition);\r\n }\r\n\r\n public iterate(): Iterator<T>\r\n {\r\n return this.innerIterable.iterate().where(this.condition);\r\n }\r\n\r\n public toArray(): SyncResult<T[]>\r\n {\r\n return Iterable.toArray(this);\r\n }\r\n\r\n public any(): SyncResult<boolean>\r\n {\r\n return Iterable.any(this);\r\n }\r\n\r\n public getCount(): SyncResult<number>\r\n {\r\n return Iterable.getCount(this);\r\n }\r\n\r\n public equals(right: JavascriptIterable<T>, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return Iterable.equals(this, right, equalFunctions);\r\n }\r\n\r\n public toString(toStringFunctions?: ToStringFunctions): string\r\n {\r\n return Iterable.toString(this, toStringFunctions);\r\n }\r\n\r\n public concatenate(...toConcatenate: JavascriptIterable<T>[]): Iterable<T>\r\n {\r\n return Iterable.concatenate(this, ...toConcatenate);\r\n }\r\n\r\n public map<TOutput>(mapping: (value: T) => (TOutput | SyncResult<TOutput>)): Iterable<TOutput>\r\n {\r\n return Iterable.map(this, mapping);\r\n }\r\n\r\n public flatMap<TOutput>(mapping: (value: T) => JavascriptIterable<TOutput>): Iterable<TOutput>\r\n {\r\n return Iterable.flatMap(this, mapping);\r\n }\r\n\r\n public where(condition: (value: T) => (boolean | SyncResult<boolean>)): Iterable<T>\r\n {\r\n return Iterable.where(this, condition);\r\n }\r\n\r\n public instanceOf<TOutput extends T>(typeOrTypeCheck: Type<TOutput> | ((value: T) => value is TOutput)): Iterable<TOutput>\r\n {\r\n return Iterable.instanceOf(this, typeOrTypeCheck);\r\n }\r\n\r\n public first(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>\r\n {\r\n return Iterable.first(this, condition);\r\n }\r\n\r\n public last(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>\r\n {\r\n return Iterable.last(this, condition);\r\n }\r\n\r\n public [Symbol.iterator](): JavascriptIterator<T>\r\n {\r\n return Iterable[Symbol.iterator](this);\r\n }\r\n\r\n public contains(value: T, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return Iterable.contains(this, value, equalFunctions);\r\n }\r\n}","import { Comparable } from \"./comparable\";\r\nimport { Comparer } from \"./comparer\";\r\nimport { ConcatenateIterable } from \"./concatenateIterable\";\r\nimport { EqualFunctions } from \"./equalFunctions\";\r\nimport { FlatMapIterable } from \"./flatMapIterable\";\r\nimport { Iterator } from \"./iterator\";\r\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\r\nimport { List } from \"./list\";\r\nimport { MapIterable } from \"./mapIterable\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { SyncResult } from \"./syncResult\";\r\nimport { ToStringFunctions } from \"./toStringFunctions\";\r\nimport { instanceOf, isIterable, isUndefinedOrNull, Type } from \"./types\";\r\nimport { WhereIterable } from \"./whereIterable\";\r\n\r\n/**\r\n * An object that can be iterated over.\r\n */\r\nexport abstract class Iterable<T> implements JavascriptIterable<T>\r\n{\r\n public static create<T>(values?: JavascriptIterable<T>): Iterable<T>\r\n {\r\n return List.create(values);\r\n }\r\n\r\n /**\r\n * Iterate over the values in this {@link Iterable}.\r\n */\r\n public abstract iterate(): Iterator<T>;\r\n\r\n public [Symbol.iterator](): JavascriptIterator<T>\r\n {\r\n return Iterable[Symbol.iterator](this);\r\n }\r\n\r\n public static [Symbol.iterator]<T>(iterable: Iterable<T>): JavascriptIterator<T>\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(iterable, \"iterable\");\r\n\r\n return iterable.iterate()[Symbol.iterator]();\r\n }\r\n\r\n /**\r\n * Get all of the values in this {@link Iterable} in an {@link Array}.\r\n */\r\n public toArray(): SyncResult<T[]>\r\n {\r\n return Iterable.toArray(this);\r\n }\r\n\r\n /**\r\n * Get all of the values in the provided {@link Iterable} in an {@link Array}.\r\n */\r\n public static toArray<T>(iterable: Iterable<T>): SyncResult<T[]>\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(iterable, \"iterable\");\r\n\r\n return iterable.iterate().toArray();\r\n }\r\n\r\n /**\r\n * Get whether this {@link Iterable} contains any values.\r\n */\r\n public any(): SyncResult<boolean>\r\n {\r\n return Iterable.any(this);\r\n }\r\n\r\n /**\r\n * Get whether the provided {@link JavascriptIterable} contains any values.\r\n */\r\n public static any<T>(iterable: JavascriptIterable<T>): SyncResult<boolean>\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(iterable, \"iterable\");\r\n\r\n return Iterator.create(iterable).any();\r\n }\r\n\r\n /**\r\n * Get the number of values in this {@link Iterable}.\r\n */\r\n public getCount(): SyncResult<number>\r\n {\r\n return Iterable.getCount(this);\r\n }\r\n\r\n /**\r\n * Get the number of values in the provided {@link Iterable}.\r\n */\r\n public static getCount<T>(iterable: Iterable<T>): SyncResult<number>\r\n {\r\n return iterable.iterate().getCount();\r\n }\r\n\r\n /**\r\n * Get whether this {@link Iterable} is equal to the provided {@link Iterable}.\r\n * @param right The {@link Iterable} to compare against this {@link Iterable}.\r\n * @param equalFunctions The optional {@link EqualFunctions} to use to determine if the two\r\n * {@link Iterable}s are equal.\r\n */\r\n public equals(right: JavascriptIterable<T>, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return Iterable.equals(this, right, equalFunctions);\r\n }\r\n\r\n public static equals<T>(left: JavascriptIterable<T>, right: JavascriptIterable<T>, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return SyncResult.create(() =>\r\n {\r\n if (isUndefinedOrNull(equalFunctions))\r\n {\r\n equalFunctions = EqualFunctions.create();\r\n }\r\n\r\n let result: boolean | undefined = Comparer.equalSameUndefinedNull(left, right);\r\n if (result === undefined)\r\n {\r\n result = true;\r\n\r\n const leftIterator: Iterator<T> = Iterator.create(left).start().await();\r\n const rightIterator: Iterator<T> = Iterator.create(right).start().await();\r\n while (leftIterator.hasCurrent() && rightIterator.hasCurrent())\r\n {\r\n result = equalFunctions.areEqual(leftIterator.getCurrent(), rightIterator.getCurrent()).await();\r\n if (result === false)\r\n {\r\n break;\r\n }\r\n else\r\n {\r\n leftIterator.next().await();\r\n rightIterator.next().await();\r\n }\r\n }\r\n if (result)\r\n {\r\n result = (leftIterator.hasCurrent() === rightIterator.hasCurrent());\r\n }\r\n }\r\n return result;\r\n });\r\n }\r\n\r\n /**\r\n * Get the {@link String} representation of this {@link Iterable}.\r\n */\r\n public toString(toStringFunctions?: ToStringFunctions): string\r\n {\r\n return Iterable.toString(this, toStringFunctions);\r\n }\r\n\r\n /**\r\n * Get the {@link String} representation of the provided {@link Iterable}.\r\n */\r\n public static toString<T>(iterable: Iterable<T>, toStringFunctions?: ToStringFunctions): string\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(iterable, \"iterable\");\r\n\r\n if (isUndefinedOrNull(toStringFunctions))\r\n {\r\n toStringFunctions = ToStringFunctions.create();\r\n }\r\n return toStringFunctions.toString(iterable);\r\n }\r\n\r\n public concatenate(...toConcatenate: JavascriptIterable<T>[]): Iterable<T>\r\n {\r\n return Iterable.concatenate(this, ...toConcatenate);\r\n }\r\n\r\n public static concatenate<T>(iterable: Iterable<T>, ...toConcatenate: JavascriptIterable<T>[]): Iterable<T>\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(iterable, \"iterator\");\r\n PreCondition.assertNotUndefinedAndNotNull(toConcatenate, \"toConcatenate\");\r\n\r\n return ConcatenateIterable.create(iterable, ...toConcatenate);\r\n }\r\n\r\n /**\r\n * Get a {@link MapIterable} that maps all of the {@link T} values in this {@link Iterable} to\r\n * {@link TOutput} values.\r\n * @param mapping The mapping function to use to convert values of type {@link T} to\r\n * {@link TOutput}.\r\n */\r\n public map<TOutput>(mapping: (value: T) => (TOutput | SyncResult<TOutput>)): Iterable<TOutput>\r\n {\r\n return Iterable.map(this, mapping);\r\n }\r\n\r\n /**\r\n * Get a {@link MapIterable} that maps all of the {@link T} values in the provided\r\n * {@link Iterable} to {@link TOutput} values.\r\n * @param mapping The mapping function to use to convert values of type {@link T} to\r\n * {@link TOutput}.\r\n */\r\n public static map<TInput, TOutput>(iterable: Iterable<TInput>, mapping: (value: TInput) => (TOutput | SyncResult<TOutput>)): Iterable<TOutput>\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(iterable, \"iterable\");\r\n PreCondition.assertNotUndefinedAndNotNull(mapping, \"mapping\");\r\n\r\n return MapIterable.create(iterable, mapping);\r\n }\r\n\r\n public flatMap<TOutput>(mapping: (value: T) => JavascriptIterable<TOutput>): Iterable<TOutput>\r\n {\r\n return Iterable.flatMap(this, mapping);\r\n }\r\n\r\n public static flatMap<T,TOutput>(iterable: Iterable<T>, mapping: (value: T) => JavascriptIterable<TOutput>): Iterable<TOutput>\r\n {\r\n return FlatMapIterable.create(iterable, mapping);\r\n }\r\n\r\n /**\r\n * Get an {@link Iterable} that contains values from this {@link Iterable} that match the\r\n * provided condition.\r\n * @param condition The condition to run against each of the values in this {@link Iterable}.\r\n */\r\n public where(condition: (value: T) => (boolean | SyncResult<boolean>)): Iterable<T>\r\n {\r\n return Iterable.where(this, condition);\r\n }\r\n\r\n /**\r\n * Get an {@link Iterable} that contains values from the provided {@link Iterable} that match\r\n * the provided condition.\r\n * @param iterable The {@link Iterable} to get values from.\r\n * @param condition The condition that the values must match to be contained in the new\r\n * {@link Iterable}.\r\n */\r\n public static where<T>(iterable: JavascriptIterable<T>, condition: (value: T) => (boolean | SyncResult<boolean>)): Iterable<T>\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(iterable, \"iterable\");\r\n PreCondition.assertNotUndefinedAndNotNull(condition, \"condition\");\r\n\r\n if (!isIterable(iterable))\r\n {\r\n iterable = Iterable.create(iterable);\r\n }\r\n return WhereIterable.create(iterable as Iterable<T>, condition);\r\n }\r\n\r\n /**\r\n * Get an {@link Iterable} that contains values from this {@link Iterable} that match the\r\n * provided {@link Type} or type check function.\r\n * @param typeOrTypeCheck The {@link Type} or type check function that returned values must\r\n * match.\r\n */\r\n public instanceOf<TOutput extends T>(typeOrTypeCheck: Type<TOutput> | ((value: T) => value is TOutput)): Iterable<TOutput>\r\n {\r\n return Iterable.instanceOf(this, typeOrTypeCheck);\r\n }\r\n\r\n /**\r\n * Get an {@link Iterable} that contains values from the provided {@link Iterable} that match\r\n * the provided {@link Type} or type check function.\r\n * @param iterable The {@link Iterable} to get values from.\r\n * @param typeOrTypeCheck The {@link Type} or type check function that returned values must\r\n * match.\r\n */\r\n public static instanceOf<TInput, TOutput extends TInput>(iterable: JavascriptIterable<TInput>, typeOrTypeCheck: Type<TOutput> | ((value: TInput) => value is TOutput)): Iterable<TOutput>\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(iterable, \"iterable\");\r\n PreCondition.assertNotUndefinedAndNotNull(typeOrTypeCheck, \"typeOrTypeCheck\");\r\n\r\n return Iterable.where(iterable, (value: TInput) => instanceOf(value, typeOrTypeCheck))\r\n .map((value: TInput) => (value as unknown) as TOutput);\r\n }\r\n\r\n /**\r\n * Get the first value in this {@link Iterable}.\r\n */\r\n public first(condition?: (value: T) => (boolean | SyncResult<boolean>)): SyncResult<T>\r\n {\r\n return Iterable.first(this, condition);\r\n }\r\n\r\n /**\r\n * Get the first value from the provided {@link JavascriptIterable}.\r\n * @param iterable The {@link JavascriptIterable} to get the first value from.\r\n */\r\n public static first<T>(iterable: JavascriptIterable<T>, condition?: (value: T) => (boolean | SyncResult<boolean>)): SyncResult<T>\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(iterable, \"iterable\");\r\n\r\n return Iterator.create(iterable).first(condition);\r\n }\r\n\r\n /**\r\n * Get the last value in this {@link Iterable}.\r\n */\r\n public last(condition?: (value: T) => (boolean | SyncResult<boolean>)): SyncResult<T>\r\n {\r\n return Iterable.last(this, condition);\r\n }\r\n\r\n /**\r\n * Get the last value from the provided {@link JavascriptIterable}.\r\n * @param iterable The {@link JavascriptIterable} to get the last value from.\r\n */\r\n public static last<T>(iterable: JavascriptIterable<T>, condition?: (value: T) => (boolean | SyncResult<boolean>)): SyncResult<T>\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(iterable, \"iterable\");\r\n\r\n return Iterator.create(iterable).last(condition);\r\n }\r\n\r\n /**\r\n * Find the maximum value in the provided {@link Iterable}.\r\n * @param iterable The values to find the maximum of.\r\n */\r\n public static findMaximum<T extends Comparable<T>>(iterable: JavascriptIterable<T> | Iterable<T>): SyncResult<T>\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(iterable, \"iterable\");\r\n\r\n return Iterator.findMaximum(Iterator.create(iterable));\r\n }\r\n\r\n public contains(value: T, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return Iterable.contains(this, value, equalFunctions);\r\n }\r\n\r\n public static contains<T>(iterable: Iterable<T>, value: T, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return SyncResult.create(() =>\r\n {\r\n if (!equalFunctions)\r\n {\r\n equalFunctions = EqualFunctions.create();\r\n }\r\n\r\n let result: boolean = false;\r\n for (const iterableValue of iterable)\r\n {\r\n if (equalFunctions.areEqual(value, iterableValue).await())\r\n {\r\n result = true;\r\n break;\r\n }\r\n }\r\n return result;\r\n });\r\n }\r\n}","import { Comparer } from \"./comparer\";\r\nimport { Iterable } from \"./iterable\";\r\nimport { isMap, Map } from \"./map\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { SyncResult } from \"./syncResult\";\r\nimport { getPropertyNames, hasProperty, isBoolean, isJavascriptIterable, isObject, isString } from \"./types\";\r\n\r\n/**\r\n * A collection of {@link Function}s that can be used to determine if two values are equal.\r\n */\r\nexport class EqualFunctions\r\n{\r\n private readonly equalFunctions: ((left: unknown, right: unknown) => (boolean | SyncResult<boolean> | undefined))[];\r\n\r\n private constructor()\r\n {\r\n this.equalFunctions = [];\r\n }\r\n\r\n public static create(): EqualFunctions\r\n {\r\n return new EqualFunctions();\r\n }\r\n\r\n private defaultEqualFunction(left: unknown, right: unknown): SyncResult<boolean>\r\n {\r\n return SyncResult.create(() =>\r\n {\r\n let result: boolean | undefined = Comparer.equalSameUndefinedNull(left, right);\r\n if (result === undefined)\r\n {\r\n result = false;\r\n\r\n if (isMap(left))\r\n {\r\n if (isMap(right))\r\n {\r\n result = Map.equals(left, right, this).await();\r\n }\r\n }\r\n else if (isJavascriptIterable(left) && !isString(left))\r\n {\r\n if (isJavascriptIterable(right) && !isString(right) && !isMap(right))\r\n {\r\n result = Iterable.equals(left, right, this).await();\r\n }\r\n }\r\n else if (isObject(left))\r\n {\r\n if (isObject(right))\r\n {\r\n result = true;\r\n\r\n for (const leftPropertyName of getPropertyNames(left))\r\n {\r\n if (!hasProperty(left, leftPropertyName) || !hasProperty(right, leftPropertyName))\r\n {\r\n result = false;\r\n break;\r\n }\r\n else\r\n {\r\n result = this.areEqual(left[leftPropertyName], right[leftPropertyName]).await();\r\n }\r\n }\r\n\r\n if (result)\r\n {\r\n for (const rightPropertyName of getPropertyNames(right))\r\n {\r\n if (!hasProperty(left, rightPropertyName) || !hasProperty(right, rightPropertyName))\r\n {\r\n result = false;\r\n break;\r\n }\r\n else\r\n {\r\n result = this.areEqual(left[rightPropertyName], right[rightPropertyName]).await();\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return result;\r\n });\r\n }\r\n\r\n /**\r\n * Get whether the provided values are equal based on the registered equal {@link Function}s.\r\n * @param left The left value in the comparison.\r\n * @param right The right value in the comparison.\r\n */\r\n public areEqual(left: unknown, right: unknown): SyncResult<boolean>\r\n {\r\n return SyncResult.create(() =>\r\n {\r\n let result: boolean | SyncResult<boolean> | undefined;\r\n for (const equalFunction of this.equalFunctions)\r\n {\r\n result = equalFunction(left, right);\r\n if (result !== undefined)\r\n {\r\n break;\r\n }\r\n }\r\n if (result === undefined)\r\n {\r\n result = this.defaultEqualFunction(left, right);\r\n }\r\n return isBoolean(result) ? result : result.await();\r\n });\r\n }\r\n\r\n public add(equalFunction: (left: unknown, right: unknown) => (boolean | undefined)): this\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(equalFunction, \"equalFunction\");\r\n\r\n this.equalFunctions.unshift(equalFunction);\r\n\r\n return this;\r\n }\r\n}","import { AssertMessageParameters } from \"./assertMessageParameters\";\r\nimport { Bytes } from \"./bytes\";\r\nimport { Comparer } from \"./comparer\";\r\nimport { Comparison } from \"./comparison\";\r\nimport { Condition } from \"./condition\";\r\nimport { EqualFunctions } from \"./equalFunctions\";\r\nimport { Iterable } from \"./iterable\";\r\nimport { JavascriptIterable } from \"./javascript\";\r\nimport { ToStringFunctions } from \"./toStringFunctions\";\r\nimport {\r\n hasFunction, hasProperty, instanceOf, isJavascriptIterable, isString, isUndefinedOrNull, Type\r\n} from \"./types\";\r\n\r\n/**\r\n * A collection of condition methods that can be used to assert the state of an application.\r\n */\r\nexport class MutableCondition implements Condition\r\n{\r\n private toStringFunctions: ToStringFunctions;\r\n private equalFunctions: EqualFunctions;\r\n private createErrorFunction: (message: string) => Error;\r\n\r\n protected constructor()\r\n {\r\n this.toStringFunctions = ToStringFunctions.create();\r\n this.equalFunctions = EqualFunctions.create();\r\n this.createErrorFunction = MutableCondition.defaultCreateErrorFunction;\r\n }\r\n\r\n private static defaultCreateErrorFunction(message: string): Error\r\n {\r\n return new Error(message);\r\n }\r\n\r\n /**\r\n * Create a new {@link MutableCondition} object.\r\n */\r\n public static create(): MutableCondition\r\n {\r\n return new MutableCondition();\r\n }\r\n\r\n /**\r\n * Set the {@link ToStringFunctions} that will be used to convert values to their {@link String}\r\n * representations.\r\n * @param toStringFunctions The {@link ToStringFunctions} that will be used to convert values to\r\n * their {@link String} representations.\r\n * @returns This object for method chaining.\r\n */\r\n public setToStringFunctions(toStringFunctions: ToStringFunctions): this\r\n {\r\n this.assertNotUndefinedAndNotNull(toStringFunctions, \"toStringFunctions\");\r\n\r\n this.toStringFunctions = toStringFunctions;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the {@link EqualFunctions} that will be used to determine if values are equal.\r\n * @param equalFunctions The {@link EqualFunctions} that will be used to determine if values are\r\n * equal.\r\n * @returns This object for method chaining.\r\n */\r\n public setEqualFunctions(equalFunctions: EqualFunctions): this\r\n {\r\n this.assertNotUndefinedAndNotNull(equalFunctions, \"equalFunctions\");\r\n\r\n this.equalFunctions = equalFunctions;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Set the {@link Function} that will be used to create {@link Error}s.\r\n * @param createErrorFunction The {@link Function} to use to create {@link Error}.\r\n * @returns This object for method chaining.\r\n */\r\n public setCreateErrorFunction(createErrorFunction: (message: string) => Error): this\r\n {\r\n this.assertNotUndefinedAndNotNull(createErrorFunction, \"createErrorFunction\");\r\n\r\n this.createErrorFunction = createErrorFunction;\r\n return this;\r\n }\r\n\r\n public assertUndefined(value: unknown, expression?: string, message?: string): asserts value is undefined\r\n {\r\n Condition.assertUndefined(this, value, expression, message);\r\n }\r\n\r\n public assertNotUndefined<T>(value: T, expression?: string, message?: string): asserts value is NonNullable<T>\r\n {\r\n Condition.assertNotUndefined(this, value, expression, message);\r\n }\r\n\r\n /**\r\n * Get whether the provided values are equal.\r\n * @param left The left part of the comparison.\r\n * @param right The right part of the comparison.\r\n */\r\n public areEqual(left: unknown, right: unknown): boolean\r\n {\r\n return this.equalFunctions.areEqual(left, right).await();\r\n }\r\n\r\n /**\r\n * Get the {@link String} representation of the provided value.\r\n * @param value The value to get the {@link String} representation of.\r\n */\r\n public toValueString(value: unknown): string\r\n {\r\n return this.toStringFunctions.toString(value);\r\n }\r\n\r\n /**\r\n * Create an {@link Error} based on the provided {@link AssertMessageParameters}.\r\n * @param parameters The {@link AssertMessageParameters} that define how the should be made.\r\n */\r\n public createError(parameters: AssertMessageParameters): Error\r\n {\r\n const message: string = MutableCondition.createErrorMessage(parameters);\r\n return this.createErrorFunction(message);\r\n }\r\n\r\n /**\r\n * Create an error message based on the provided parameters.\r\n * @param parameters The parameters to use to create the error message.\r\n */\r\n public static createErrorMessage(parameters: AssertMessageParameters): string\r\n {\r\n let result: string = \"\";\r\n\r\n if (parameters.message)\r\n {\r\n result += `Message: ${parameters.message}`;\r\n }\r\n\r\n if (parameters.expression)\r\n {\r\n if (result)\r\n {\r\n result += \"\\n\";\r\n }\r\n result += `Expression: ${parameters.expression}`;\r\n }\r\n\r\n if (result)\r\n {\r\n result += \"\\n\";\r\n }\r\n result += `Expected: ${parameters.expected}`;\r\n\r\n if (result)\r\n {\r\n result += \"\\n\";\r\n }\r\n result += `Actual: ${parameters.actual}`;\r\n\r\n return result;\r\n }\r\n\r\n public assertNotUndefinedAndNotNull<T>(value: T, expression?: string, message?: string): asserts value is NonNullable<T>\r\n {\r\n if (value === undefined || value === null)\r\n {\r\n throw this.createError({\r\n expected: `not ${this.toValueString(undefined)} and not ${this.toValueString(null)}`,\r\n actual: this.toValueString(value),\r\n expression: expression,\r\n message: message,\r\n });\r\n }\r\n }\r\n\r\n public assertTrue(value: boolean, expression?: string, message?: string): asserts value is true\r\n {\r\n Condition.assertTrue(this, value, expression, message);\r\n }\r\n\r\n public assertFalse(value: boolean, expression?: string, message?: string): asserts value is false\r\n {\r\n if (value !== false)\r\n {\r\n throw this.createError({\r\n expected: this.toValueString(false),\r\n actual: this.toValueString(value),\r\n expression: expression,\r\n message: message,\r\n });\r\n }\r\n }\r\n\r\n public assertSame<T>(expected: T, actual: T, expression?: string, message?: string): void\r\n {\r\n if (expected !== actual)\r\n {\r\n throw this.createError({\r\n expected: this.toValueString(expected),\r\n actual: this.toValueString(actual),\r\n expression: expression,\r\n message: message,\r\n });\r\n }\r\n }\r\n\r\n public assertNotSame<T>(expected: T, actual: T, expression?: string, message?: string): void\r\n {\r\n if (expected === actual)\r\n {\r\n throw this.createError({\r\n expected: `not ${this.toValueString(expected)}`,\r\n actual: this.toValueString(actual),\r\n expression: expression,\r\n message: message,\r\n });\r\n }\r\n }\r\n\r\n public assertEqual<T>(expected: T, actual: T, expression?: string, message?: string): void\r\n {\r\n let comparison: Comparison | undefined = Comparer.compareSameUndefinedNull(expected, actual);\r\n if (comparison === undefined && this.areEqual(expected, actual))\r\n {\r\n comparison = Comparison.Equal;\r\n }\r\n\r\n if (comparison !== Comparison.Equal)\r\n {\r\n throw this.createError({\r\n expected: this.toValueString(expected),\r\n actual: this.toValueString(actual),\r\n expression: expression,\r\n message: message,\r\n });\r\n }\r\n }\r\n\r\n public assertNotEqual<T>(notExpected: T, actual: T, expression?: string, message?: string): void\r\n {\r\n let comparison: Comparison | undefined = Comparer.compareSameUndefinedNull(notExpected, actual);\r\n if (comparison === undefined && this.areEqual(notExpected, actual))\r\n {\r\n comparison = Comparison.Equal;\r\n }\r\n\r\n if (comparison === Comparison.Equal)\r\n {\r\n throw this.createError({\r\n expected: `not ${this.toValueString(notExpected)}`,\r\n actual: this.toValueString(actual),\r\n expression: expression,\r\n message: message,\r\n });\r\n }\r\n }\r\n\r\n public assertNotEmpty<T extends JavascriptIterable<unknown> | string | null | undefined>(value: T, expression?: string, message?: string): asserts value is NonNullable<T>\r\n {\r\n this.assertNotUndefinedAndNotNull(value, expression, message);\r\n if ((isString(value) && value.length === 0) ||\r\n (isJavascriptIterable(value) && !Iterable.create(value).any()))\r\n {\r\n throw this.createError({\r\n expected: \"not empty\",\r\n actual: this.toValueString(value),\r\n expression: expression,\r\n message: message,\r\n });\r\n }\r\n }\r\n\r\n public assertLessThan(value: number, upperBound: number, expression?: string, message?: string): void\r\n {\r\n if (!(value < upperBound))\r\n {\r\n throw this.createError({\r\n expected: `less than ${this.toValueString(upperBound)}`,\r\n actual: this.toValueString(value),\r\n expression: expression,\r\n message: message,\r\n });\r\n }\r\n }\r\n\r\n public assertLessThanOrEqualTo(value: number, upperBound: number, expression?: string, message?: string): void\r\n {\r\n if (!(value <= upperBound))\r\n {\r\n throw this.createError({\r\n expected: `less than or equal to ${this.toValueString(upperBound)}`,\r\n actual: this.toValueString(value),\r\n expression: expression,\r\n message: message,\r\n });\r\n }\r\n }\r\n\r\n public assertGreaterThanOrEqualTo(value: number, lowerBound: number, expression?: string, message?: string): void\r\n {\r\n if (!(lowerBound <= value))\r\n {\r\n throw this.createError({\r\n expected: `greater than or equal to ${this.toValueString(lowerBound)}`,\r\n actual: this.toValueString(value),\r\n expression: expression,\r\n message: message,\r\n });\r\n }\r\n }\r\n\r\n public assertGreaterThan(value: number, lowerBound: number, expression?: string, message?: string): void\r\n {\r\n if (!(lowerBound < value))\r\n {\r\n throw this.createError({\r\n expected: `greater than ${this.toValueString(lowerBound)}`,\r\n actual: this.toValueString(value),\r\n expression: expression,\r\n message: message,\r\n });\r\n }\r\n }\r\n\r\n public assertBetween(lowerBound: number, value: number, upperBound: number, expression?: string, message?: string): void\r\n {\r\n this.assertLessThanOrEqualTo(lowerBound, upperBound, \"lowerBound\");\r\n if (isUndefinedOrNull(value) || !(lowerBound <= value && value <= upperBound))\r\n {\r\n throw this.createError({\r\n expected: (lowerBound === upperBound\r\n ? this.toValueString(lowerBound)\r\n : `between ${this.toValueString(lowerBound)} and ${this.toValueString(upperBound)}`),\r\n actual: this.toValueString(value),\r\n expression: expression,\r\n message: message,\r\n });\r\n }\r\n }\r\n\r\n public assertAccessIndex(index: number, count: number, expression?: string, message?: string): void\r\n {\r\n this.assertGreaterThanOrEqualTo(count, 1, \"count\");\r\n this.assertInteger(index, expression);\r\n this.assertBetween(0, index, count - 1, expression, message);\r\n }\r\n\r\n public assertInsertIndex(index: number, count: number, expression?: string, message?: string): void\r\n {\r\n this.assertGreaterThanOrEqualTo(count, 0, \"count\");\r\n this.assertInteger(index, expression);\r\n this.assertBetween(0, index, count, expression, message);\r\n }\r\n\r\n public assertOneOf<T>(possibilities: JavascriptIterable<T>, value: T, expression?: string, message?: string): void\r\n {\r\n this.assertNotUndefinedAndNotNull(possibilities, \"possibilities\");\r\n\r\n let found: boolean = false;\r\n for (const possibility of possibilities)\r\n {\r\n if (this.areEqual(possibility, value))\r\n {\r\n found = true;\r\n break;\r\n }\r\n }\r\n\r\n if (!found)\r\n {\r\n throw this.createError({\r\n expected: `one of ${this.toValueString(possibilities)}`,\r\n actual: this.toValueString(value),\r\n expression: expression,\r\n message: message,\r\n });\r\n }\r\n }\r\n\r\n public assertByte(value: number, expression?: string, message?: string): void\r\n {\r\n this.assertBetween(Bytes.minimumValue, value, Bytes.maximumValue, expression, message);\r\n this.assertInteger(value, \"value\");\r\n }\r\n\r\n public assertInteger(value: number, expression?: string, message?: string): void\r\n {\r\n if (value % 1 !== 0)\r\n {\r\n throw this.createError({\r\n expected: `integer`,\r\n actual: this.toValueString(value),\r\n expression: expression,\r\n message: message,\r\n });\r\n }\r\n }\r\n\r\n public assertCharacter(value: string, expression?: string, message?: string): void\r\n {\r\n if (!value || value.length !== 1)\r\n {\r\n throw this.createError({\r\n expected: `character`,\r\n actual: this.toValueString(value),\r\n expression: expression,\r\n message: message,\r\n });\r\n }\r\n }\r\n\r\n public assertInstanceOf<T>(value: unknown, type: Type<T>, typeCheck?: (value: unknown) => value is T, expression?: string, message?: string): asserts value is T;\r\n public assertInstanceOf<T>(parameters: { value: unknown, type: Type<T>, typeCheck?: (value: unknown) => value is T, expression?: string, message?: string }): void;\r\n public assertInstanceOf<T>(parametersOrValue: unknown | { value: unknown, type: Type<T>, typeCheck?: (value: unknown) => value is T, expression?: string, message?: string }, type?: Type<T>, typeCheck?: (value: unknown) => value is T, expression?: string, message?: string): void;\r\n public assertInstanceOf<T>(parametersOrValue: unknown | { value: unknown, type: Type<T>, typeCheck?: (value: unknown) => value is T, expression?: string, message?: string }, type?: Type<T>, typeCheck?: (value: unknown) => value is T, expression?: string, message?: string): void\r\n {\r\n let value: unknown;\r\n if (hasProperty(parametersOrValue, \"value\") &&\r\n hasProperty(parametersOrValue, \"type\"))\r\n {\r\n value = parametersOrValue.value;\r\n type = parametersOrValue.type as Type<T>;\r\n if (hasFunction(parametersOrValue, \"typeCheck\"))\r\n {\r\n typeCheck = parametersOrValue.typeCheck as (value: unknown) => value is T;\r\n }\r\n if (hasProperty(parametersOrValue, \"expression\"))\r\n {\r\n expression = parametersOrValue.expression as string;\r\n }\r\n if (hasProperty(parametersOrValue, \"message\"))\r\n {\r\n message = parametersOrValue.message as string;\r\n }\r\n }\r\n else\r\n {\r\n value = parametersOrValue;\r\n }\r\n\r\n if (!instanceOf(value, type!, typeCheck))\r\n {\r\n throw this.createError({\r\n expected: `instance of ${type!.name}`,\r\n actual: this.toValueString(value),\r\n expression: expression,\r\n message: message,\r\n });\r\n }\r\n }\r\n}","import { join } from \"./strings\";\r\n\r\n/**\r\n * An {@link Error} that is thrown when a pre-condition fails.\r\n */\r\nexport class PreConditionError extends Error\r\n{\r\n public constructor(...message: string[])\r\n {\r\n super(join(\"\\n\", message));\r\n }\r\n}","import { JavascriptIterable } from \"./javascript\";\r\nimport { MutableCondition } from \"./mutableCondition\";\r\nimport { PreConditionError } from \"./preConditionError\";\r\nimport { Type } from \"./types\";\r\n\r\n/**\r\n * A type that encapsulates conditions that should exist before an operation takes place.\r\n */\r\nexport abstract class PreCondition\r\n{\r\n private static condition: MutableCondition | undefined;\r\n\r\n private static getCondition(): MutableCondition\r\n {\r\n if (PreCondition.condition === undefined)\r\n {\r\n PreCondition.condition = MutableCondition.create()\r\n .setCreateErrorFunction((message: string) =>\r\n {\r\n return new PreConditionError(message);\r\n });\r\n }\r\n return PreCondition.condition;\r\n }\r\n\r\n /**\r\n * Assert that the provided value is undefined.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public static assertUndefined(value: unknown, expression?: string, message?: string): asserts value is undefined\r\n {\r\n return PreCondition.getCondition().assertUndefined(value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is not undefined and not null.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public static assertNotUndefined<T>(value: T, expression?: string, message?: string): asserts value is NonNullable<T>\r\n {\r\n return PreCondition.getCondition().assertNotUndefined(value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is not undefined and not null.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public static assertNotUndefinedAndNotNull<T>(value: T, expression?: string, message?: string): asserts value is NonNullable<T>\r\n {\r\n return PreCondition.getCondition().assertNotUndefinedAndNotNull(value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is true.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public static assertTrue(value: boolean, expression?: string, message?: string): asserts value is true\r\n {\r\n return PreCondition.getCondition().assertTrue(value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is false.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public static assertFalse(value: boolean, expression?: string, message?: string): asserts value is false\r\n {\r\n return PreCondition.getCondition().assertFalse(value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided actual value is the same as the provided expected value.\r\n * @param expected The expected value.\r\n * @param actual The actual value.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertSame<T>(expected: T, actual: T, expression?: string, message?: string): void\r\n {\r\n return PreCondition.getCondition().assertSame(expected, actual, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided actual value is not the same as the provided expected value.\r\n * @param expected The expected value.\r\n * @param actual The actual value.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertNotSame<T>(expected: T, actual: T, expression?: string, message?: string): void\r\n {\r\n return PreCondition.getCondition().assertNotSame(expected, actual, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided actual value is equal to the provided expected value.\r\n * @param expected The expected value.\r\n * @param actual The actual value.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertEqual<T>(expected: T, actual: T, expression?: string, message?: string): void\r\n {\r\n return PreCondition.getCondition().assertEqual(expected, actual, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided actual value is not equal to the provided expected value.\r\n * @param notExpected The not expected value.\r\n * @param actual The actual value.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertNotEqual<T>(notExpected: T, actual: T, expression?: string, message?: string): void\r\n {\r\n return PreCondition.getCondition().assertNotEqual(notExpected, actual, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is not empty.\r\n * @param value The value to check.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertNotEmpty(value: JavascriptIterable<unknown> | string | undefined | null, expression?: string, message?: string): void\r\n {\r\n return PreCondition.getCondition().assertNotEmpty(value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is less than the provided upperBound.\r\n * @param value The value to check.\r\n * @param upperBound The upperBound that the value must be less than.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertLessThan(value: number, upperBound: number, expression?: string, message?: string): void\r\n {\r\n return PreCondition.getCondition().assertLessThan(value, upperBound, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is less than or equal to the provided upperBound.\r\n * @param value The value to check.\r\n * @param upperBound The upperBound that the value must be less than.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertLessThanOrEqualTo(value: number, upperBound: number, expression?: string, message?: string): void\r\n {\r\n return PreCondition.getCondition().assertLessThanOrEqualTo(value, upperBound, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is greater than or equal to the provided lowerBound.\r\n * @param value The value to check.\r\n * @param lowerBound The lowerBound that the value must be greater than or equal to.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertGreaterThanOrEqualTo(value: number, lowerBound: number, expression?: string, message?: string): void\r\n {\r\n return PreCondition.getCondition().assertGreaterThanOrEqualTo(value, lowerBound, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is greater than the provided lowerBound.\r\n * @param value The value to check.\r\n * @param lowerBound The lowerBound that the value must be greater than.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertGreaterThan(value: number, lowerBound: number, expression?: string, message?: string): void\r\n {\r\n return PreCondition.getCondition().assertGreaterThan(value, lowerBound, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the value is greater than or equal to the lowerBound and less than or equal to\r\n * the upperBound.\r\n * @param lowerBound The lowerBound that the value must be greater than or equal to.\r\n * @param value The value to check.\r\n * @param upperBound The upperBound that the value must be less than or equal to.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertBetween(lowerBound: number, value: number, upperBound: number, expression?: string, message?: string): void\r\n {\r\n return PreCondition.getCondition().assertBetween(lowerBound, value, upperBound, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the index is within the access bounds of an indexable with the provided count.\r\n * @param index The index to check.\r\n * @param count The number of elements in the indexable.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertAccessIndex(index: number, count: number, expression?: string, message?: string): void\r\n {\r\n return PreCondition.getCondition().assertAccessIndex(index, count, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the index is within the insertion bounds of a {@link List} with the provided count.\r\n * @param index The index to check.\r\n * @param count The number of elements in the indexable.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertInsertIndex(index: number, count: number, expression?: string, message?: string): void\r\n {\r\n return PreCondition.getCondition().assertInsertIndex(index, count, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the value is one of the possibilities.\r\n * @param possibilities The possible values that the value can be.\r\n * @param value The value to check.\r\n * @param expression The expression that produced the value.\r\n * @param message An optional error message.\r\n */\r\n public static assertOneOf<T>(possibilities: JavascriptIterable<T>, value: T, expression?: string, message?: string): void\r\n {\r\n return PreCondition.getCondition().assertOneOf(possibilities, value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the value is within the bounds of a byte.\r\n * @param value The value to check.\r\n * @param expression The expression that produced the value.\r\n * @param message An optional error message.\r\n */\r\n public static assertByte(value: number, expression?: string, message?: string): void\r\n {\r\n return PreCondition.getCondition().assertByte(value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the value is an integer.\r\n * @param value The value to check.\r\n * @param expression The expression that produced the value.\r\n * @param message An optional error message.\r\n */\r\n public static assertInteger(value: number, expression?: string, message?: string): void\r\n {\r\n return PreCondition.getCondition().assertInteger(value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the value is a characer (single character string).\r\n * @param value The value to check.\r\n * @param expression The expression that produced the value.\r\n * @param message An optional error message.\r\n */\r\n public static assertCharacter(value: string, expression?: string, message?: string): void\r\n {\r\n return PreCondition.getCondition().assertCharacter(value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is an instance of the provided {@link Type}.\r\n * @param value The value to check.\r\n * @param type The {@link Type} to check.\r\n * @param expression The expression that produced the value.\r\n * @param message An optional error message.\r\n */\r\n public assertInstanceOf<T>(value: unknown, type: Type<T>, typeCheck?: (value: unknown) => value is T, expression?: string, message?: string): asserts value is T;\r\n public assertInstanceOf<T>(parameters: { value: unknown, type: Type<T>, typeCheck?: (value: unknown) => value is T, expression?: string, message?: string }): void;\r\n assertInstanceOf<T>(parametersOrValue: unknown | { value: unknown, type: Type<T>, typeCheck?: (value: unknown) => value is T, expression?: string, message?: string }, type?: Type<T>, typeCheck?: (value: unknown) => value is T, expression?: string, message?: string): void\r\n {\r\n return PreCondition.getCondition().assertInstanceOf(parametersOrValue, type, typeCheck, expression, message);\r\n }\r\n}","import { AsyncIterator } from \"./asyncIterator\";\nimport { JavascriptAsyncIterator, JavascriptIteratorResult } from \"./javascript\";\nimport { PreCondition } from \"./preCondition\";\n\n/**\n * A type that adapts an {@link AsyncIterator} to match a {@link JavascriptAsyncIterator}.\n */\nexport class AsyncIteratorToJavascriptAsyncIteratorAdapter<T> implements JavascriptAsyncIterator<T>\n{\n private readonly iterator: AsyncIterator<T>;\n private hasStarted: boolean;\n\n private constructor(iterator: AsyncIterator<T>)\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n\n this.iterator = iterator;\n this.hasStarted = false;\n }\n\n public static create<T>(iterator: AsyncIterator<T>): AsyncIteratorToJavascriptAsyncIteratorAdapter<T>\n {\n return new AsyncIteratorToJavascriptAsyncIteratorAdapter<T>(iterator);\n }\n \n public async next(): Promise<JavascriptIteratorResult<T>>\n {\n if (!this.hasStarted)\n {\n this.hasStarted = true;\n await this.iterator.start();\n }\n else\n {\n await this.iterator.next();\n }\n\n const result: JavascriptIteratorResult<T> = {\n done: !this.iterator.hasCurrent(),\n value: undefined!,\n };\n if (!result.done)\n {\n result.value = this.iterator.getCurrent();\n }\n return result;\n }\n}","import { PromiseAsyncResult } from \"./promiseAsyncResult\";\nimport { AsyncIterator } from \"./asyncIterator\";\nimport { JavascriptAsyncIterable, JavascriptAsyncIterator, JavascriptIteratorResult } from \"./javascript\";\nimport { PreCondition } from \"./preCondition\";\nimport { isJavascriptAsyncIterable, Type } from \"./types\";\nimport { AsyncIteratorToJavascriptAsyncIteratorAdapter } from \"./asyncIteratorToJavascriptAsyncIteratorAdapter\";\n\nexport class JavascriptAsyncIteratorToAsyncIteratorAdapter<T> implements AsyncIterator<T>\n{\n private readonly javascriptIterator: JavascriptAsyncIterator<T>;\n private javascriptIteratorResult?: JavascriptIteratorResult<T>;\n\n private constructor(javascriptIterator: JavascriptAsyncIterator<T>)\n {\n PreCondition.assertNotUndefinedAndNotNull(javascriptIterator, \"javascriptIterator\");\n\n this.javascriptIterator = javascriptIterator;\n }\n\n public static create<T>(javascriptIterator: JavascriptAsyncIterator<T> | JavascriptAsyncIterable<T>): JavascriptAsyncIteratorToAsyncIteratorAdapter<T>\n {\n if (isJavascriptAsyncIterable<T>(javascriptIterator))\n {\n javascriptIterator = javascriptIterator[Symbol.asyncIterator]();\n }\n return new JavascriptAsyncIteratorToAsyncIteratorAdapter(javascriptIterator);\n }\n\n public next(): PromiseAsyncResult<boolean>\n {\n return PromiseAsyncResult.create(async () =>\n {\n this.javascriptIteratorResult = await this.javascriptIterator.next();\n return this.hasCurrent();\n });\n }\n\n public hasStarted(): boolean\n {\n return this.javascriptIteratorResult !== undefined;\n }\n\n public hasCurrent(): boolean\n {\n return this.javascriptIteratorResult?.done === false;\n }\n\n public getCurrent(): T\n {\n PreCondition.assertTrue(this.hasCurrent(), \"this.hasCurrent()\");\n\n return this.javascriptIteratorResult!.value;\n }\n\n public start(): PromiseAsyncResult<this>\n {\n return AsyncIterator.start<T, this>(this);\n }\n\n public takeCurrent(): PromiseAsyncResult<T>\n {\n return AsyncIterator.takeCurrent(this);\n }\n\n public any(): PromiseAsyncResult<boolean>\n {\n return AsyncIterator.any(this);\n }\n\n public getCount(): PromiseAsyncResult<number>\n {\n return AsyncIterator.getCount(this);\n }\n\n public toArray(): PromiseAsyncResult<T[]>\n {\n return AsyncIterator.toArray(this);\n }\n\n public map<TOutput>(mapping: (value: T) => (TOutput | PromiseLike<TOutput>)): AsyncIterator<TOutput>\n {\n return AsyncIterator.map(this, mapping);\n }\n\n public [Symbol.asyncIterator](): JavascriptAsyncIterator<T>\n {\n return AsyncIterator[Symbol.asyncIterator](this);\n }\n\n public first(condition?: (value: T) => (boolean | PromiseLike<boolean>)): PromiseAsyncResult<T>\n {\n return AsyncIterator.first(this, condition);\n }\n\n public last(condition?: (value: T) => (boolean | PromiseLike<boolean>)): PromiseAsyncResult<T>\n {\n return AsyncIterator.last(this, condition);\n }\n\n public where(condition: (value: T) => (boolean | PromiseLike<boolean>)): AsyncIterator<T>\n {\n return AsyncIterator.where(this, condition);\n }\n\n public whereInstanceOf<U extends T>(typeCheck: (value: T) => value is U): AsyncIterator<U>\n {\n return AsyncIterator.whereInstanceOf(this, typeCheck);\n }\n\n public whereInstanceOfType<U extends T>(type: Type<U>): AsyncIterator<U>\n {\n return AsyncIterator.whereInstanceOfType(this, type);\n }\n\n public take(maximumToTake: number): AsyncIterator<T>\n {\n return AsyncIterator.take(this, maximumToTake);\n }\n\n public skip(maximumToSkip: number): AsyncIterator<T>\n {\n return AsyncIterator.skip(this, maximumToSkip);\n }\n}","import { PreCondition } from \"./preCondition\";\nimport { Type } from \"./types\";\nimport { AsyncIterator } from \"./asyncIterator\";\nimport { PromiseAsyncResult } from \"./promiseAsyncResult\";\nimport { JavascriptAsyncIterator } from \"./javascript\";\n\n/**\n * An {@link AsyncIterator} that maps {@link TInput} values to {@link TOutput} values.\n */\nexport class MapAsyncIterator<TInput, TOutput> implements AsyncIterator<TOutput>\n{\n private readonly inputIterator: AsyncIterator<TInput>;\n private readonly mapping: (value: TInput) => (TOutput | PromiseLike<TOutput>);\n private current: TOutput | undefined;\n private started: boolean;\n\n protected constructor(inputIterator: AsyncIterator<TInput>, mapping: (value: TInput) => (TOutput | PromiseLike<TOutput>))\n {\n PreCondition.assertNotUndefinedAndNotNull(inputIterator, \"inputIterator\");\n PreCondition.assertNotUndefinedAndNotNull(mapping, \"mapping\");\n\n this.inputIterator = inputIterator;\n this.mapping = mapping;\n this.started = false;\n }\n\n public static create<TInput, TOutput>(inputIterator: AsyncIterator<TInput>, mapping: (value: TInput) => (TOutput | PromiseLike<TOutput>)): MapAsyncIterator<TInput, TOutput>\n {\n return new MapAsyncIterator(inputIterator, mapping);\n }\n\n public next(): PromiseAsyncResult<boolean>\n {\n return PromiseAsyncResult.create(async () =>\n {\n if (!this.hasStarted())\n {\n this.started = true;\n await this.inputIterator.start();\n }\n else\n {\n await this.inputIterator.next();\n }\n\n const result: boolean = this.inputIterator.hasCurrent();\n this.current = result\n ? await this.mapping(this.inputIterator.getCurrent())\n : undefined;\n\n return result;\n });\n }\n\n public hasStarted(): boolean\n {\n return this.started;\n }\n\n public hasCurrent(): boolean\n {\n return this.hasStarted() && this.inputIterator.hasCurrent();\n }\n\n public getCurrent(): TOutput\n {\n PreCondition.assertTrue(this.hasCurrent(), \"this.hasCurrent()\");\n\n return this.current!;\n }\n\n public start(): PromiseAsyncResult<this>\n {\n return AsyncIterator.start<TOutput, this>(this);\n }\n\n public takeCurrent(): PromiseAsyncResult<TOutput>\n {\n return AsyncIterator.takeCurrent(this);\n }\n\n public any(): PromiseAsyncResult<boolean>\n {\n return AsyncIterator.any(this);\n }\n\n public getCount(): PromiseAsyncResult<number>\n {\n return AsyncIterator.getCount(this);\n }\n\n public toArray(): PromiseAsyncResult<TOutput[]>\n {\n return AsyncIterator.toArray(this);\n }\n\n public map<TOutput2>(mapping: (value: TOutput) => (TOutput2 | PromiseLike<TOutput2>)): AsyncIterator<TOutput2>\n {\n return AsyncIterator.map(this, mapping);\n }\n\n public [Symbol.asyncIterator](): JavascriptAsyncIterator<TOutput>\n {\n return AsyncIterator[Symbol.asyncIterator](this);\n }\n\n public first(condition?: (value: TOutput) => boolean): PromiseAsyncResult<TOutput>\n {\n return AsyncIterator.first(this, condition);\n }\n\n public last(): PromiseAsyncResult<TOutput>\n {\n return AsyncIterator.last(this);\n }\n\n public where(condition: (value: TOutput) => (boolean | PromiseLike<boolean>)): AsyncIterator<TOutput>\n {\n return AsyncIterator.where(this, condition);\n }\n\n public whereInstanceOf<U extends TOutput>(typeCheck: (value: TOutput) => value is U): AsyncIterator<U>\n {\n return AsyncIterator.whereInstanceOf(this, typeCheck);\n }\n\n public whereInstanceOfType<U extends TOutput>(type: Type<U>): AsyncIterator<U>\n {\n return AsyncIterator.whereInstanceOfType(this, type);\n }\n\n public take(maximumToTake: number): AsyncIterator<TOutput>\n {\n return AsyncIterator.take(this, maximumToTake);\n }\n\n public skip(maximumToSkip: number): AsyncIterator<TOutput>\n {\n return AsyncIterator.skip(this, maximumToSkip);\n }\n}","import { PromiseAsyncResult } from \"./promiseAsyncResult\";\nimport { AsyncIterator } from \"./asyncIterator\";\nimport { JavascriptAsyncIterator } from \"./javascript\";\nimport { PreCondition } from \"./preCondition\";\nimport { Type } from \"./types\";\n\n/**\n * An {@link AsyncIterator} that skips the first maximum number of values from an inner\n * {@link AsyncIterator} before beginning to return values.\n */\nexport class SkipAsyncIterator<T> implements AsyncIterator<T>\n{\n private readonly innerIterator: AsyncIterator<T>;\n private started: boolean;\n private readonly maximumToSkip: number;\n\n private constructor(innerIterator: AsyncIterator<T>, maximumToSkip: number)\n {\n PreCondition.assertNotUndefinedAndNotNull(innerIterator, \"innerIterator\");\n PreCondition.assertNotUndefinedAndNotNull(maximumToSkip, \"maximumToSkip\");\n PreCondition.assertInteger(maximumToSkip, \"maximumToSkip\");\n PreCondition.assertGreaterThanOrEqualTo(maximumToSkip, 0, \"maximumToSkip\");\n\n this.innerIterator = innerIterator;\n this.started = false;\n this.maximumToSkip = maximumToSkip;\n }\n\n public static create<T>(innerIterator: AsyncIterator<T>, maximumToSkip: number): SkipAsyncIterator<T>\n {\n return new SkipAsyncIterator(innerIterator, maximumToSkip);\n }\n\n public next(): PromiseAsyncResult<boolean>\n {\n return PromiseAsyncResult.create(async () =>\n {\n if (!this.hasStarted())\n {\n this.started = true;\n await this.innerIterator.start();\n\n for (let i = 0; i < this.maximumToSkip; i++)\n {\n if (!await this.innerIterator.next())\n {\n break;\n }\n }\n }\n else\n {\n await this.innerIterator.next();\n }\n return this.hasCurrent();\n });\n }\n\n public hasStarted(): boolean\n {\n return this.started;\n }\n\n public hasCurrent(): boolean\n {\n return this.hasStarted() && this.innerIterator.hasCurrent();\n }\n\n public getCurrent(): T\n {\n PreCondition.assertTrue(this.hasCurrent(), \"this.hasCurrent()\");\n\n return this.innerIterator.getCurrent();\n }\n\n public start(): PromiseAsyncResult<this>\n {\n return AsyncIterator.start<T, this>(this);\n }\n\n public takeCurrent(): PromiseAsyncResult<T>\n {\n return AsyncIterator.takeCurrent(this);\n }\n\n public any(): PromiseAsyncResult<boolean>\n {\n return AsyncIterator.any(this);\n }\n\n public getCount(): PromiseAsyncResult<number>\n {\n return AsyncIterator.getCount(this);\n }\n\n public toArray(): PromiseAsyncResult<T[]>\n {\n return AsyncIterator.toArray(this);\n }\n\n public where(condition: (value: T) => (boolean | PromiseLike<boolean>)): AsyncIterator<T>\n {\n return AsyncIterator.where(this, condition);\n }\n\n public whereInstanceOf<U extends T>(typeCheck: (value: T) => value is U): AsyncIterator<U>\n {\n return AsyncIterator.whereInstanceOf(this, typeCheck);\n }\n\n public whereInstanceOfType<U extends T>(type: Type<U>): AsyncIterator<U>\n {\n return AsyncIterator.whereInstanceOfType(this, type);\n }\n\n public map<TOutput>(mapping: (value: T) => (TOutput | PromiseLike<TOutput>)): AsyncIterator<TOutput>\n {\n return AsyncIterator.map(this, mapping);\n }\n\n public first(condition?: (value: T) => (boolean | PromiseLike<boolean>)): PromiseAsyncResult<T>\n {\n return AsyncIterator.first(this, condition);\n }\n\n public last(condition?: (value: T) => (boolean | PromiseLike<boolean>)): PromiseAsyncResult<T>\n {\n return AsyncIterator.last(this, condition);\n }\n\n public [Symbol.asyncIterator](): JavascriptAsyncIterator<T>\n {\n return AsyncIterator[Symbol.asyncIterator](this);\n }\n\n public take(maximumToTake: number): AsyncIterator<T>\n {\n return AsyncIterator.take(this, maximumToTake);\n }\n\n public skip(maximumToSkip: number): AsyncIterator<T>\n {\n return AsyncIterator.skip(this, maximumToSkip);\n }\n}","import { AsyncIterator } from \"./asyncIterator\";\nimport { PromiseAsyncResult } from \"./promiseAsyncResult\";\nimport { JavascriptAsyncIterator } from \"./javascript\";\nimport { PreCondition } from \"./preCondition\";\nimport { Type } from \"./types\";\n\n/**\n * An {@link AsyncIterator} that iterates over a maximum number of values.\n */\nexport class TakeAsyncIterator<T> implements AsyncIterator<T>\n{\n private readonly innerIterator: AsyncIterator<T>;\n private started: boolean;\n private readonly maximumToTake: number;\n private taken: number;\n\n private constructor(innerIterator: AsyncIterator<T>, maximumToTake: number)\n {\n PreCondition.assertGreaterThanOrEqualTo(maximumToTake, 0, \"maximumToTake\");\n\n this.innerIterator = innerIterator;\n this.started = false;\n this.maximumToTake = maximumToTake;\n this.taken = 0;\n }\n\n public static create<T>(innerIterator: AsyncIterator<T>, maximumToTake: number)\n {\n return new TakeAsyncIterator(innerIterator, maximumToTake);\n }\n\n public hasCurrent(): boolean\n {\n return this.hasStarted() && this.taken <= this.maximumToTake && this.innerIterator.hasCurrent();\n }\n\n public next(): PromiseAsyncResult<boolean>\n {\n return PromiseAsyncResult.create(async () =>\n {\n if (this.maximumToTake <= 0)\n {\n return false;\n }\n else if (!this.hasStarted())\n {\n this.started = true;\n await this.innerIterator.start();\n this.taken++;\n }\n else if (this.taken <= this.maximumToTake)\n {\n await this.innerIterator.next();\n this.taken++;\n }\n return this.hasCurrent();\n });\n }\n\n public hasStarted(): boolean\n {\n return this.started;\n }\n\n public getCurrent(): T\n {\n PreCondition.assertTrue(this.hasCurrent(), \"this.hasCurrent()\");\n\n return this.innerIterator.getCurrent();\n }\n\n public start(): PromiseAsyncResult<this>\n {\n return AsyncIterator.start<T, this>(this);\n }\n\n public takeCurrent(): PromiseAsyncResult<T>\n {\n return AsyncIterator.takeCurrent(this);\n }\n\n public any(): PromiseAsyncResult<boolean>\n {\n return AsyncIterator.any(this);\n }\n\n public getCount(): PromiseAsyncResult<number>\n {\n return AsyncIterator.getCount(this);\n }\n\n public toArray(): PromiseAsyncResult<T[]>\n {\n return AsyncIterator.toArray(this);\n }\n\n public where(condition: (value: T) => boolean): AsyncIterator<T>\n {\n return AsyncIterator.where(this, condition);\n }\n\n public whereInstanceOf<U extends T>(typeCheck: (value: T) => value is U): AsyncIterator<U>\n {\n return AsyncIterator.whereInstanceOf(this, typeCheck);\n }\n\n public whereInstanceOfType<U extends T>(type: Type<U>): AsyncIterator<U>\n {\n return AsyncIterator.whereInstanceOfType(this, type);\n }\n\n public map<TOutput>(mapping: (value: T) => (TOutput | PromiseLike<TOutput>)): AsyncIterator<TOutput>\n {\n return AsyncIterator.map(this, mapping);\n }\n\n public first(condition?: (value: T) => (boolean | PromiseLike<boolean>)): PromiseAsyncResult<T>\n {\n return AsyncIterator.first(this, condition);\n }\n\n public last(condition?: (value: T) => (boolean | PromiseLike<boolean>)): PromiseAsyncResult<T>\n {\n return AsyncIterator.last(this, condition);\n }\n\n public [Symbol.asyncIterator](): JavascriptAsyncIterator<T>\n {\n return AsyncIterator[Symbol.asyncIterator](this);\n }\n\n public take(maximumToTake: number): AsyncIterator<T>\n {\n return AsyncIterator.take(this, maximumToTake);\n }\n\n public skip(maximumToSkip: number): AsyncIterator<T>\n {\n return AsyncIterator.skip(this, maximumToSkip);\n }\n}","import { AsyncIterator } from \"./asyncIterator\";\nimport { PromiseAsyncResult } from \"./promiseAsyncResult\";\nimport { JavascriptAsyncIterator } from \"./javascript\";\nimport { PreCondition } from \"./preCondition\";\nimport { Type } from \"./types\";\n\n/**\n * An {@link Iterator} that only returns values that match a condition.\n */\nexport class WhereAsyncIterator<T> implements AsyncIterator<T>\n{\n private readonly innerIterator: AsyncIterator<T>;\n private started: boolean;\n private readonly condition: (value: T) => (boolean | PromiseLike<boolean>);\n\n private constructor(innerIterator: AsyncIterator<T>, condition: (value: T) => (boolean | PromiseLike<boolean>))\n {\n PreCondition.assertNotUndefinedAndNotNull(innerIterator, \"innerIterator\");\n PreCondition.assertNotUndefinedAndNotNull(condition, \"condition\");\n\n this.innerIterator = innerIterator;\n this.started = false;\n this.condition = condition;\n }\n\n public hasStarted(): boolean\n {\n return this.started;\n }\n\n public hasCurrent(): boolean\n {\n return this.hasStarted() && this.innerIterator.hasCurrent();\n }\n\n public getCurrent(): T\n {\n PreCondition.assertTrue(this.hasCurrent(), \"this.hasCurrent()\");\n\n return this.innerIterator.getCurrent();\n }\n\n public static create<T>(innerIterator: AsyncIterator<T>, condition: (value: T) => (boolean | PromiseLike<boolean>)): WhereAsyncIterator<T>\n {\n return new WhereAsyncIterator(innerIterator, condition);\n }\n\n public next(): PromiseAsyncResult<boolean>\n {\n return PromiseAsyncResult.create(async () =>\n {\n if (!this.hasStarted())\n {\n await this.innerIterator.start();\n this.started = true;\n\n while (this.hasCurrent() && !await this.condition(this.getCurrent()))\n {\n await this.innerIterator.next();\n }\n }\n else\n {\n do\n {\n await this.innerIterator.next();\n }\n while (this.hasCurrent() && !await this.condition(this.getCurrent()));\n }\n return this.hasCurrent();\n });\n }\n\n public start(): PromiseAsyncResult<this>\n {\n return AsyncIterator.start<T, this>(this);\n }\n\n public takeCurrent(): PromiseAsyncResult<T>\n {\n return AsyncIterator.takeCurrent(this);\n }\n\n public any(): PromiseAsyncResult<boolean>\n {\n return AsyncIterator.any(this);\n }\n\n public getCount(): PromiseAsyncResult<number>\n {\n return AsyncIterator.getCount(this);\n }\n\n public toArray(): PromiseAsyncResult<T[]>\n {\n return AsyncIterator.toArray(this);\n }\n\n public where(condition: (value: T) => (boolean | PromiseLike<boolean>)): AsyncIterator<T>\n {\n return AsyncIterator.where(this, condition);\n }\n\n public map<TOutput>(mapping: (value: T) => (TOutput | PromiseLike<TOutput>)): AsyncIterator<TOutput>\n {\n return AsyncIterator.map(this, mapping);\n }\n\n public whereInstanceOf<U extends T>(typeCheck: (value: T) => value is U): AsyncIterator<U>\n {\n return AsyncIterator.whereInstanceOf(this, typeCheck);\n }\n\n public whereInstanceOfType<U extends T>(type: Type<U>): AsyncIterator<U>\n {\n return AsyncIterator.whereInstanceOfType(this, type);\n }\n\n public first(condition?: (value: T) => (boolean | PromiseLike<boolean>)): PromiseAsyncResult<T>\n {\n return AsyncIterator.first(this, condition);\n }\n\n public last(condition?: (value: T) => (boolean | PromiseLike<boolean>)): PromiseAsyncResult<T>\n {\n return AsyncIterator.last(this, condition);\n }\n\n public take(maximumToTake: number): AsyncIterator<T>\n {\n return AsyncIterator.take(this, maximumToTake);\n }\n\n public skip(maximumToSkip: number): AsyncIterator<T>\n {\n return AsyncIterator.skip(this, maximumToSkip);\n }\n\n public [Symbol.asyncIterator](): JavascriptAsyncIterator<T>\n {\n return AsyncIterator[Symbol.asyncIterator](this);\n }\n}","import { AsyncIteratorToJavascriptAsyncIteratorAdapter } from \"./asyncIteratorToJavascriptAsyncIteratorAdapter\";\nimport { PromiseAsyncResult } from \"./promiseAsyncResult\";\nimport { Comparable } from \"./comparable\";\nimport { EmptyError } from \"./emptyError\";\nimport { JavascriptAsyncIterator } from \"./javascript\";\nimport { JavascriptAsyncIteratorToAsyncIteratorAdapter } from \"./javascriptAsyncIteratorToAsyncIteratorAdapter\";\nimport { MapAsyncIterator } from \"./mapAsyncIterator\";\nimport { NotFoundError } from \"./notFoundError\";\nimport { PreCondition } from \"./preCondition\";\nimport { SkipAsyncIterator } from \"./skipAsyncIterator\";\nimport { TakeAsyncIterator } from \"./takeAsyncIterator\";\nimport { instanceOfType, isJavascriptAsyncIterator, isUndefinedOrNull, Type } from \"./types\";\nimport { WhereAsyncIterator } from \"./whereAsyncIterator\";\n\n/**\n * A type that can be used to asynchronously iterate over a collection.\n */\nexport abstract class AsyncIterator<T>\n{\n public static create<T>(iterator: JavascriptAsyncIterator<T>): AsyncIterator<T>\n {\n return JavascriptAsyncIteratorToAsyncIteratorAdapter.create(iterator);\n }\n\n /**\n * Move to the next value in the collection. Return whether this {@link AsyncIterator} points to\n * a value after the move.\n */\n public abstract next(): PromiseAsyncResult<boolean>;\n\n /**\n * Get whether this {@link AsyncIterator} has started iterating over the values in the collection.\n */\n public abstract hasStarted(): boolean;\n\n /**\n * Get whether this {@link AsyncIterator} currently points at a value in the collection.\n */\n public abstract hasCurrent(): boolean;\n\n /**\n * Get the value that this {@link AsyncIterator} points to.\n */\n public abstract getCurrent(): T;\n\n /**\n * Move to the first value if this {@link AsyncIterator} hasn't started yet.\n * @returns This object for method chaining.\n */\n public start(): PromiseAsyncResult<this>\n {\n return AsyncIterator.start(this);\n }\n\n /**\n * Move the provided {@link AsyncIterator} to its first value if it hasn't started yet.\n */\n public static start<T, TIterator extends AsyncIterator<T>>(iterator: TIterator): PromiseAsyncResult<TIterator>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n\n return PromiseAsyncResult.create(async () =>\n {\n if (!iterator.hasStarted())\n {\n await iterator.next();\n }\n return iterator;\n });\n }\n\n /**\n * Get the current value from this {@link AsyncIterator} and advance this {@link AsyncIterator} to the\n * next value.\n */\n public takeCurrent(): PromiseAsyncResult<T>\n {\n return AsyncIterator.takeCurrent(this);\n }\n\n public static takeCurrent<T>(iterator: AsyncIterator<T>): PromiseAsyncResult<T>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n PreCondition.assertTrue(iterator.hasCurrent(), \"iterator.hasCurrent()\");\n\n return PromiseAsyncResult.create(async () =>\n {\n const result: T = iterator.getCurrent();\n await iterator.next();\n return result;\n });\n }\n\n public [Symbol.asyncIterator](): JavascriptAsyncIterator<T>\n {\n return AsyncIterator[Symbol.asyncIterator](this);\n }\n\n /**\n * Convert the provided {@link AsyncIterator} to a {@link IteratorToJavascriptIteratorAdapter}.\n * @param iterator The {@link AsyncIterator} to convert.\n */\n public static [Symbol.asyncIterator]<T>(iterator: AsyncIterator<T>): JavascriptAsyncIterator<T>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n\n return AsyncIteratorToJavascriptAsyncIteratorAdapter.create(iterator);\n }\n\n /**\n * Get whether this {@link AsyncIterator} contains any values.\n * Note: This may advance the {@link AsyncIterator} to the first value if it hasn't been\n * started yet.\n */\n public any(): PromiseAsyncResult<boolean>\n {\n return AsyncIterator.any(this);\n }\n\n /**\n * Get whether this {@link AsyncIterator} contains any values.\n * Note: This may advance the {@link AsyncIterator} to the first value if it hasn't been\n * started yet.\n */\n public static any<T>(iterator: AsyncIterator<T>): PromiseAsyncResult<boolean>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n\n return PromiseAsyncResult.create(async () =>\n {\n await iterator.start();\n return iterator.hasCurrent();\n });\n\n }\n\n /**\n * Get the number of values in this {@link AsyncIterator}.\n * Note: This will consume all of the values in this {@link AsyncIterator}.\n */\n public getCount(): PromiseAsyncResult<number>\n {\n return AsyncIterator.getCount(this);\n }\n\n /**\n * Get the number of values in the provided {@link AsyncIterator}.\n * Note: This will consume all of the values in the provided {@link AsyncIterator}.\n */\n public static getCount<T>(iterator: AsyncIterator<T>): PromiseAsyncResult<number>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n\n return PromiseAsyncResult.create(async () =>\n {\n let result: number = 0;\n if (iterator.hasCurrent())\n {\n result++;\n }\n while (await iterator.next())\n {\n result++;\n }\n return result;\n });\n }\n\n /**\n * Get all of the remaining values in this {@link AsyncIterator} in a {@link T} {@link Array}.\n */\n public toArray(): PromiseAsyncResult<T[]>\n {\n return AsyncIterator.toArray(this);\n }\n\n /**\n * Get all of the remaining values in the provided {@link AsyncIterator} in a {@link T}\n * {@link Array}.\n */\n public static toArray<T>(iterator: AsyncIterator<T>): PromiseAsyncResult<T[]>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n\n return PromiseAsyncResult.create(async () =>\n {\n const result: T[] = [];\n\n if (iterator.hasCurrent())\n {\n result.push(iterator.getCurrent());\n }\n while (await iterator.next())\n {\n result.push(iterator.getCurrent());\n }\n\n return result;\n });\n }\n\n /**\n * Get an {@link AsyncIterator} that will only return values that match the provided condition.\n * @param condition The condition to run against each of the values in this {@link AsyncIterator}.\n */\n public where(condition: (value: T) => (boolean | PromiseLike<boolean>)): AsyncIterator<T>\n {\n return AsyncIterator.where(this, condition);\n }\n\n public static where<T>(iterator: AsyncIterator<T>, condition: (value: T) => (boolean | PromiseLike<boolean>)): AsyncIterator<T>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n PreCondition.assertNotUndefinedAndNotNull(condition, \"condition\");\n\n return WhereAsyncIterator.create(iterator, condition);\n }\n\n /**\n * Get a {@link MapIterator} that will map all {@link T} values from this {@link AsyncIterator} to\n * {@link TOutput} values.\n * @param mapping The mapping that maps {@link T} values to {@link TOutput} values.\n */\n public map<TOutput>(mapping: (value: T) => (TOutput | PromiseLike<TOutput>)): AsyncIterator<TOutput>\n {\n return AsyncIterator.map(this, mapping);\n }\n\n public static map<T, TOutput>(iterator: AsyncIterator<T>, mapping: (value: T) => (TOutput | PromiseLike<TOutput>)): AsyncIterator<TOutput>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n PreCondition.assertNotUndefinedAndNotNull(mapping, \"mapping\");\n\n return MapAsyncIterator.create(iterator, mapping);\n }\n\n /**\n * Get an {@link AsyncIterator} that will filter this {@link AsyncIterator} to only the values that are\n * instances of {@link U} based on the provided type check {@link Function}.\n * @param typeCheck The {@link Function} that will be used to determine if values are of type\n * {@link U}.\n */\n public whereInstanceOf<U extends T>(typeCheck: (value: T) => value is U): AsyncIterator<U>\n {\n return AsyncIterator.whereInstanceOf(this, typeCheck);\n }\n\n public static whereInstanceOf<T, U extends T>(iterator: AsyncIterator<T>, typeCheck: (value: T) => value is U): AsyncIterator<U>\n {\n PreCondition.assertNotUndefinedAndNotNull(typeCheck, \"typeCheck\");\n\n return iterator.where(typeCheck)\n .map((value: T) => value as U);\n }\n\n /**\n * Get an {@link AsyncIterator} that will filter this {@link AsyncIterator} to only the values that are\n * instances of the provided {@link Type}.\n * @param type The type of values to return from the new {@link AsyncIterator}.\n */\n public whereInstanceOfType<U extends T>(type: Type<U>): AsyncIterator<U>\n {\n return AsyncIterator.whereInstanceOfType(this, type);\n }\n\n public static whereInstanceOfType<T, U extends T>(iterator: AsyncIterator<T>, type: Type<U>): AsyncIterator<U>\n {\n PreCondition.assertNotUndefinedAndNotNull(type, \"type\");\n\n return iterator.whereInstanceOf((value: T) => instanceOfType(value, type));\n }\n\n /**\n * If the condition function is undefined, then this function will return the first value in\n * this {@link AsyncIterator}. If this condition function is provided, then this function will return\n * the first value that matches the provided condition.\n * @param condition The condition that the returned value must satisfy.\n */\n public first(condition?: (value: T) => boolean): PromiseAsyncResult<T>\n {\n return AsyncIterator.first(this, condition);\n }\n\n /**\n * If the condition function is undefined, then this function will return the first value in\n * the {@link AsyncIterator}. If this condition function is provided, then this function will return\n * the first value that matches the provided condition.\n * @param iterator The {@link AsyncIterator} to get the first value from.\n */\n public static first<T>(iterator: AsyncIterator<T>, condition?: (value: T) => (boolean | PromiseLike<boolean>)): PromiseAsyncResult<T>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n\n return PromiseAsyncResult.create(async () =>\n {\n await iterator.start();\n if (isUndefinedOrNull(condition))\n {\n if (!iterator.hasCurrent())\n {\n throw new EmptyError();\n }\n }\n else\n {\n while (iterator.hasCurrent() && !await condition(iterator.getCurrent()))\n {\n await iterator.next();\n }\n\n if (!iterator.hasCurrent())\n {\n throw new NotFoundError(\"No value was found in the AsyncIterator that matched the provided condition.\");\n }\n }\n return iterator.getCurrent();\n });\n }\n\n /**\n * If the condition function is undefined, then this function will return the last value in this\n * {@link AsyncIterator}. If this condition function is provided, then this function will return the\n * last value that matches the provided condition.\n * @param condition The condition that the returned value must satisfy.\n */\n public last(condition?: (value: T) => (boolean | PromiseLike<boolean>)): PromiseAsyncResult<T>\n {\n return AsyncIterator.last(this, condition);\n }\n\n /**\n * If the condition function is undefined, then this function will return the last value in the\n * {@link AsyncIterator}. If this condition function is provided, then this function will return the\n * last value that matches the provided condition.\n * @param iterator The {@link AsyncIterator} to get the last value from.\n */\n public static last<T>(iterator: AsyncIterator<T>, condition?: (value: T) => (boolean | PromiseLike<boolean>)): PromiseAsyncResult<T>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterator\");\n\n return PromiseAsyncResult.create(async () =>\n {\n await iterator.start();\n\n if (!iterator.hasCurrent())\n {\n throw new EmptyError();\n }\n\n let result: T;\n let found: boolean = false;\n do\n {\n if (!condition || await condition(iterator.getCurrent()))\n {\n result = iterator.getCurrent();\n found = true;\n }\n }\n while (await iterator.next());\n\n if (!found)\n {\n if (!condition)\n {\n throw new EmptyError();\n }\n else\n {\n throw new NotFoundError(\"No value was found in the AsyncIterator that matched the provided condition.\");\n }\n }\n\n return result!;\n });\n }\n\n /**\n * Find the maximum value in the provided {@link AsyncIterator}.\n * @param iterator The values to find the maximum of.\n */\n public static findMaximum<T extends Comparable<T>>(iterator: JavascriptAsyncIterator<T> | AsyncIterator<T>): PromiseAsyncResult<T>\n {\n PreCondition.assertNotUndefinedAndNotNull(iterator, \"iterable\");\n\n return PromiseAsyncResult.create(async () =>\n {\n if (isJavascriptAsyncIterator(iterator))\n {\n iterator = AsyncIterator.create(iterator as JavascriptAsyncIterator<T>);\n }\n\n let result: T = await iterator.first()\n .convertError(EmptyError, () => new EmptyError(\"Can't find the maximum of an empty Iterator.\"));\n while (await iterator.next())\n {\n const currentValue: T = iterator.getCurrent();\n if (result.lessThan(currentValue))\n {\n result = currentValue;\n }\n }\n\n return result;\n });\n }\n\n /**\n * Get a new {@link AsyncIterator} that wraps around this {@link AsyncIterator} and only\n * returns a maximum number of values from this {@link AsyncIterator}.\n * @param maximumToTake The maximum number of values to take from this {@link AsyncIterator}.\n */\n public take(maximumToTake: number): AsyncIterator<T>\n {\n return AsyncIterator.take(this, maximumToTake);\n }\n\n public static take<T>(iterator: AsyncIterator<T>, maximumToTake: number): AsyncIterator<T>\n {\n return TakeAsyncIterator.create(iterator, maximumToTake);\n }\n\n /**\n * Get a new {@link AsyncIterator} that wraps around this {@link AsyncIterator} and will skip the initial\n * provided number of values before beginning to return values.\n * @param maximumToSkip The maximum number of values to skip from this {@link AsyncIterator}.\n */\n public skip(maximumToSkip: number): AsyncIterator<T>\n {\n return AsyncIterator.skip(this, maximumToSkip);\n }\n\n public static skip<T>(iterator: AsyncIterator<T>, maximumToSkip: number): AsyncIterator<T>\n {\n return SkipAsyncIterator.create(iterator, maximumToSkip);\n }\n}","import { PromiseAsyncResult } from \"./promiseAsyncResult\";\nimport { isPromise, Type } from \"./types\";\n\n/**\n * A result object that adds extra behavior beyond the standard {@link Promise}.\n */\nexport abstract class AsyncResult<T> implements Promise<T>\n{\n public static create<T>(action: () => (T | Promise<T>)): AsyncResult<T>;\n public static create<T>(promise: Promise<T>): AsyncResult<T>;\n static create<T>(actionOrPromise: (() => (T | Promise<T>)) | Promise<T>): AsyncResult<T>\n {\n return PromiseAsyncResult.create<T>(isPromise<T>(actionOrPromise) ? actionOrPromise : new Promise<T>(actionOrPromise));\n }\n\n /**\n * Create a new {@link AsyncResult} that contains the provided value.\n * @param value The value to wrap in a {@link AsyncResult}.\n */\n public static value<T>(value: T): AsyncResult<T>\n {\n return PromiseAsyncResult.value(value);\n }\n\n /**\n * Create a new {@link AsyncResult} that contains the provided error.\n * @param error The error to wrap in a {@link AsyncResult}.\n */\n public static error<T>(error: Error): AsyncResult<T>\n {\n return PromiseAsyncResult.error<T>(error);\n }\n\n public static yield(): AsyncResult<void>\n {\n return PromiseAsyncResult.yield();\n }\n\n /**\n * Get a {@link AsyncResult} that runs the provided function if this {@link AsyncResult} is successful.\n * @param thenFunction The function to run if this {@link AsyncResult} is successful.\n */\n public abstract then<TResult1 = T, TResult2 = never>(onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null | undefined, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined): AsyncResult<TResult1 | TResult2>\n\n /**\n * Run the provided onValueFunction if this {@link AsyncResult} is successful. The value or error\n * contained by this {@link AsyncResult} will be contained by the returned {@link AsyncResult}.\n * @param onValueFunction The function to run if this {@link AsyncResult} is successful.\n */\n public abstract onValue(onValueFunction: (value: T) => (void | Promise<void>)): AsyncResult<T>\n\n /**\n * Run the provided catchFunction if this {@link AsyncResult} contains an error.\n * @param catchFunction The function to run if an error is caught.\n */\n public abstract catch<TResult = never>(onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null): AsyncResult<T | TResult>\n /**\n * Run the provided catchFunction if this {@link AsyncResult} contains an error of the provided type.\n * @param errorType The type of error to catch.\n * @param catchFunction The function to run if the error is caught.\n */\n public abstract catch<TError,TResult = never>(errorType: Type<TError>, onrejected: (reason: TError) => (TResult | PromiseLike<TResult>)): AsyncResult<T | TResult>\n\n /**\n * Run the provided onErrorFunction if this {@link AsyncResult} contains an error.\n * @param onErrorFunction The function to run if an error is found.\n */\n public abstract onError(onErrorFunction: (reason: unknown) => (void | PromiseLike<void>)): AsyncResult<T>;\n /**\n * Run the provided onErrorFunction if this {@link AsyncResult} contains an error of the provided\n * type.\n * @param errorType The type of error to respond to.\n * @param onErrorFunction The function to run if the error is found.\n */\n public abstract onError<TError>(errorType: Type<TError>, onErrorFunction: (reason: TError) => (void | PromiseLike<void>)): AsyncResult<T>;\n\n /**\n * Run the provided convertErrorFunction if this {@link AsyncResult} contains an error. The value\n * returned from the convertErrorFunction will be the error for the returned {@link AsyncResult}.\n * @param convertErrorFunction The function that will return the new error. \n */\n public abstract convertError(convertErrorFunction: (reason: unknown) => (unknown | PromiseLike<unknown>)): AsyncResult<T>;\n /**\n * Run the provided convertErrorFunction if this {@link AsyncResult} contains an error of the\n * provided type. The value returned from the convertErrorFunction will be the error for the\n * returned {@link AsyncResult}.\n * @param errorType The type of error to respond to.\n * @param convertErrorFunction The function that will return the new error. \n */\n public abstract convertError<TError>(errorType: Type<TError>, convertErrorFunction: (reason: TError) => (unknown | PromiseLike<unknown>)): AsyncResult<T>;\n\n public abstract finally(onfinally?: (() => (void | Promise<void>)) | null): AsyncResult<T>;\n\n readonly abstract [Symbol.toStringTag]: string;\n}\n","import { Disposable } from \"./disposable\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { SyncResult } from \"./syncResult\";\r\n\r\n/**\r\n * A {@link Disposable} type that can be configured with a function that will be invoked when the\r\n * object is disposed.\r\n */\r\nexport class SyncDisposable implements Disposable\r\n{\r\n private readonly disposedFunction: () => void;\r\n private disposed: boolean;\r\n\r\n protected constructor(disposedFunction: () => void)\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(disposedFunction, \"disposedFunction\");\r\n\r\n this.disposedFunction = disposedFunction;\r\n this.disposed = false;\r\n }\r\n\r\n /**\r\n * Create a new {@link Disposable} that will invoke the provided {@link Function} when it is\r\n * disposed.\r\n * @param disposedFunction The function to invoke when the returned {@link Disposable} is\r\n * disposed.\r\n */\r\n public static create(disposedFunction: () => void): SyncDisposable\r\n {\r\n return new SyncDisposable(disposedFunction);\r\n }\r\n\r\n public dispose(): SyncResult<boolean>\r\n {\r\n return SyncResult.create(() =>\r\n {\r\n const result: boolean = !this.disposed;\r\n if (result)\r\n {\r\n try\r\n {\r\n this.disposedFunction();\r\n }\r\n finally\r\n {\r\n this.disposed = true;\r\n }\r\n }\r\n return result;\r\n });\r\n }\r\n\r\n public isDisposed(): boolean\r\n {\r\n return this.disposed;\r\n }\r\n}","import { EqualFunctions } from \"./equalFunctions\";\nimport { Iterable } from \"./iterable\";\nimport { Iterator } from \"./iterator\";\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\nimport { List } from \"./list\";\nimport { PreCondition } from \"./preCondition\";\nimport { SyncResult } from \"./syncResult\";\nimport { ToStringFunctions } from \"./toStringFunctions\";\nimport { Type } from \"./types\";\n\n/**\n * A {@link List} of bytes.\n */\nexport class ByteList implements List<number>\n{\n private bytes: Uint8Array;\n private count: number;\n\n private constructor()\n {\n this.bytes = new Uint8Array(0);\n this.count = 0;\n }\n\n public static create(initialValues?: JavascriptIterable<number>): ByteList\n {\n const result: ByteList = new ByteList();\n if (initialValues)\n {\n result.addAll(initialValues);\n }\n return result;\n }\n\n public add(value: number): this\n {\n return List.add(this, value);\n }\n\n public addAll(values: JavascriptIterable<number>): this\n {\n return List.addAll(this, values);\n }\n\n public insert(index: number, value: number): this\n {\n PreCondition.assertInsertIndex(index, this.getCount().await(), \"index\");\n PreCondition.assertByte(value, \"value\");\n\n if (this.count < this.bytes.length)\n {\n if (index < this.count)\n {\n this.bytes.copyWithin(index + 1, index, this.count);\n }\n this.bytes[index] = value;\n }\n else\n {\n const newCapacity: number = (this.bytes.length * 2) + 1;\n const newBytes: Uint8Array = new Uint8Array(newCapacity);\n if (index > 0)\n {\n newBytes.set(this.bytes.subarray(0, index));\n }\n newBytes[index] = value;\n if (index < this.count)\n {\n newBytes.set(this.bytes.subarray(index), index + 1);\n }\n this.bytes = newBytes;\n }\n this.count++;\n\n return this;\n }\n\n public insertAll(index: number, values: JavascriptIterable<number>): this\n {\n return List.insertAll(this, index, values);\n }\n\n public remove(value: number, equalFunctions?: EqualFunctions): SyncResult<number>\n {\n PreCondition.assertByte(value, \"value\");\n\n return List.remove(this, value, equalFunctions);\n }\n\n public removeAt(index: number): SyncResult<number>\n {\n PreCondition.assertAccessIndex(index, this.count, \"index\");\n\n const result: number = this.bytes[index];\n this.bytes.copyWithin(index, index + 1, this.count);\n this.count--;\n\n return SyncResult.value(result);\n }\n\n public removeFirst(): SyncResult<number>\n {\n return List.removeFirst(this);\n }\n\n public removeLast(): SyncResult<number>\n {\n return List.removeLast(this);\n }\n\n public set(index: number, value: number): this\n {\n PreCondition.assertAccessIndex(index, this.getCount().await(), \"index\");\n PreCondition.assertByte(value, \"value\");\n\n this.bytes[index] = value;\n\n return this;\n }\n\n public iterate(): Iterator<number>\n {\n return Iterator.create(this.bytes[Symbol.iterator]().take(this.count));\n }\n\n public get(index: number): SyncResult<number>\n {\n PreCondition.assertAccessIndex(index, this.getCount().await(), \"index\");\n\n return SyncResult.value(this.bytes.at(index)!);\n }\n\n public toArray(): SyncResult<number[]>\n {\n return List.toArray(this);\n }\n\n public any(): SyncResult<boolean>\n {\n return this.getCount().then(count => count > 0);\n }\n\n public getCount(): SyncResult<number>\n {\n return SyncResult.value(this.count);\n }\n\n public equals(right: JavascriptIterable<number>, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return List.equals(this, right, equalFunctions);\n }\n\n public toString(toStringFunctions?: ToStringFunctions): string\n {\n return List.toString(this, toStringFunctions);\n }\n\n public concatenate(...toConcatenate: JavascriptIterable<number>[]): Iterable<number>\n {\n return List.concatenate(this, ...toConcatenate);\n }\n\n public map<TOutput>(mapping: (value: number) => TOutput | SyncResult<TOutput>): Iterable<TOutput>\n {\n return List.map(this, mapping);\n }\n\n public flatMap<TOutput>(mapping: (value: number) => JavascriptIterable<TOutput>): Iterable<TOutput>\n {\n return List.flatMap(this, mapping);\n }\n\n public where(condition: (value: number) => (boolean | SyncResult<boolean>)): Iterable<number>\n {\n return List.where(this, condition);\n }\n\n public instanceOf<TOutput extends number>(typeOrTypeCheck: Type<TOutput> | ((value: number) => value is TOutput)): Iterable<TOutput>\n {\n return List.instanceOf(this, typeOrTypeCheck);\n }\n\n public first(condition?: ((value: number) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<number>\n {\n return List.first(this, condition);\n }\n\n public last(condition?: ((value: number) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<number>\n {\n return List.last(this, condition);\n }\n\n public contains(value: number, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return List.contains(this, value, equalFunctions);\n }\n\n public [Symbol.iterator](): JavascriptIterator<number>\n {\n return List[Symbol.iterator](this);\n }\n}","import { ByteList } from \"./byteList\";\nimport { ByteReadStream } from \"./byteReadStream\";\nimport { ByteWriteStream } from \"./byteWriteStream\";\nimport { EmptyError } from \"./emptyError\";\nimport { PreCondition } from \"./preCondition\";\nimport { SyncResult } from \"./syncResult\";\nimport { isArray, isNumber, isUndefinedOrNull } from \"./types\";\n\n/**\n * A {@link ByteReadStream} and {@link ByteWriteStream} implementation that is implemented using a\n * {@link ByteList}.\n */\nexport class ByteListStream implements ByteReadStream, ByteWriteStream\n{\n private readonly list: ByteList;\n\n private constructor()\n {\n this.list = ByteList.create();\n }\n\n public static create(initialValues?: Uint8Array | number[]): ByteListStream\n {\n const result: ByteListStream = new ByteListStream();\n if (initialValues)\n {\n result.writeBytes(initialValues).await();\n }\n return result;\n }\n\n /**\n * Get the number of bytes that are available to be read.\n */\n public getAvailableByteCount(): number\n {\n return this.list.getCount().await();\n }\n\n public writeBytes(bytes: Uint8Array | number[], startIndex?: number, length?: number): SyncResult<number>\n {\n PreCondition.assertNotUndefinedAndNotNull(bytes, \"bytes\");\n\n if (isArray(bytes))\n {\n bytes = new Uint8Array(bytes);\n }\n if (isUndefinedOrNull(startIndex))\n {\n startIndex = 0;\n }\n if (isUndefinedOrNull(length))\n {\n length = bytes.length - startIndex;\n }\n\n PreCondition.assertInsertIndex(startIndex, bytes.length, \"startIndex\");\n PreCondition.assertBetween(0, length, bytes.length - startIndex, \"length\");\n\n this.list.addAll(bytes.subarray(startIndex, length + startIndex));\n\n return SyncResult.value(length);\n }\n\n public readBytes(count: number): SyncResult<Uint8Array>;\n public readBytes(output: Uint8Array, startIndex?: number, count?: number): SyncResult<number>;\n readBytes(countOrOutput: number | Uint8Array, startIndex?: number, count?: number): SyncResult<number> | SyncResult<Uint8Array>\n {\n let result: SyncResult<number> | SyncResult<Uint8Array>;\n if (isNumber(countOrOutput))\n {\n PreCondition.assertGreaterThanOrEqualTo(countOrOutput, 0, \"count\");\n\n if (!this.list.any().await())\n {\n result = SyncResult.error<Uint8Array>(new EmptyError());\n }\n else\n {\n const bytesReadCount: number = Math.min(countOrOutput, this.list.getCount().await());\n const output: Uint8Array = new Uint8Array(bytesReadCount);\n for (let i = 0; i < bytesReadCount; i++)\n {\n output[i] = this.list.removeFirst().await();\n }\n result = SyncResult.value(output);\n }\n }\n else\n {\n PreCondition.assertNotUndefinedAndNotNull(countOrOutput, \"output\");\n\n if (isUndefinedOrNull(startIndex))\n {\n startIndex = 0;\n }\n if (isUndefinedOrNull(count))\n {\n count = countOrOutput.length - startIndex;\n }\n\n PreCondition.assertInsertIndex(startIndex, countOrOutput.length, \"startIndex\");\n PreCondition.assertBetween(0, count, countOrOutput.length - startIndex, \"count\");\n\n if (!this.list.any().await())\n {\n result = SyncResult.error<number>(new EmptyError());\n }\n else\n {\n const bytesReadCount: number = Math.min(count, this.list.getCount().await());\n for (let i = 0; i < bytesReadCount; i++)\n {\n countOrOutput[startIndex + i] = this.list.removeFirst().await();\n }\n result = SyncResult.value(bytesReadCount);\n }\n }\n return result;\n }\n}","import { AsyncResult } from \"./asyncResult\";\n\n/**\n * A stream that reads bytes.\n */\nexport abstract class ByteReadStream\n{\n /**\n * Attempt to read the provided {@link count} number of bytes. Returns the bytes that were read.\n * The number of bytes returned may be less than the number requested.\n * @param count The number of bytes to attempt to read.\n */\n public abstract readBytes(count: number): AsyncResult<Uint8Array>;\n /**\n * Attempt to read bytes into the provided output array. Returns the number of bytes that were\n * read.\n * @param output The array that the read bytes will be written to.\n * @param startIndex The index in the {@link output} array to start writting the read bytes to.\n * Defaults to 0.\n * @param count The maximum number of bytes to read. Defaults to the length of the output array\n * minus the startIndex.\n */\n public abstract readBytes(output: Uint8Array, startIndex?: number, count?: number): AsyncResult<number>;\n}","import { AsyncResult } from \"./asyncResult\";\n\n/**\n * A stream that writes bytes.\n */\nexport abstract class ByteWriteStream\n{\n /**\n * Write the provided bytes to this {@link ByteWriteStream}.\n * @param bytes The bytes to write.\n * @param startIndex The index to start writing from.\n * @param length The number of bytes to write.\n * @returns The number of bytes that were written.\n */\n public abstract writeBytes(bytes: Uint8Array | number[], startIndex?: number, length?: number): AsyncResult<number>\n}","import { Iterator } from \"./iterator\";\r\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { SyncResult } from \"./syncResult\";\r\nimport { Type } from \"./types\";\r\n\r\n/**\r\n * An {@link Iterator} that iterates over the characters in a {@link string}.\r\n */\r\nexport class StringIterator implements Iterator<string>\r\n{\r\n private readonly value: string;\r\n private currentIndex: number;\r\n private started: boolean;\r\n\r\n private constructor(value: string)\r\n {\r\n this.value = value;\r\n this.currentIndex = 0;\r\n this.started = false;\r\n }\r\n\r\n public static create(value: string): StringIterator\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(value, \"value\");\r\n\r\n return new StringIterator(value);\r\n }\r\n\r\n public getCurrentIndex(): number\r\n {\r\n PreCondition.assertTrue(this.hasCurrent(), \"this.hasCurrent()\");\r\n\r\n return this.currentIndex;\r\n }\r\n\r\n public next(): SyncResult<boolean>\r\n {\r\n return SyncResult.create(() =>\r\n {\r\n if (!this.hasStarted())\r\n {\r\n this.started = true;\r\n }\r\n else if (this.hasCurrent())\r\n {\r\n this.currentIndex++;\r\n }\r\n return this.hasCurrent();\r\n });\r\n }\r\n\r\n public hasStarted(): boolean\r\n {\r\n return this.started;\r\n }\r\n\r\n public hasCurrent(): boolean\r\n {\r\n return this.hasStarted() && this.currentIndex < this.value.length;\r\n }\r\n\r\n public getCurrent(): string\r\n {\r\n PreCondition.assertTrue(this.hasCurrent(), \"this.hasCurrent()\");\r\n\r\n return this.value[this.currentIndex];\r\n }\r\n\r\n public start(): SyncResult<this>\r\n {\r\n return Iterator.start<string, this>(this);\r\n }\r\n\r\n public takeCurrent(): SyncResult<string>\r\n {\r\n return Iterator.takeCurrent(this);\r\n }\r\n\r\n public any(): SyncResult<boolean>\r\n {\r\n return Iterator.any(this);\r\n }\r\n\r\n public getCount(): SyncResult<number>\r\n {\r\n return Iterator.getCount(this);\r\n }\r\n\r\n public toArray(): SyncResult<string[]>\r\n {\r\n return Iterator.toArray(this);\r\n }\r\n\r\n public concatenate(...toConcatenate: JavascriptIterable<string>[]): Iterator<string>\r\n {\r\n return Iterator.concatenate(this, ...toConcatenate);\r\n }\r\n\r\n public map<TOutput>(mapping: (value: string) => (TOutput | SyncResult<TOutput>)): Iterator<TOutput>\r\n {\r\n return Iterator.map(this, mapping);\r\n }\r\n\r\n public flatMap<TOutput>(mapping: (value: string) => JavascriptIterable<TOutput>): Iterator<TOutput>\r\n {\r\n return Iterator.flatMap(this, mapping);\r\n }\r\n\r\n public first(): SyncResult<string>\r\n {\r\n return Iterator.first(this);\r\n }\r\n\r\n public last(): SyncResult<string>\r\n {\r\n return Iterator.last(this);\r\n }\r\n\r\n public where(condition: (value: string) => boolean): Iterator<string>\r\n {\r\n return Iterator.where(this, condition);\r\n }\r\n\r\n public whereInstanceOf<U extends string>(typeCheck: (value: string) => value is U): Iterator<U>\r\n {\r\n return Iterator.whereInstanceOf(this, typeCheck);\r\n }\r\n\r\n public whereInstanceOfType<U extends string>(type: Type<U>): Iterator<U>\r\n {\r\n return Iterator.whereInstanceOfType(this, type);\r\n }\r\n\r\n public take(maximumToTake: number): Iterator<string>\r\n {\r\n return Iterator.take(this, maximumToTake);\r\n }\r\n\r\n public skip(maximumToSkip: number): Iterator<string>\r\n {\r\n return Iterator.skip(this, maximumToSkip);\r\n }\r\n\r\n public [Symbol.iterator](): JavascriptIterator<string>\r\n {\r\n return Iterator[Symbol.iterator](this);\r\n }\r\n}","import { EqualFunctions } from \"./equalFunctions\";\nimport { Iterable } from \"./iterable\";\nimport { Iterator } from \"./iterator\";\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\nimport { List } from \"./list\";\nimport { PreCondition } from \"./preCondition\";\nimport { StringIterator } from \"./stringIterator\";\nimport { join } from \"./strings\";\nimport { SyncResult } from \"./syncResult\";\nimport { ToStringFunctions } from \"./toStringFunctions\";\nimport { isString, Type } from \"./types\";\n\nexport class CharacterList implements List<string>\n{\n private characters: string;\n\n private constructor(values?: JavascriptIterable<string> | string)\n {\n if (isString(values))\n {\n this.characters = values;\n }\n else if (values)\n {\n this.characters = join(\"\", values);\n }\n else\n {\n this.characters = \"\";\n }\n }\n\n public static create(values?: JavascriptIterable<string>): CharacterList\n {\n return new CharacterList(values);\n }\n\n public getCount(): SyncResult<number>\n {\n return SyncResult.value(this.characters.length);\n }\n\n public insert(index: number, value: string): this\n {\n PreCondition.assertInsertIndex(index, this.getCount().await(), \"index\");\n PreCondition.assertCharacter(value, \"value\");\n\n if (index === 0)\n {\n this.characters = value + this.characters;\n }\n else if (index === this.getCount().await())\n {\n this.characters += value;\n }\n else\n {\n this.characters = this.characters.slice(0, index) + value + this.characters.slice(index);\n }\n\n return this;\n }\n\n public removeAt(index: number): SyncResult<string>\n {\n PreCondition.assertAccessIndex(index, this.getCount().await(), \"index\");\n\n const result: string = this.get(index).await();\n this.characters =\n (index === 0 ? \"\" : this.characters.slice(0, index)) +\n (index === this.getCount().await() - 1 ? \"\" : this.characters.slice(index + 1));\n\n return SyncResult.value(result);\n }\n\n public set(index: number, value: string): this\n {\n PreCondition.assertAccessIndex(index, this.getCount().await(), \"index\");\n PreCondition.assertCharacter(value, \"value\");\n\n this.characters =\n (index === 0 ? \"\" : this.characters.slice(0, index)) +\n value +\n (index === this.getCount().await() - 1 ? \"\" : this.characters.slice(index + 1));\n\n return this;\n }\n\n public iterate(): Iterator<string>\n {\n return StringIterator.create(this.characters);\n }\n\n public get(index: number): SyncResult<string>\n {\n PreCondition.assertAccessIndex(index, this.getCount().await(), \"index\");\n\n return SyncResult.value(this.characters.charAt(index));\n }\n\n public add(value: string): this\n {\n return List.add(this, value);\n }\n\n public addAll(values: JavascriptIterable<string>): this\n {\n return List.addAll(this, values);\n }\n\n public insertAll(index: number, values: JavascriptIterable<string>): this\n {\n return List.insertAll(this, index, values);\n }\n\n public remove(value: string, equalFunctions?: EqualFunctions): SyncResult<string>\n {\n return List.remove(this, value, equalFunctions);\n }\n\n public removeFirst(): SyncResult<string>\n {\n return List.removeFirst(this);\n }\n\n public removeLast(): SyncResult<string>\n {\n return List.removeLast(this);\n }\n\n public toArray(): SyncResult<string[]>\n {\n return List.toArray(this);\n }\n\n public any(): SyncResult<boolean>\n {\n return List.any(this);\n }\n\n public equals(right: JavascriptIterable<string>, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return List.equals(this, right, equalFunctions);\n }\n\n public toString(toStringFunctions?: ToStringFunctions): string\n {\n return List.toString(this, toStringFunctions);\n }\n\n public concatenate(...toConcatenate: JavascriptIterable<string>[]): Iterable<string>\n {\n return List.concatenate(this, ...toConcatenate);\n }\n\n public map<TOutput>(mapping: (value: string) => TOutput | SyncResult<TOutput>): Iterable<TOutput>\n {\n return List.map(this, mapping);\n }\n\n public flatMap<TOutput>(mapping: (value: string) => JavascriptIterable<TOutput>): Iterable<TOutput>\n {\n return List.flatMap(this, mapping);\n }\n\n public where(condition: (value: string) => (boolean | SyncResult<boolean>)): Iterable<string>\n {\n return List.where(this, condition);\n }\n\n public instanceOf<TOutput extends string>(typeOrTypeCheck: Type<TOutput> | ((value: string) => value is TOutput)): Iterable<TOutput>\n {\n return List.instanceOf(this, typeOrTypeCheck);\n }\n\n public first(condition?: (value: string) => (boolean | SyncResult<boolean>)): SyncResult<string>\n {\n return List.first(this, condition);\n }\n\n public last(condition?: (value: string) => (boolean | SyncResult<boolean>)): SyncResult<string>\n {\n return List.last(this, condition);\n }\n\n public contains(value: string, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return List.contains(this, value, equalFunctions);\n }\n\n public [Symbol.iterator](): JavascriptIterator<string>\n {\n return List[Symbol.iterator](this);\n }\n}","import { PreCondition } from \"./preCondition\";\nimport { AsyncResult } from \"./asyncResult\";\nimport { SyncResult } from \"./syncResult\";\n\nexport abstract class CharacterReadStream\n{\n /**\n * Read a single character from this stream.\n */\n public abstract readCharacter(): AsyncResult<string>;\n\n public readCharacters(count: number): AsyncResult<string>\n {\n return CharacterReadStream.readCharacters(this, count);\n }\n\n public static readCharacters(readStream: CharacterReadStream, count: number): AsyncResult<string>\n {\n let characters: string = \"\";\n function readUntilCount(countRemaining: number): AsyncResult<string>\n {\n return readStream.readCharacter()\n .then((character: string) =>\n {\n characters += character;\n return countRemaining === 0\n ? SyncResult.value(characters)\n : readUntilCount(countRemaining - 1);\n });\n }\n return readUntilCount(count);\n }\n\n /**\n * Read characters from this stream until the provided {@link searchString} is found or the end\n * of the stream is reached. The {@link searchString} will be included in the returned string if\n * it is found..\n * @param searchString The string to search for.\n */\n public readUntil(searchString: string): AsyncResult<string>\n {\n return CharacterReadStream.readUntil(this, searchString);\n }\n\n public static readUntil(readStream: CharacterReadStream, searchString: string): AsyncResult<string>\n {\n PreCondition.assertNotUndefinedAndNotNull(readStream, \"readStream\");\n PreCondition.assertNotEmpty(searchString, \"searchString\");\n\n let characters: string = \"\";\n function readUntilSearchString(): AsyncResult<string>\n {\n return readStream.readCharacter()\n .then((character: string) =>\n {\n characters += character;\n return characters.endsWith(searchString)\n ? SyncResult.value(characters)\n : readUntilSearchString();\n });\n }\n return readUntilSearchString();\n }\n\n /**\n * Read a sequence of characters from this stream until either a newline character ('\\\\n') or\n * the end of the stream is reached. Terminating newline characters will be included in the\n * returned string.\n */\n public readLine(): AsyncResult<string>\n {\n return CharacterReadStream.readLine(this);\n }\n\n public static readLine(readStream: CharacterReadStream): AsyncResult<string>\n {\n PreCondition.assertNotUndefinedAndNotNull(readStream, \"readStream\");\n\n return readStream.readUntil(\"\\n\");\n }\n}","import { join } from \"./strings\";\r\n\r\n/**\r\n * An {@link Error} that is thrown when a post-condition fails.\r\n */\r\nexport class PostConditionError extends Error\r\n{\r\n public constructor(...message: string[])\r\n {\r\n super(join(\"\\n\", message));\r\n }\r\n}","import { JavascriptIterable } from \"./javascript\";\r\nimport { MutableCondition } from \"./mutableCondition\";\r\nimport { PostConditionError } from \"./postConditionError\";\r\nimport { Type } from \"./types\";\r\n\r\n/**\r\n * A type that encapsulates conditions that should exist before an operation takes place.\r\n */\r\nexport abstract class PostCondition\r\n{\r\n private static condition: MutableCondition | undefined;\r\n\r\n private static getCondition(): MutableCondition\r\n {\r\n if (PostCondition.condition === undefined)\r\n {\r\n PostCondition.condition = MutableCondition.create()\r\n .setCreateErrorFunction((message: string) =>\r\n {\r\n return new PostConditionError(message);\r\n });\r\n }\r\n return PostCondition.condition;\r\n }\r\n\r\n /**\r\n * Assert that the provided value is undefined.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public static assertUndefined(value: unknown, expression?: string, message?: string): asserts value is undefined\r\n {\r\n return PostCondition.getCondition().assertUndefined(value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is not undefined and not null.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public static assertNotUndefined<T>(value: T, expression?: string, message?: string): asserts value is NonNullable<T>\r\n {\r\n return PostCondition.getCondition().assertNotUndefined(value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is not undefined and not null.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public static assertNotUndefinedAndNotNull<T>(value: T, expression?: string, message?: string): asserts value is NonNullable<T>\r\n {\r\n return PostCondition.getCondition().assertNotUndefinedAndNotNull(value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is true.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public static assertTrue(value: boolean, expression?: string, message?: string): asserts value is true\r\n {\r\n return PostCondition.getCondition().assertTrue(value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is false.\r\n * @param value The value to check.\r\n * @param expression The name of the expression that produced the value.\r\n * @param message An additional message that will be included with the error.\r\n */\r\n public static assertFalse(value: boolean, expression?: string, message?: string): asserts value is false\r\n {\r\n return PostCondition.getCondition().assertFalse(value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided actual value is the same as the provided expected value.\r\n * @param expected The expected value.\r\n * @param actual The actual value.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertSame<T>(expected: T, actual: T, expression?: string, message?: string): void\r\n {\r\n return PostCondition.getCondition().assertSame(expected, actual, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided actual value is not the same as the provided expected value.\r\n * @param expected The expected value.\r\n * @param actual The actual value.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertNotSame<T>(expected: T, actual: T, expression?: string, message?: string): void\r\n {\r\n return PostCondition.getCondition().assertNotSame(expected, actual, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided actual value is equal to the provided expected value.\r\n * @param expected The expected value.\r\n * @param actual The actual value.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertEqual<T>(expected: T, actual: T, expression?: string, message?: string): void\r\n {\r\n return PostCondition.getCondition().assertEqual(expected, actual, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided actual value is not equal to the provided expected value.\r\n * @param notExpected The not expected value.\r\n * @param actual The actual value.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertNotEqual<T>(notExpected: T, actual: T, expression?: string, message?: string): void\r\n {\r\n return PostCondition.getCondition().assertNotEqual(notExpected, actual, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is not empty.\r\n * @param value The value to check.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertNotEmpty(value: JavascriptIterable<unknown> | string | undefined | null, expression?: string, message?: string): void\r\n {\r\n return PostCondition.getCondition().assertNotEmpty(value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is less than the provided upperBound.\r\n * @param value The value to check.\r\n * @param upperBound The upperBound that the value must be less than.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertLessThan(value: number, upperBound: number, expression?: string, message?: string): void\r\n {\r\n return PostCondition.getCondition().assertLessThan(value, upperBound, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is less than or equal to the provided upperBound.\r\n * @param value The value to check.\r\n * @param upperBound The upperBound that the value must be less than.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertLessThanOrEqualTo(value: number, upperBound: number, expression?: string, message?: string): void\r\n {\r\n return PostCondition.getCondition().assertLessThanOrEqualTo(value, upperBound, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is greater than or equal to the provided lowerBound.\r\n * @param value The value to check.\r\n * @param lowerBound The lowerBound that the value must be greater than or equal to.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertGreaterThanOrEqualTo(value: number, lowerBound: number, expression?: string, message?: string): void\r\n {\r\n return PostCondition.getCondition().assertGreaterThanOrEqualTo(value, lowerBound, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is greater than the provided lowerBound.\r\n * @param value The value to check.\r\n * @param lowerBound The lowerBound that the value must be greater than.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertGreaterThan(value: number, lowerBound: number, expression?: string, message?: string): void\r\n {\r\n return PostCondition.getCondition().assertGreaterThan(value, lowerBound, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the value is greater than or equal to the lowerBound and less than or equal to\r\n * the upperBound.\r\n * @param lowerBound The lowerBound that the value must be greater than or equal to.\r\n * @param value The value to check.\r\n * @param upperBound The upperBound that the value must be less than or equal to.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertBetween(lowerBound: number, value: number, upperBound: number, expression?: string, message?: string): void\r\n {\r\n return PostCondition.getCondition().assertBetween(lowerBound, value, upperBound, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the index is within the access bounds of an indexable with the provided count.\r\n * @param index The index to check.\r\n * @param count The number of elements in the indexable.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertAccessIndex(index: number, count: number, expression?: string, message?: string): void\r\n {\r\n return PostCondition.getCondition().assertAccessIndex(index, count, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the index is within the insertion bounds of a {@link List} with the provided count.\r\n * @param index The index to check.\r\n * @param count The number of elements in the indexable.\r\n * @param expression The expression that produced the actual value.\r\n * @param message An optional message that describes the scenario.\r\n */\r\n public static assertInsertIndex(index: number, count: number, expression?: string, message?: string): void\r\n {\r\n return PostCondition.getCondition().assertInsertIndex(index, count, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the value is one of the possibilities.\r\n * @param possibilities The possible values that the value can be.\r\n * @param value The value to check.\r\n * @param expression The expression that produced the value.\r\n * @param message An optional error message.\r\n */\r\n public static assertOneOf<T>(possibilities: JavascriptIterable<T>, value: T, expression?: string, message?: string): void\r\n {\r\n return PostCondition.getCondition().assertOneOf(possibilities, value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the value is within the bounds of a byte.\r\n * @param value The value to check.\r\n * @param expression The expression that produced the value.\r\n * @param message An optional error message.\r\n */\r\n public static assertByte(value: number, expression?: string, message?: string): void\r\n {\r\n return PostCondition.getCondition().assertByte(value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the value is an integer.\r\n * @param value The value to check.\r\n * @param expression The expression that produced the value.\r\n * @param message An optional error message.\r\n */\r\n public static assertInteger(value: number, expression?: string, message?: string): void\r\n {\r\n return PostCondition.getCondition().assertInteger(value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the value is a characer (single character string).\r\n * @param value The value to check.\r\n * @param expression The expression that produced the value.\r\n * @param message An optional error message.\r\n */\r\n public static assertCharacter(value: string, expression?: string, message?: string): void\r\n {\r\n return PostCondition.getCondition().assertCharacter(value, expression, message);\r\n }\r\n\r\n /**\r\n * Assert that the provided value is an instance of the provided {@link Type}.\r\n * @param value The value to check.\r\n * @param type The {@link Type} to check.\r\n * @param expression The expression that produced the value.\r\n * @param message An optional error message.\r\n */\r\n public assertInstanceOf<T>(value: unknown, type: Type<T>, typeCheck?: (value: unknown) => value is T, expression?: string, message?: string): asserts value is T;\r\n public assertInstanceOf<T>(parameters: { value: unknown, type: Type<T>, typeCheck?: (value: unknown) => value is T, expression?: string, message?: string }): void;\r\n assertInstanceOf<T>(parametersOrValue: unknown | { value: unknown, type: Type<T>, typeCheck?: (value: unknown) => value is T, expression?: string, message?: string }, type?: Type<T>, typeCheck?: (value: unknown) => value is T, expression?: string, message?: string): void\r\n {\r\n return PostCondition.getCondition().assertInstanceOf(parametersOrValue, type, typeCheck, expression, message);\r\n }\r\n}","import { PromiseAsyncResult } from \"./promiseAsyncResult\";\r\nimport { PostCondition } from \"./postCondition\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { AsyncResult } from \"./asyncResult\";\r\n\r\nexport abstract class CharacterWriteStream\r\n{\r\n /**\r\n * Write the provided text to this {@link CharacterWriteStream}.\r\n * @param text The text to write.\r\n * @returns The number of characters that were written.\r\n */\r\n public abstract writeString(text: string): AsyncResult<number>\r\n\r\n /**\r\n * Write the provided text (if provided) and then write a newline character sequence to this\r\n * {@link CharacterWriteStream}.\r\n * @param text The optional text to write before the newline character sequence.\r\n * @returns The number of characters that were written.\r\n */\r\n public writeLine(text?: string): AsyncResult<number>\r\n {\r\n return CharacterWriteStream.writeLine(this, text);\r\n }\r\n\r\n public static writeLine(writeStream: CharacterWriteStream, text?: string): AsyncResult<number>\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(writeStream, \"writeStream\");\r\n\r\n return PromiseAsyncResult.create(async () =>\r\n {\r\n let result: number = 0;\r\n\r\n if (text)\r\n {\r\n result += await writeStream.writeString(text);\r\n }\r\n result += await writeStream.writeString(\"\\n\");\r\n\r\n PostCondition.assertGreaterThan(result, 0, \"result\");\r\n\r\n return result;\r\n });\r\n }\r\n}","import { CharacterList } from \"./characterList\";\nimport { CharacterReadStream } from \"./characterReadStream\";\nimport { CharacterWriteStream } from \"./characterWriteStream\";\nimport { EmptyError } from \"./emptyError\";\nimport { JavascriptIterable } from \"./javascript\";\nimport { PreCondition } from \"./preCondition\";\nimport { AsyncResult } from \"./asyncResult\";\nimport { join } from \"./strings\";\nimport { SyncResult } from \"./syncResult\";\nimport { isNumber, isString, isUndefinedOrNull } from \"./types\";\n\n/**\n * A {@link CharacterReadStream} and {@link CharacterWriteStream} implementation that is implemented using a\n * {@link CharacterList}.\n */\nexport class CharacterListStream implements CharacterReadStream, CharacterWriteStream\n{\n private readonly list: CharacterList;\n\n private constructor()\n {\n this.list = CharacterList.create();\n }\n\n public static create(initialValues?: JavascriptIterable<string>): CharacterListStream\n {\n const result: CharacterListStream = new CharacterListStream();\n if (initialValues)\n {\n result.writeCharacters(initialValues).await();\n }\n return result;\n }\n\n public writeCharacters(characters: JavascriptIterable<string>, startIndex?: number, length?: number): SyncResult<number>\n {\n PreCondition.assertNotUndefinedAndNotNull(characters, \"characters\");\n\n const characterString: string = isString(characters) ? characters : join(\"\", characters);\n if (isUndefinedOrNull(startIndex))\n {\n startIndex = 0;\n }\n if (isUndefinedOrNull(length))\n {\n length = characterString.length - startIndex;\n }\n\n PreCondition.assertInsertIndex(startIndex, characterString.length, \"startIndex\");\n PreCondition.assertBetween(0, length, characterString.length - startIndex, \"length\");\n\n this.list.addAll(characterString.slice(startIndex, length + startIndex));\n\n return SyncResult.value(length);\n }\n\n\n public writeString(text: string): AsyncResult<number>\n {\n this.list.addAll(text);\n\n return SyncResult.value(text.length);\n }\n\n public writeLine(text?: string): AsyncResult<number>\n {\n return CharacterWriteStream.writeLine(this, text);\n }\n\n /**\n * Get the number of characters that are available to be read.\n */\n public getAvailableCharacterCount(): number\n {\n return this.list.getCount().await();\n }\n\n public readCharacter(): AsyncResult<string>\n {\n return !this.list.any().await()\n ? SyncResult.error(new EmptyError())\n : SyncResult.value(this.list.removeFirst().await());\n }\n \n public readCharacters(count: number): SyncResult<string>;\n public readCharacters(output: string[], startIndex?: number, count?: number): SyncResult<number>;\n readCharacters(countOrOutput: number | string[], startIndex?: number, count?: number): SyncResult<number> | SyncResult<string>\n {\n let result: SyncResult<number> | SyncResult<string>;\n if (isNumber(countOrOutput))\n {\n PreCondition.assertGreaterThanOrEqualTo(countOrOutput, 0, \"count\");\n\n if (!this.list.any().await())\n {\n result = SyncResult.error<string>(new EmptyError());\n }\n else\n {\n const bytesReadCount: number = Math.min(countOrOutput, this.list.getCount().await());\n let output: string = \"\";\n for (let i = 0; i < bytesReadCount; i++)\n {\n output += this.list.removeFirst().await();\n }\n result = SyncResult.value(output);\n }\n }\n else\n {\n PreCondition.assertNotUndefinedAndNotNull(countOrOutput, \"output\");\n\n if (isUndefinedOrNull(startIndex))\n {\n startIndex = 0;\n }\n if (isUndefinedOrNull(count))\n {\n count = countOrOutput.length - startIndex;\n }\n\n PreCondition.assertInsertIndex(startIndex, countOrOutput.length, \"startIndex\");\n PreCondition.assertBetween(0, count, countOrOutput.length - startIndex, \"count\");\n\n if (!this.list.any().await())\n {\n result = SyncResult.error<number>(new EmptyError());\n }\n else\n {\n const bytesReadCount: number = Math.min(count, this.list.getCount().await());\n for (let i = 0; i < bytesReadCount; i++)\n {\n countOrOutput[startIndex + i] = this.list.removeFirst().await();\n }\n result = SyncResult.value(bytesReadCount);\n }\n }\n return result;\n }\n\n public readUntil(searchString: string): AsyncResult<string>\n {\n return CharacterReadStream.readUntil(this, searchString);\n }\n\n public readLine(): AsyncResult<string>\n {\n return CharacterReadStream.readLine(this);\n }\n}","import { AsyncIterator } from \"./asyncIterator\";\nimport { PromiseAsyncResult } from \"./promiseAsyncResult\";\nimport { CharacterReadStream } from \"./characterReadStream\";\nimport { JavascriptAsyncIterator } from \"./javascript\";\nimport { NotFoundError } from \"./notFoundError\";\nimport { PreCondition } from \"./preCondition\";\nimport { Type } from \"./types\";\n\nexport class CharacterReadStreamAsyncIterator implements AsyncIterator<string>\n{\n private readonly readStream: CharacterReadStream;\n private current: string;\n private started: boolean;\n\n private constructor(readStream: CharacterReadStream)\n {\n PreCondition.assertNotUndefinedAndNotNull(readStream, \"readStream\");\n\n this.readStream = readStream;\n this.current = \"\";\n this.started = false;\n }\n\n public static create(readStream: CharacterReadStream): CharacterReadStreamAsyncIterator\n {\n return new CharacterReadStreamAsyncIterator(readStream);\n }\n\n public next(): PromiseAsyncResult<boolean>\n {\n return PromiseAsyncResult.create(async () =>\n {\n this.started = true;\n\n this.current = await this.readStream.readCharacter()\n .catch(NotFoundError, () => \"\");\n\n return this.hasCurrent();\n });\n }\n\n public hasStarted(): boolean\n {\n return this.started;\n }\n\n public hasCurrent(): boolean\n {\n return this.current !== \"\";\n }\n\n public getCurrent(): string\n {\n PreCondition.assertTrue(this.hasCurrent(), \"this.hasCurrent()\");\n\n return this.current;\n }\n\n public start(): PromiseAsyncResult<this>\n {\n return AsyncIterator.start<string,this>(this);\n }\n\n public takeCurrent(): PromiseAsyncResult<string>\n {\n return AsyncIterator.takeCurrent(this);\n }\n\n public any(): PromiseAsyncResult<boolean>\n {\n return AsyncIterator.any(this);\n }\n\n public getCount(): PromiseAsyncResult<number>\n {\n return AsyncIterator.getCount(this);\n }\n\n public toArray(): PromiseAsyncResult<string[]>\n {\n return AsyncIterator.toArray(this);\n }\n\n public where(condition: (value: string) => boolean | PromiseLike<boolean>): AsyncIterator<string>\n {\n return AsyncIterator.where(this, condition);\n }\n\n public map<TOutput>(mapping: (value: string) => (TOutput | PromiseLike<TOutput>)): AsyncIterator<TOutput>\n {\n return AsyncIterator.map(this, mapping);\n }\n\n public whereInstanceOf<U extends string>(typeCheck: (value: string) => value is U): AsyncIterator<U>\n {\n return AsyncIterator.whereInstanceOf(this, typeCheck);\n }\n\n public whereInstanceOfType<U extends string>(type: Type<U>): AsyncIterator<U>\n {\n return AsyncIterator.whereInstanceOfType(this, type);\n }\n\n public first(condition?: (value: string) => (boolean | PromiseLike<boolean>)): PromiseAsyncResult<string>\n {\n return AsyncIterator.first(this, condition);\n }\n\n public last(condition?: (value: string) => (boolean | PromiseLike<boolean>)): PromiseAsyncResult<string>\n {\n return AsyncIterator.last(this, condition);\n }\n\n public take(maximumToTake: number): AsyncIterator<string>\n {\n return AsyncIterator.take(this, maximumToTake);\n }\n\n public skip(maximumToSkip: number): AsyncIterator<string>\n {\n return AsyncIterator.skip(this, maximumToSkip);\n }\n\n public [Symbol.asyncIterator](): JavascriptAsyncIterator<string>\n {\n return AsyncIterator[Symbol.asyncIterator](this);\n }\n}","/**\r\n * An individual parameter from a {@link CommandLineParameters} object.\r\n */\r\nexport class CommandLineParameter<T>\r\n{\r\n /**\r\n * The full name of this {@link CommandLineParameter}.\r\n */\r\n private readonly name: string;\r\n /**\r\n * The description for this {@link CommandLineParameter}.\r\n */\r\n private readonly description: string;\r\n /**\r\n * The function that can be invoked to get this {@link CommandLineParameter}'s value.\r\n */\r\n private readonly valueGetter: () => T;\r\n\r\n private constructor(name: string, description: string, valueGetter: () => T)\r\n {\r\n this.name = name;\r\n this.description = description;\r\n this.valueGetter = valueGetter;\r\n }\r\n\r\n /**\r\n * Create a new {@link CommandLineParameter}.\r\n * @param name The full name of the {@link CommandLineParameter}.\r\n * @param description The description for the {@link CommandLineParameter}.\r\n * @param valueGetter The function that will be used to get the returned\r\n * {@link CommandLineParameter}'s value.\r\n */\r\n public static create<T>(name: string, description: string, valueGetter: () => T)\r\n {\r\n return new CommandLineParameter<T>(name, description, valueGetter);\r\n }\r\n\r\n /**\r\n * Get the value for this {@link CommandLineParameter}.\r\n */\r\n public getValue(): T\r\n {\r\n return this.valueGetter();\r\n }\r\n}","import { JavascriptIterable } from \"./javascript\";\r\n\r\n/**\r\n * A class that can be used to define and interact with an application's command line interface.\r\n */\r\nexport class CommandLineParameters\r\n{\r\n private readonly args: JavascriptIterable<string>;\r\n\r\n private constructor(argv: JavascriptIterable<string>)\r\n {\r\n this.args = argv\r\n }\r\n\r\n public static create(args: JavascriptIterable<string>): CommandLineParameters\r\n {\r\n return new CommandLineParameters(args)\r\n }\r\n\r\n \r\n}","import { Comparison } from \"./comparison\";\r\nimport { PreCondition } from \"./preCondition\";\r\n\r\n/**\r\n * An type that can be compared against another type.\r\n */\r\nexport abstract class Comparable<T>\r\n{\r\n protected constructor()\r\n {\r\n }\r\n\r\n /**\r\n * Compare this value against the provided value.\r\n * @param value The value to compare against.\r\n */\r\n public abstract compareTo(value: T): Comparison;\r\n\r\n /**\r\n * Get whether this value is less than the provided value.\r\n * @param value The value to compare against.\r\n */\r\n public lessThan(value: T): boolean\r\n {\r\n return Comparable.lessThan(this, value);\r\n }\r\n\r\n /**\r\n * Get whether the left value is less than the right value.\r\n * @param left The left value in the comparison.\r\n * @param right The right value in the comparison.\r\n */\r\n public static lessThan<T>(left: Comparable<T>, right: T): boolean\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(left, \"left\");\r\n\r\n return left.compareTo(right) === Comparison.LessThan;\r\n }\r\n\r\n /**\r\n * Get whether this value is less than or equal to the provided value.\r\n * @param value The value to compare against.\r\n */\r\n public lessThanOrEqualTo(value: T): boolean\r\n {\r\n return Comparable.lessThanOrEqualTo(this, value);\r\n }\r\n\r\n /**\r\n * Get whether the left value is less than or equal to the right value.\r\n * @param left The left value in the comparison.\r\n * @param right The right value in the comparison.\r\n */\r\n public static lessThanOrEqualTo<T>(left: Comparable<T>, right: T): boolean\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(left, \"left\");\r\n\r\n return left.compareTo(right) !== Comparison.GreaterThan;\r\n }\r\n\r\n /**\r\n * Get whether this value equals the provided value.\r\n * @param value The value to compare against.\r\n */\r\n public equals(value: T): boolean\r\n {\r\n return Comparable.equals(this, value);\r\n }\r\n\r\n /**\r\n * Get whether the left value equals the right value.\r\n * @param left The left value in the comparison.\r\n * @param right The right value in the comparison.\r\n */\r\n public static equals<T>(left: Comparable<T>, right: T): boolean\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(left, \"left\");\r\n\r\n return left.compareTo(right) === Comparison.Equal;\r\n }\r\n\r\n /**\r\n * Get whether this value is not equal to the provided value.\r\n * @param value The value to compare against.\r\n */\r\n public notEquals(value: T): boolean\r\n {\r\n return Comparable.notEquals(this, value);\r\n }\r\n\r\n /**\r\n * Get whether the left value is not equal to the right value.\r\n * @param left The left value in the comparison.\r\n * @param right The right value in the comparison.\r\n */\r\n public static notEquals<T>(left: Comparable<T>, right: T): boolean\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(left, \"left\");\r\n\r\n return left.compareTo(right) !== Comparison.Equal;\r\n }\r\n\r\n /**\r\n * Get whether this value is greater than or equal to the provided value.\r\n * @param value The value to compare against.\r\n */\r\n public greaterThanOrEqualTo(value: T): boolean\r\n {\r\n return Comparable.greaterThanOrEqualTo(this, value);\r\n }\r\n\r\n /**\r\n * Get whether the left value is greater than or equal to the right value.\r\n * @param left The left value in the comparison.\r\n * @param right The right value in the comparison.\r\n */\r\n public static greaterThanOrEqualTo<T>(left: Comparable<T>, right: T): boolean\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(left, \"left\");\r\n\r\n return left.compareTo(right) !== Comparison.LessThan;\r\n }\r\n\r\n /**\r\n * Get whether this value is greater than the provided value.\r\n * @param value The value to compare against.\r\n */\r\n public greaterThan(value: T): boolean\r\n {\r\n return Comparable.greaterThan(this, value);\r\n }\r\n\r\n /**\r\n * Get whether the left value is greater than the right value.\r\n * @param left The left value in the comparison.\r\n * @param right The right value in the comparison.\r\n */\r\n public static greaterThan<T>(left: Comparable<T>, right: T): boolean\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(left, \"left\");\r\n\r\n return left.compareTo(right) === Comparison.GreaterThan;\r\n }\r\n}","import { PromiseAsyncResult } from \"./promiseAsyncResult\";\r\nimport { CharacterWriteStream } from \"./characterWriteStream\";\r\nimport { PreCondition } from \"./preCondition\";\r\n\r\nexport class NodeJSCharacterWriteStream extends CharacterWriteStream\r\n{\r\n private readonly nodeJSWriteStream: NodeJS.WriteStream;\r\n\r\n private constructor(nodeJSWriteStream: NodeJS.WriteStream)\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(nodeJSWriteStream, \"nodeJSWriteStream\");\r\n\r\n super();\r\n\r\n this.nodeJSWriteStream = nodeJSWriteStream;\r\n }\r\n\r\n public static create(nodeJSWriteStream: NodeJS.WriteStream): NodeJSCharacterWriteStream\r\n {\r\n return new NodeJSCharacterWriteStream(nodeJSWriteStream);\r\n }\r\n\r\n public writeString(text: string): PromiseAsyncResult<number>\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(text, \"text\");\r\n\r\n return PromiseAsyncResult.create(new Promise<number>((resolve, reject) =>\r\n {\r\n this.nodeJSWriteStream.write(text, (error?: Error | null) =>\r\n {\r\n if (error)\r\n {\r\n reject(error);\r\n }\r\n else\r\n {\r\n resolve(text.length);\r\n }\r\n });\r\n }));\r\n }\r\n}","import { PreCondition } from \"./preCondition\";\r\nimport { hasProperty, isFunction, isObject } from \"./types\";\r\n\r\nexport class Property<T>\r\n{\r\n private readonly getter: () => T;\r\n private readonly setter: (value: T) => void;\r\n\r\n private constructor(getter: () => T, setter: (value: T) => void)\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(getter, \"getter\");\r\n PreCondition.assertNotUndefinedAndNotNull(setter, \"setter\");\r\n\r\n this.getter = getter;\r\n this.setter = setter;\r\n }\r\n\r\n public static create<T>(getter: () => T, setter: (value: T) => void): Property<T>;\r\n public static create<T>(options: { getter: () => T, setter: (value: T) => void }): Property<T>;\r\n public static create<T>(initialValue: T): Property<T>;\r\n static create<T>(getterOptionsOrInitialValue: (() => T) | { getter: () => T, setter: (value: T) => void } | T, setter?: (value: T) => void): Property<T>\r\n {\r\n let getter: () => T;\r\n if (isFunction(getterOptionsOrInitialValue))\r\n {\r\n getter = getterOptionsOrInitialValue;\r\n }\r\n else if (isObject(getterOptionsOrInitialValue) &&\r\n hasProperty(getterOptionsOrInitialValue, \"getter\") &&\r\n hasProperty(getterOptionsOrInitialValue, \"setter\"))\r\n {\r\n const options: { getter: () => T, setter: (value: T) => void } = getterOptionsOrInitialValue;\r\n getter = options.getter;\r\n setter = options.setter;\r\n }\r\n else\r\n {\r\n let initialValue: T = getterOptionsOrInitialValue;\r\n getter = () => { return initialValue; };\r\n setter = (value: T) => { initialValue = value; };\r\n }\r\n PreCondition.assertNotUndefinedAndNotNull(getter, \"getter\");\r\n PreCondition.assertNotUndefinedAndNotNull(setter, \"setter\");\r\n\r\n return new Property<T>(getter, setter);\r\n }\r\n\r\n public getValue(): T\r\n {\r\n return this.getter();\r\n }\r\n\r\n public setValue(value: T): this\r\n {\r\n this.setter(value);\r\n return this;\r\n }\r\n\r\n public toString(): string\r\n {\r\n return `${this.getValue()}`;\r\n }\r\n}","import { PreCondition } from \"./preCondition\";\r\nimport { escapeAndQuote } from \"./strings\";\r\n\r\nexport class HttpHeader\r\n{\r\n private readonly name: string;\r\n private readonly value: string;\r\n\r\n private constructor(name: string, value: string)\r\n {\r\n PreCondition.assertNotEmpty(name, \"name\");\r\n PreCondition.assertNotUndefinedAndNotNull(value, \"value\");\r\n\r\n this.name = name;\r\n this.value = value;\r\n }\r\n\r\n public static create(name: string, value: string): HttpHeader\r\n {\r\n return new HttpHeader(name, value);\r\n }\r\n\r\n public getName(): string\r\n {\r\n return this.name;\r\n }\r\n\r\n public getValue(): string\r\n {\r\n return this.value;\r\n }\r\n\r\n public toString(): string\r\n {\r\n return `${escapeAndQuote(this.name)}:${escapeAndQuote(this.value)}`;\r\n }\r\n}","import { EqualFunctions } from \"./equalFunctions\";\r\nimport { HttpHeader } from \"./httpHeader\";\r\nimport { HttpHeaders } from \"./httpHeaders\";\r\nimport { Iterable } from \"./iterable\";\r\nimport { Iterator } from \"./iterator\";\r\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\r\nimport { List } from \"./list\";\r\nimport { NotFoundError } from \"./notFoundError\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { escapeAndQuote } from \"./strings\";\r\nimport { SyncResult } from \"./syncResult\";\r\nimport { ToStringFunctions } from \"./toStringFunctions\";\r\nimport { isString, Type } from \"./types\";\r\n\r\nexport class MutableHttpHeaders implements HttpHeaders\r\n{\r\n private readonly headers: List<HttpHeader>;\r\n\r\n private constructor(headers?: JavascriptIterable<HttpHeader>)\r\n {\r\n this.headers = List.create();\r\n if (headers)\r\n {\r\n this.setAll(headers);\r\n }\r\n }\r\n\r\n public static create(headers?: JavascriptIterable<HttpHeader>): MutableHttpHeaders\r\n {\r\n return new MutableHttpHeaders(headers);\r\n }\r\n\r\n public iterate(): Iterator<HttpHeader>\r\n {\r\n return this.headers.iterate();\r\n }\r\n\r\n public get(headerName: string): SyncResult<HttpHeader>\r\n {\r\n PreCondition.assertNotEmpty(headerName, \"headerName\");\r\n\r\n return SyncResult.create(() =>\r\n {\r\n let result: HttpHeader | undefined;\r\n\r\n const lowerHeaderName: string = headerName.toLowerCase();\r\n for (const header of this.headers)\r\n {\r\n if (header.getName().toLowerCase() === lowerHeaderName)\r\n {\r\n result = header\r\n break;\r\n }\r\n }\r\n if (result === undefined)\r\n {\r\n throw new NotFoundError(`No HttpHeader found with the name ${escapeAndQuote(headerName)}.`);\r\n }\r\n\r\n return result;\r\n });\r\n }\r\n\r\n public getValue(headerName: string): SyncResult<string>\r\n {\r\n return this.get(headerName)\r\n .then((header: HttpHeader) => header.getValue());\r\n }\r\n\r\n /**\r\n * Set a {@link HttpHeader} value in this collection. This will overwrite any existing \r\n * {@link HttpHeader} with the same name.\r\n * @param headerName The name of the header to set.\r\n * @param headerValue The value of the header to set.\r\n */\r\n public set(headerName: string, headerValue: string): this;\r\n public set(header: HttpHeader): this;\r\n set(headerOrHeaderName: HttpHeader | string, headerValue?: string): this\r\n {\r\n let headerName: string;\r\n if (isString(headerOrHeaderName))\r\n {\r\n headerName = headerOrHeaderName;\r\n }\r\n else\r\n {\r\n headerName = headerOrHeaderName.getName();\r\n headerValue = headerOrHeaderName.getValue();\r\n }\r\n PreCondition.assertNotEmpty(headerName, \"headerName\");\r\n PreCondition.assertNotUndefinedAndNotNull(headerValue, \"headerValue\");\r\n\r\n let insertIndex: number = 0;\r\n for (let insertIndex = 0; insertIndex < this.headers.getCount().await(); insertIndex++)\r\n {\r\n const header: HttpHeader = this.headers.get(insertIndex).await();\r\n if (header.getName() === headerName)\r\n {\r\n this.headers.removeAt(insertIndex);\r\n break;\r\n }\r\n }\r\n this.headers.insert(insertIndex, HttpHeader.create(headerName, headerValue));\r\n\r\n return this;\r\n }\r\n\r\n public setAll(headers: JavascriptIterable<HttpHeader>): this\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(headers, \"headers\");\r\n\r\n for (const header of headers)\r\n {\r\n this.set(header);\r\n }\r\n\r\n return this;\r\n }\r\n\r\n public setContentType(contentType: string): this\r\n {\r\n return this.set(HttpHeaders.contentTypeHeaderName, contentType);\r\n }\r\n\r\n public getContentType(): SyncResult<HttpHeader>\r\n {\r\n return this.get(HttpHeaders.contentTypeHeaderName);\r\n }\r\n\r\n public getContentTypeValue(): SyncResult<string>\r\n {\r\n return this.getValue(HttpHeaders.contentTypeHeaderName);\r\n }\r\n\r\n public getCount(): SyncResult<number>\r\n {\r\n return this.headers.getCount();\r\n }\r\n\r\n public toArray(): SyncResult<HttpHeader[]>\r\n {\r\n return HttpHeaders.toArray(this);\r\n }\r\n\r\n public any(): SyncResult<boolean>\r\n {\r\n return HttpHeaders.any(this);\r\n }\r\n\r\n public equals(right: JavascriptIterable<HttpHeader>, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return HttpHeaders.equals(this, right, equalFunctions);\r\n }\r\n\r\n public toString(toStringFunctions?: ToStringFunctions): string\r\n {\r\n return HttpHeaders.toString(this, toStringFunctions);\r\n }\r\n\r\n public concatenate(...toConcatenate: JavascriptIterable<HttpHeader>[]): Iterable<HttpHeader>\r\n {\r\n return HttpHeaders.concatenate(this, ...toConcatenate);\r\n }\r\n\r\n public map<TOutput>(mapping: (value: HttpHeader) => (TOutput | SyncResult<TOutput>)): Iterable<TOutput>\r\n {\r\n return HttpHeaders.map(this, mapping);\r\n }\r\n\r\n public flatMap<TOutput>(mapping: (value: HttpHeader) => JavascriptIterable<TOutput>): Iterable<TOutput>\r\n {\r\n return HttpHeaders.flatMap(this, mapping);\r\n }\r\n\r\n public where(condition: (value: HttpHeader) => (boolean | SyncResult<boolean>)): Iterable<HttpHeader>\r\n {\r\n return HttpHeaders.where(this, condition);\r\n }\r\n\r\n public instanceOf<TOutput extends HttpHeader>(typeOrTypeCheck: Type<TOutput> | ((value: HttpHeader) => value is TOutput)): Iterable<TOutput>\r\n {\r\n return HttpHeaders.instanceOf(this, typeOrTypeCheck);\r\n }\r\n\r\n public first(condition?: (value: HttpHeader) => (boolean | SyncResult<boolean>)): SyncResult<HttpHeader>\r\n {\r\n return HttpHeaders.first(this, condition);\r\n }\r\n\r\n public last(condition?: (value: HttpHeader) => (boolean | SyncResult<boolean>)): SyncResult<HttpHeader>\r\n {\r\n return HttpHeaders.last(this, condition);\r\n }\r\n\r\n public [Symbol.iterator](): JavascriptIterator<HttpHeader>\r\n {\r\n return HttpHeaders[Symbol.iterator](this);\r\n }\r\n\r\n public contains(value: HttpHeader, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return HttpHeaders.contains(this, value, equalFunctions);\r\n }\r\n}","import { EqualFunctions } from \"./equalFunctions\";\r\nimport { HttpHeader } from \"./httpHeader\";\r\nimport { Iterable } from \"./iterable\";\r\nimport { Iterator } from \"./iterator\";\r\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\r\nimport { MutableHttpHeaders } from \"./mutableHttpHeaders\";\r\nimport { NotFoundError } from \"./notFoundError\";\r\nimport { AsyncResult } from \"./asyncResult\";\r\nimport { SyncResult } from \"./syncResult\";\r\nimport { ToStringFunctions } from \"./toStringFunctions\";\r\nimport { Type } from \"./types\";\r\n\r\n/**\r\n * A collection of {@link HttpHeader}s.\r\n */\r\nexport abstract class HttpHeaders implements Iterable<HttpHeader>\r\n{\r\n public static readonly contentTypeHeaderName: string = \"Content-Type\";\r\n\r\n public static create(headers?: JavascriptIterable<HttpHeader>): MutableHttpHeaders\r\n {\r\n return MutableHttpHeaders.create(headers);\r\n }\r\n\r\n /**\r\n * Get the header with the provided name.\r\n * @param headerName The name of the header.\r\n */\r\n public abstract get(headerName: string): SyncResult<HttpHeader>;\r\n\r\n /**\r\n * Get the value of the header with the provided name.\r\n * @param headerName The name of the header.\r\n */\r\n public abstract getValue(headerName: string): SyncResult<string>;\r\n\r\n public getContentType(): AsyncResult<HttpHeader>\r\n {\r\n return HttpHeaders.getContentType(this);\r\n }\r\n\r\n public static getContentType(headers: HttpHeaders): AsyncResult<HttpHeader>\r\n {\r\n return headers.get(HttpHeaders.contentTypeHeaderName);\r\n }\r\n\r\n public getContentTypeValue(): AsyncResult<string>\r\n {\r\n return HttpHeaders.getContentTypeValue(this);\r\n }\r\n\r\n public static getContentTypeValue(headers: HttpHeaders): AsyncResult<string>\r\n {\r\n return headers.getValue(HttpHeaders.contentTypeHeaderName);\r\n }\r\n\r\n /**\r\n * Get an {@link Iterator} that can be used to iterate through the {@link HttpHeader}s in this\r\n * collection.\r\n */\r\n public abstract iterate(): Iterator<HttpHeader>;\r\n\r\n /**\r\n * Get the {@link HttpHeader}s in this {@link HttpHeaders} object as an array.\r\n */\r\n public toArray(): SyncResult<HttpHeader[]>\r\n {\r\n return HttpHeaders.toArray(this);\r\n }\r\n\r\n public static toArray(headers: HttpHeaders): SyncResult<HttpHeader[]>\r\n {\r\n return Iterable.toArray(headers);\r\n }\r\n\r\n public any(): SyncResult<boolean>\r\n {\r\n return HttpHeaders.any(this);\r\n }\r\n\r\n public static any(headers: HttpHeaders): SyncResult<boolean>\r\n {\r\n return Iterable.any(headers);\r\n }\r\n\r\n public getCount(): SyncResult<number>\r\n {\r\n return HttpHeaders.getCount(this);\r\n }\r\n\r\n public static getCount(headers: HttpHeaders): SyncResult<number>\r\n {\r\n return Iterable.getCount(headers);\r\n }\r\n\r\n public equals(right: JavascriptIterable<HttpHeader>, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return HttpHeaders.equals(this, right, equalFunctions);\r\n }\r\n\r\n public static equals(headers: HttpHeaders, right: JavascriptIterable<HttpHeader>, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return Iterable.equals(headers, right, equalFunctions);\r\n }\r\n\r\n public toString(toStringFunctions?: ToStringFunctions): string\r\n {\r\n return HttpHeaders.toString(this, toStringFunctions);\r\n }\r\n\r\n public static toString(headers: HttpHeaders, toStringFunctions?: ToStringFunctions): string\r\n {\r\n return Iterable.toString(headers, toStringFunctions);\r\n }\r\n\r\n public concatenate(...toConcatenate: JavascriptIterable<HttpHeader>[]): Iterable<HttpHeader>\r\n {\r\n return HttpHeaders.concatenate(this, ...toConcatenate);\r\n }\r\n\r\n public static concatenate(headers: HttpHeaders, ...toConcatenate: JavascriptIterable<HttpHeader>[]): Iterable<HttpHeader>\r\n {\r\n return Iterable.concatenate(headers, ...toConcatenate);\r\n }\r\n\r\n public map<TOutput>(mapping: (value: HttpHeader) => (TOutput | SyncResult<TOutput>)): Iterable<TOutput>\r\n {\r\n return HttpHeaders.map(this, mapping);\r\n }\r\n\r\n public static map<TOutput>(headers: HttpHeaders, mapping: (value: HttpHeader) => (TOutput | SyncResult<TOutput>)): Iterable<TOutput>\r\n {\r\n return Iterable.map(headers, mapping);\r\n }\r\n\r\n public flatMap<TOutput>(mapping: (value: HttpHeader) => JavascriptIterable<TOutput>): Iterable<TOutput>\r\n {\r\n return HttpHeaders.flatMap(this, mapping);\r\n }\r\n\r\n public static flatMap<TOutput>(headers: HttpHeaders, mapping: (value: HttpHeader) => JavascriptIterable<TOutput>): Iterable<TOutput>\r\n {\r\n return Iterable.flatMap(headers, mapping);\r\n }\r\n\r\n public where(condition: (value: HttpHeader) => boolean): Iterable<HttpHeader>\r\n {\r\n return HttpHeaders.where(this, condition);\r\n }\r\n\r\n public static where(headers: HttpHeaders, condition: (value: HttpHeader) => (boolean | SyncResult<boolean>)): Iterable<HttpHeader>\r\n {\r\n return Iterable.where(headers, condition);\r\n }\r\n\r\n public instanceOf<TOutput extends HttpHeader>(typeOrTypeCheck: Type<TOutput> | ((value: HttpHeader) => value is TOutput)): Iterable<TOutput>\r\n {\r\n return HttpHeaders.instanceOf(this, typeOrTypeCheck);\r\n }\r\n\r\n public static instanceOf<TOutput extends HttpHeader>(headers: HttpHeaders, typeOrTypeCheck: Type<TOutput> | ((value: HttpHeader) => value is TOutput)): Iterable<TOutput>\r\n {\r\n return Iterable.instanceOf(headers, typeOrTypeCheck);\r\n }\r\n\r\n public first(condition?: (value: HttpHeader) => (boolean | SyncResult<boolean>)): SyncResult<HttpHeader>\r\n {\r\n return HttpHeaders.first(this, condition);\r\n }\r\n\r\n public static first(headers: HttpHeaders, condition?: (value: HttpHeader) => (boolean | SyncResult<boolean>)): SyncResult<HttpHeader>\r\n {\r\n return Iterable.first(headers, condition);\r\n }\r\n\r\n public last(condition?: (value: HttpHeader) => (boolean | SyncResult<boolean>)): SyncResult<HttpHeader>\r\n {\r\n return HttpHeaders.last(this, condition);\r\n }\r\n\r\n public static last(headers: HttpHeaders, condition?: (value: HttpHeader) => (boolean | SyncResult<boolean>)): SyncResult<HttpHeader>\r\n {\r\n return Iterable.last(headers, condition);\r\n }\r\n\r\n public [Symbol.iterator](): JavascriptIterator<HttpHeader>\r\n {\r\n return HttpHeaders[Symbol.iterator](this);\r\n }\r\n\r\n public static [Symbol.iterator](headers: HttpHeaders): JavascriptIterator<HttpHeader>\r\n {\r\n return Iterable[Symbol.iterator](headers);\r\n }\r\n\r\n public contains(value: HttpHeader, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return HttpHeaders.contains(this, value, equalFunctions);\r\n }\r\n\r\n public static contains(headers: HttpHeaders, value: HttpHeader, equalFunctions?: EqualFunctions): SyncResult<boolean>\r\n {\r\n return SyncResult.create(() =>\r\n {\r\n if (!equalFunctions)\r\n {\r\n equalFunctions = EqualFunctions.create();\r\n }\r\n\r\n return headers.getValue(value.getName())\r\n .then((headerValue: string) => equalFunctions!.areEqual(headerValue, value.getValue()).await())\r\n .catch(NotFoundError, () => false)\r\n .await();\r\n });\r\n }\r\n}","import { HttpHeader } from \"./httpHeader\";\r\nimport { HttpHeaders } from \"./httpHeaders\";\r\nimport { AsyncResult } from \"./asyncResult\";\r\n\r\n/**\r\n * The response from a {@link HttpClient}'s sendRequest() method.\r\n */\r\nexport abstract class HttpIncomingResponse\r\n{\r\n public abstract getStatusCode(): number;\r\n\r\n public abstract getHeaders(): AsyncResult<HttpHeaders>;\r\n\r\n public abstract getHeader(headerName: string): AsyncResult<HttpHeader>;\r\n\r\n public abstract getHeaderValue(headerName: string): AsyncResult<string>;\r\n\r\n public abstract getBody(): AsyncResult<string>;\r\n}","import { PromiseAsyncResult } from \"./promiseAsyncResult\";\r\nimport { HttpHeader } from \"./httpHeader\";\r\nimport { HttpHeaders } from \"./httpHeaders\";\r\nimport { HttpIncomingResponse } from \"./httpIncomingResponse\";\r\nimport { MutableHttpHeaders } from \"./mutableHttpHeaders\";\r\nimport { NotFoundError } from \"./notFoundError\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { escapeAndQuote } from \"./strings\";\r\nimport { SyncResult } from \"./syncResult\";\r\n\r\n/**\r\n * An {@link HttpIncomingResponse} that comes from a {@link FetchHttpClient}.\r\n */\r\nexport class FetchHttpIncomingResponse extends HttpIncomingResponse\r\n{\r\n private readonly response: Response;\r\n\r\n private constructor(response: Response)\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(response, \"response\");\r\n\r\n super();\r\n\r\n this.response = response;\r\n }\r\n\r\n public static create(response: Response): FetchHttpIncomingResponse\r\n {\r\n return new FetchHttpIncomingResponse(response);\r\n }\r\n\r\n public getStatusCode(): number\r\n {\r\n return this.response.status;\r\n }\r\n\r\n public getHeaders(): SyncResult<HttpHeaders>\r\n {\r\n return SyncResult.create(() =>\r\n {\r\n const result: MutableHttpHeaders = HttpHeaders.create();\r\n for (const header of this.response.headers)\r\n {\r\n result.set(header[0], header[1]);\r\n }\r\n return result;\r\n });\r\n }\r\n\r\n public getHeader(headerName: string): SyncResult<HttpHeader>\r\n {\r\n PreCondition.assertNotEmpty(headerName, \"headerName\");\r\n\r\n return SyncResult.create(() =>\r\n {\r\n let result: HttpHeader | undefined;\r\n\r\n const lowerHeaderName: string = headerName.toLowerCase();\r\n for (const header of this.response.headers)\r\n {\r\n if (lowerHeaderName === header[0].toLowerCase())\r\n {\r\n result = HttpHeader.create(header[0], header[1]);\r\n break;\r\n }\r\n }\r\n if (result === undefined)\r\n {\r\n throw new NotFoundError(`Could not find a header with the name ${escapeAndQuote(headerName)}.`)\r\n }\r\n\r\n return result;\r\n });\r\n }\r\n \r\n public getHeaderValue(headerName: string): SyncResult<string>\r\n {\r\n PreCondition.assertNotEmpty(headerName, \"headerName\");\r\n\r\n return SyncResult.create(() =>\r\n {\r\n let result: string | undefined;\r\n\r\n const lowerHeaderName: string = headerName.toLowerCase();\r\n for (const header of this.response.headers)\r\n {\r\n if (lowerHeaderName === header[0].toLowerCase())\r\n {\r\n result = header[1];\r\n break;\r\n }\r\n }\r\n if (result === undefined)\r\n {\r\n throw new NotFoundError(`Could not find a header with the name ${escapeAndQuote(headerName)}.`)\r\n }\r\n\r\n return result;\r\n });\r\n }\r\n\r\n public getBody(): PromiseAsyncResult<string>\r\n {\r\n return PromiseAsyncResult.create(this.response.text());\r\n }\r\n}","import { NotFoundError } from \"./notFoundError\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { SyncResult } from \"./syncResult\";\r\n\r\nexport enum HttpMethod\r\n{\r\n /**\r\n * The GET method requests a representation of the specified resource. Requests using GET should\r\n * only retrieve data and should not contain a request content.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods/GET\r\n */\r\n GET,\r\n /**\r\n * The HEAD method asks for a response identical to a GET request, but without a response body.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods/HEAD\r\n */\r\n HEAD,\r\n /**\r\n * The POST method submits an entity to the specified resource, often causing a change in state\r\n * or side effects on the server.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods/POST\r\n */\r\n POST,\r\n /**\r\n * The PUT method replaces all current representations of the target resource with the request\r\n * content.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods/PUT\r\n */\r\n PUT,\r\n /**\r\n * The DELETE method deletes the specified resource.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods/DELETE\r\n */\r\n DELETE,\r\n /**\r\n * The CONNECT method establishes a tunnel to the server identified by the target resource.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods/CONNECT\r\n */\r\n CONNECT,\r\n /**\r\n * The OPTIONS method describes the communication options for the target resource.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods/OPTIONS\r\n */\r\n OPTIONS,\r\n /**\r\n * The TRACE method performs a message loop-back test along the path to the target resource.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods/TRACE\r\n */\r\n TRACE,\r\n /**\r\n * The PATCH method applies partial modifications to a resource.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Methods/PATCH\r\n */\r\n PATCH,\r\n}\r\n\r\n/**\r\n * Parse a {@link HttpMethod} from the provided text.\r\n * @param text The text to parse.\r\n */\r\nexport function parseHttpMethod(text: string): SyncResult<HttpMethod>\r\n{\r\n return SyncResult.create(() =>\r\n {\r\n let result: HttpMethod;\r\n\r\n switch (text.toUpperCase())\r\n {\r\n case \"GET\":\r\n result = HttpMethod.GET;\r\n break;\r\n\r\n case \"HEAD\":\r\n result = HttpMethod.HEAD;\r\n break;\r\n\r\n case \"POST\":\r\n result = HttpMethod.POST;\r\n break;\r\n\r\n case \"PUT\":\r\n result = HttpMethod.PUT;\r\n break;\r\n\r\n case \"DELETE\":\r\n result = HttpMethod.DELETE;\r\n break;\r\n\r\n case \"CONNECT\":\r\n result = HttpMethod.CONNECT;\r\n break;\r\n\r\n case \"OPTIONS\":\r\n result = HttpMethod.OPTIONS;\r\n break;\r\n\r\n case \"TRACE\":\r\n result = HttpMethod.TRACE;\r\n break;\r\n\r\n case \"PATCH\":\r\n result = HttpMethod.PATCH;\r\n break;\r\n\r\n default:\r\n throw new NotFoundError(`No HttpMethod exists for the text \"${text}\".`);\r\n }\r\n\r\n return result;\r\n });\r\n}\r\n\r\n/**\r\n * Get the string representation of the provided {@link HttpMethod}.\r\n * @param httpMethod The {@link HttpMethod} to get the string representation of.\r\n */\r\nexport function httpMethodToString(httpMethod: HttpMethod): string\r\n{\r\n PreCondition.assertNotUndefinedAndNotNull(httpMethod, \"httpMethod\");\r\n\r\n let result: string;\r\n switch (httpMethod)\r\n {\r\n case HttpMethod.GET:\r\n result = \"GET\";\r\n break;\r\n\r\n case HttpMethod.HEAD:\r\n result = \"HEAD\";\r\n break;\r\n\r\n case HttpMethod.POST:\r\n result = \"POST\";\r\n break;\r\n\r\n case HttpMethod.PUT:\r\n result = \"PUT\";\r\n break;\r\n\r\n case HttpMethod.DELETE:\r\n result = \"DELETE\";\r\n break;\r\n\r\n case HttpMethod.CONNECT:\r\n result = \"CONNECT\";\r\n break;\r\n\r\n case HttpMethod.OPTIONS:\r\n result = \"OPTIONS\";\r\n break;\r\n\r\n case HttpMethod.TRACE:\r\n result = \"TRACE\";\r\n break;\r\n\r\n case HttpMethod.PATCH:\r\n result = \"PATCH\";\r\n break;\r\n\r\n default:\r\n throw new NotFoundError(`Unrecognized HttpMethod: ${httpMethod}`);\r\n }\r\n return result;\r\n}","import { HttpHeader } from \"./httpHeader\";\r\nimport { HttpHeaders } from \"./httpHeaders\";\r\nimport { HttpMethod } from \"./httpMethod\";\r\nimport { MutableHttpHeaders } from \"./mutableHttpHeaders\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { SyncResult } from \"./syncResult\";\r\n\r\n/**\r\n * A HTTP request that is sent out by a {@link HttpClient}.\r\n */\r\nexport class HttpOutgoingRequest\r\n{\r\n private method: HttpMethod;\r\n private url: string;\r\n private readonly headers: MutableHttpHeaders;\r\n private body: string;\r\n\r\n private constructor(method: HttpMethod, url: string)\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(method, \"method\");\r\n PreCondition.assertNotEmpty(url, \"url\");\r\n\r\n this.method = method;\r\n this.url = url;\r\n this.headers = HttpHeaders.create();\r\n this.body = \"\";\r\n }\r\n\r\n public static create(method: HttpMethod, url: string): HttpOutgoingRequest\r\n {\r\n return new HttpOutgoingRequest(method, url);\r\n }\r\n\r\n /**\r\n * Create a new {@link HttpOutgoingRequest} with a GET {@link HttpMethod}.\r\n * @param url The target URL for the {@link HttpOutgoingRequest}.\r\n */\r\n public static get(url: string): HttpOutgoingRequest\r\n {\r\n return HttpOutgoingRequest.create(HttpMethod.GET, url);\r\n }\r\n\r\n /**\r\n * Get the {@link HttpMethod} for this {@link HttpOutgoingRequest}.\r\n */\r\n public getMethod(): HttpMethod\r\n {\r\n return this.method;\r\n }\r\n\r\n /**\r\n * Set the {@link HttpMethod} for this {@link HttpOutgoingRequest}.\r\n * @param method The {@link HttpMethod} for this {@link HttpOutgoingRequest}.\r\n */\r\n public setMethod(method: HttpMethod): this\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(method, \"method\");\r\n\r\n this.method = method;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Get this {@link HttpOutgoingRequest}'s target URL.\r\n */\r\n public getURL(): string\r\n {\r\n return this.url;\r\n }\r\n\r\n /**\r\n * Set the URL that this request will be sent to.\r\n * @param url The URL to send this request to.\r\n */\r\n public setURL(url: string): this\r\n {\r\n PreCondition.assertNotEmpty(url, \"url\");\r\n\r\n this.url = url;\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Get the {@link HttpHeaders} that will be sent.\r\n */\r\n public getHeaders(): HttpHeaders\r\n {\r\n return this.headers;\r\n }\r\n\r\n public getHeader(headerName: string): SyncResult<HttpHeader>\r\n {\r\n return this.headers.get(headerName);\r\n }\r\n\r\n public getHeaderValue(headerName: string): SyncResult<string>\r\n {\r\n return this.headers.getValue(headerName);\r\n }\r\n\r\n /**\r\n * Get the body that will be sent.\r\n */\r\n public getBody(): string\r\n {\r\n return this.body;\r\n }\r\n\r\n public setBody(body: string): this\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(body, \"body\");\r\n\r\n this.body = body;\r\n\r\n return this;\r\n }\r\n}","import { FetchHttpIncomingResponse } from \"./fetchHttpResponse\";\r\nimport { HttpClient } from \"./httpClient\";\r\nimport { HttpOutgoingRequest } from \"./httpOutgoingRequest\";\r\nimport { HttpHeader } from \"./httpHeader\";\r\nimport { HttpMethod } from \"./httpMethod\";\r\nimport { PostCondition } from \"./postCondition\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { PromiseAsyncResult } from \"./promiseAsyncResult\";\r\n\r\n/**\r\n * A {@link HttpClient} that uses {@link fetch}() to make network requests.\r\n */\r\nexport class FetchHttpClient implements HttpClient\r\n{\r\n protected constructor()\r\n {\r\n }\r\n\r\n public static create(): FetchHttpClient\r\n {\r\n return new FetchHttpClient();\r\n }\r\n\r\n public sendRequest(request: HttpOutgoingRequest): PromiseAsyncResult<FetchHttpIncomingResponse>\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(request, \"request\");\r\n\r\n return PromiseAsyncResult.create(async () =>\r\n {\r\n const requestInit: RequestInit = {\r\n method: FetchHttpClient.convertMethod(request.getMethod()),\r\n headers: request.getHeaders()\r\n .map<[string, string]>((header: HttpHeader) => [header.getName(), header.getValue()])\r\n .toArray()\r\n .await(),\r\n body: request.getBody() || undefined,\r\n };\r\n\r\n const fetchResponse: Response = await fetch(request.getURL(), requestInit);\r\n return FetchHttpIncomingResponse.create(fetchResponse);\r\n });\r\n }\r\n\r\n public sendGetRequest(url: string): PromiseAsyncResult<FetchHttpIncomingResponse>\r\n {\r\n return this.sendRequest(HttpOutgoingRequest.create(HttpMethod.GET, url));\r\n }\r\n\r\n public static convertMethod(method: HttpMethod): string\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(method, \"method\");\r\n\r\n let result: string;\r\n switch (method)\r\n {\r\n case HttpMethod.CONNECT:\r\n result = \"CONNECT\";\r\n break;\r\n case HttpMethod.DELETE:\r\n result = \"DELETE\";\r\n break;\r\n case HttpMethod.GET:\r\n result = \"GET\";\r\n break;\r\n case HttpMethod.HEAD:\r\n result = \"HEAD\";\r\n break;\r\n case HttpMethod.OPTIONS:\r\n result = \"OPTIONS\";\r\n break;\r\n case HttpMethod.PATCH:\r\n result = \"PATCH\";\r\n break;\r\n case HttpMethod.POST:\r\n result = \"POST\";\r\n break;\r\n case HttpMethod.PUT:\r\n result = \"PUT\";\r\n break;\r\n case HttpMethod.TRACE:\r\n result = \"TRACE\";\r\n break;\r\n }\r\n\r\n PostCondition.assertNotEmpty(result, \"result\");\r\n\r\n return result;\r\n }\r\n}","import { HttpClient } from \"./httpClient\";\r\nimport { HttpServer } from \"./httpServer\";\r\n\r\n/**\r\n * An object that provides access to the network.\r\n */\r\nexport abstract class Network\r\n{\r\n /**\r\n * Create a new {@link HttpServer} that is connected to this {@link Network}.\r\n */\r\n public abstract createHttpServer(): HttpServer;\r\n\r\n /**\r\n * Create a new {@link HttpClient} that is connected to this {@link Network}.\r\n */\r\n public abstract createHttpClient(): HttpClient;\r\n}","import * as http from \"http\";\r\n\r\nimport { HttpServer } from \"./httpServer\";\r\nimport { HttpIncomingRequest } from \"./httpIncomingRequest\";\r\nimport { HttpOutgoingResponse } from \"./httpOutgoingResponse\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { HttpHeaders } from \"./httpHeaders\";\r\nimport { PromiseAsyncResult } from \"./promiseAsyncResult\";\r\nimport { AsyncResult } from \"./asyncResult\";\r\n\r\n/**\r\n * A {@link HttpServer} implementation that uses the Node.js HTTP module.\r\n */\r\nexport class NodeJSHttpServer extends HttpServer\r\n{\r\n private httpServer: http.Server | undefined;\r\n private disposed: boolean;\r\n\r\n private constructor()\r\n {\r\n super();\r\n\r\n this.disposed = false;\r\n }\r\n\r\n public static create(): NodeJSHttpServer\r\n {\r\n return new NodeJSHttpServer();\r\n }\r\n\r\n public dispose(): PromiseAsyncResult<boolean>\r\n {\r\n return PromiseAsyncResult.create(new Promise<boolean>((resolve, reject) =>\r\n {\r\n if (this.disposed)\r\n {\r\n resolve(false);\r\n }\r\n else if (!this.httpServer)\r\n {\r\n this.disposed = true;\r\n resolve(true);\r\n }\r\n else\r\n {\r\n this.httpServer.close((error?: Error) =>\r\n {\r\n if (error)\r\n {\r\n reject(error);\r\n }\r\n else\r\n {\r\n this.disposed = true;\r\n this.httpServer = undefined;\r\n resolve(true);\r\n }\r\n });\r\n }\r\n }));\r\n }\r\n\r\n public isDisposed(): boolean\r\n {\r\n return this.disposed;\r\n }\r\n\r\n public isStarted(): boolean\r\n {\r\n return !!this.httpServer;\r\n }\r\n\r\n public addRequestHandler(requestPath: string, handler: (request: HttpIncomingRequest, response: HttpOutgoingResponse) => AsyncResult<void>): void\r\n {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n public setDefaultRequestHandler(handler: (request: HttpIncomingRequest, response: HttpOutgoingResponse) => AsyncResult<void>): void\r\n {\r\n throw new Error(\"Method not implemented.\");\r\n }\r\n\r\n public start(portNumber: number): PromiseAsyncResult<void>\r\n {\r\n PreCondition.assertGreaterThanOrEqualTo(portNumber, 1, \"portNumber\");\r\n PreCondition.assertFalse(this.isDisposed(), \"this.isDisposed()\");\r\n PreCondition.assertUndefined(this.httpServer, \"this.httpServer\");\r\n\r\n return PromiseAsyncResult.create(new Promise<void>((resolve, reject) =>\r\n {\r\n if (this.httpServer)\r\n {\r\n reject(new Error(\"Can't run a HttpServer multiple times.\"));\r\n }\r\n else\r\n {\r\n this.httpServer = http.createServer();\r\n\r\n this.httpServer.on(\"request\", (request: http.IncomingMessage, response: http.ServerResponse<http.IncomingMessage> & { req: http.IncomingMessage }) =>\r\n {\r\n // const httpRequest: HttpIncomingRequest = NodeJSHttpIncomingRequest.create(request);\r\n const httpResponse: HttpOutgoingResponse = HttpOutgoingResponse.create()\r\n .setStatusCode(200)\r\n .setHeader(\"Content-Type\", \"text/plain\")\r\n .setBody(\"Hello world!\");\r\n\r\n const statusCode: number = httpResponse.getStatusCode();\r\n const headers: HttpHeaders = httpResponse.getHeaders();\r\n\r\n const responseHeaders: http.OutgoingHttpHeaders = {};\r\n for (const header of headers)\r\n {\r\n responseHeaders[header.getName()] = header.getValue();\r\n }\r\n\r\n response.writeHead(statusCode, responseHeaders);\r\n response.end(httpResponse.getBody());\r\n });\r\n\r\n this.httpServer.on(\"close\", () =>\r\n {\r\n resolve();\r\n });\r\n\r\n this.httpServer.on(\"error\", (error: Error) =>\r\n {\r\n reject(error);\r\n });\r\n\r\n this.httpServer.listen(portNumber);\r\n }\r\n }));\r\n }\r\n}","import { Disposable } from \"./disposable\";\r\nimport { HttpIncomingRequest } from \"./httpIncomingRequest\";\r\nimport { HttpOutgoingResponse } from \"./httpOutgoingResponse\";\r\nimport { AsyncResult } from \"./asyncResult\";\r\n\r\nexport abstract class HttpServer implements Disposable\r\n{\r\n public abstract dispose(): AsyncResult<boolean>;\r\n\r\n public abstract isDisposed(): boolean;\r\n\r\n /**\r\n * Add the provided request handler so it will be invoked when a request is received for the\r\n * provided path.\r\n * @param requestPath The path that will cause the provided handler to be invoked.\r\n * @param handler The function that will be invoked when the \r\n */\r\n public abstract addRequestHandler(requestPath: string, handler: (request: HttpIncomingRequest, response: HttpOutgoingResponse) => AsyncResult<void>): void;\r\n\r\n /**\r\n * Set the default request handler that will be invoked when no other request handlers match an\r\n * {@link HttpIncomingRequest}.\r\n * @param handler The handler that will be invoked when no other request handlers match an\r\n * {@link HttpIncomingRequest}.\r\n */\r\n public abstract setDefaultRequestHandler(handler: (request: HttpIncomingRequest, response: HttpOutgoingResponse) => AsyncResult<void>): void;\r\n\r\n /**\r\n * Start listening for incoming connections on the provided port number. The returned\r\n * {@link AsyncResult} will complete when the server is disposed.\r\n * @param portNumber The port number to start listening on.\r\n */\r\n public abstract start(portNumber: number): AsyncResult<void>;\r\n}","import { HttpHeader } from \"./httpHeader\";\r\nimport { HttpHeaders } from \"./httpHeaders\";\r\nimport { MutableHttpHeaders } from \"./mutableHttpHeaders\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { SyncResult } from \"./syncResult\";\r\n\r\n/**\r\n * A HTTP response that is sent out by an {@link HttpServer}.\r\n */\r\nexport class HttpOutgoingResponse\r\n{\r\n private statusCode: number;\r\n private readonly headers: MutableHttpHeaders;\r\n private body: string;\r\n\r\n private constructor()\r\n {\r\n this.statusCode = 200;\r\n this.headers = MutableHttpHeaders.create();\r\n this.body = \"\";\r\n }\r\n\r\n public static create(): HttpOutgoingResponse\r\n {\r\n return new HttpOutgoingResponse();\r\n }\r\n\r\n /**\r\n * Get the status code of this {@link HttpOutgoingResponse}.\r\n */\r\n public getStatusCode(): number\r\n {\r\n return this.statusCode;\r\n }\r\n\r\n /**\r\n * Set the status code of this {@link HttpOutgoingResponse}.\r\n * @param statusCode The status code of this {@link HttpOutgoingResponse}.\r\n */\r\n public setStatusCode(statusCode: number): this\r\n {\r\n PreCondition.assertBetween(100, statusCode, 599, \"statusCode\");\r\n\r\n this.statusCode = statusCode;\r\n\r\n return this;\r\n }\r\n\r\n public getHeaders(): HttpHeaders\r\n {\r\n return this.headers;\r\n }\r\n\r\n /**\r\n * Get the HTTP header with the provided name or return a {@link NotFoundError} if the header\r\n * doesn't exist.\r\n * @param headerName The name of the header to get.\r\n */\r\n public getHeader(headerName: string): SyncResult<HttpHeader>\r\n {\r\n return this.headers.get(headerName);\r\n }\r\n\r\n /**\r\n * Get the value of the header with the provided name or return a {@link NotFoundError} if the\r\n * header doesn't exist.\r\n * @param headerName The name of the header value to get.\r\n */\r\n public getHeaderValue(headerName: string): SyncResult<string>\r\n {\r\n return this.headers.getValue(headerName);\r\n }\r\n\r\n /**\r\n * Set the HTTP header in this {@link HttpOutgoingResponse}.\r\n * @param headerName The name of the HTTP header.\r\n * @param headerValue The value of the HTTP header.\r\n */\r\n public setHeader(headerName: string, headerValue: string): this\r\n {\r\n this.headers.set(headerName, headerValue);\r\n\r\n return this;\r\n }\r\n\r\n public setContentTypeHeader(contentType: string): this\r\n {\r\n this.headers.setContentType(contentType);\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Get the body of this {@link HttpOutgoingResponse}.\r\n */\r\n public getBody(): string\r\n {\r\n return this.body;\r\n }\r\n\r\n /**\r\n * Set the body of this {@link HttpOutgoingResponse}.\r\n * @param body The body for this {@link HttpOutgoingResponse}.\r\n */\r\n public setBody(body: string): this\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(body, \"body\");\r\n\r\n this.body = body;\r\n\r\n return this;\r\n }\r\n}","import { FetchHttpClient } from \"./fetchHttpClient\";\r\nimport { HttpClient } from \"./httpClient\";\r\nimport { HttpServer } from \"./httpServer\";\r\nimport { Network } from \"./network\";\r\nimport { NodeJSHttpServer } from \"./nodeJSHttpServer\";\r\n\r\nexport class RealNetwork extends Network\r\n{\r\n private constructor()\r\n {\r\n super();\r\n }\r\n\r\n public static create(): RealNetwork\r\n {\r\n return new RealNetwork();\r\n }\r\n\r\n public createHttpServer(): HttpServer\r\n {\r\n return NodeJSHttpServer.create();\r\n }\r\n\r\n public createHttpClient(): HttpClient\r\n {\r\n return FetchHttpClient.create();\r\n }\r\n}","import { CharacterWriteStream } from \"./characterWriteStream\";\nimport { CommandLineParameters } from \"./commandLineParameters\";\nimport { JavascriptIterable } from \"./javascript\";\nimport { Network } from \"./network\";\nimport { NodeJSCharacterWriteStream } from \"./nodeJSCharacterWriteStream\";\nimport { PreCondition } from \"./preCondition\";\nimport { Property } from \"./property\";\nimport { RealNetwork } from \"./realNetwork\";\nimport { isNumber } from \"./types\";\n\n/**\n * An object that provides all of the resources that are available to the current process.\n */\nexport class CurrentProcess\n{\n private args: JavascriptIterable<string> | undefined\n private parameters: CommandLineParameters | undefined;\n private outputWriteStream: CharacterWriteStream | undefined;\n private exitCodeProperty: Property<number> | undefined;\n private network: Network | undefined;\n\n private constructor()\n {\n }\n\n public static create(): CurrentProcess\n {\n return new CurrentProcess();\n }\n\n public static async run(action: (currentProcess: CurrentProcess) => void | number | Promise<void | number>): Promise<void>\n {\n PreCondition.assertNotUndefinedAndNotNull(action, \"action\");\n\n const currentProcess: CurrentProcess = CurrentProcess.create();\n try\n {\n const result: void | number = await action(currentProcess);\n if (isNumber(result))\n {\n currentProcess.setExitCode(result);\n }\n }\n catch (error)\n {\n currentProcess.setExitCode(-1);\n const writeStream: CharacterWriteStream = currentProcess.getOutputWriteStream();\n if (error instanceof Error && error.stack)\n {\n writeStream.writeLine(error.stack);\n }\n else\n {\n writeStream.writeLine(`${error}`);\n }\n }\n }\n\n public getArguments(): JavascriptIterable<string>\n {\n if (!this.args)\n {\n this.args = process.argv;\n }\n return this.args;\n }\n\n public setArguments(args: JavascriptIterable<string>): this\n {\n PreCondition.assertNotUndefinedAndNotNull(args, \"args\");\n PreCondition.assertUndefined(this.parameters, \"this.parameters\");\n\n this.args = args;\n return this;\n }\n\n public getParameters(): CommandLineParameters\n {\n if (!this.parameters)\n {\n this.parameters = CommandLineParameters.create(this.getArguments());\n }\n return this.parameters;\n }\n\n public getOutputWriteStream(): CharacterWriteStream\n {\n if (!this.outputWriteStream)\n {\n this.outputWriteStream = NodeJSCharacterWriteStream.create(process.stdout);\n }\n return this.outputWriteStream;\n }\n\n public setOutputWriteStream(outputWriteStream: CharacterWriteStream): this\n {\n PreCondition.assertNotUndefinedAndNotNull(outputWriteStream, \"outputWriteStream\");\n\n this.outputWriteStream = outputWriteStream;\n\n return this;\n }\n\n public getExitCode(): number\n {\n return this.getExitCodeProperty().getValue();\n }\n\n public setExitCode(exitCode: number): this\n {\n PreCondition.assertNotUndefinedAndNotNull(exitCode, \"exitCode\");\n\n this.getExitCodeProperty().setValue(exitCode);\n\n return this;\n }\n\n public getExitCodeProperty(): Property<number>\n {\n if (!this.exitCodeProperty)\n {\n this.exitCodeProperty = Property.create({\n getter: () => process.exitCode as number,\n setter: (value: number) => { process.exitCode = value; },\n });\n }\n return this.exitCodeProperty;\n }\n\n public setExitCodeProperty(exitCodeProperty: Property<number>): this\n {\n PreCondition.assertNotUndefinedAndNotNull(exitCodeProperty, \"exitCodeProperty\");\n\n this.exitCodeProperty = exitCodeProperty;\n\n return this;\n }\n\n public getNetwork(): Network\n {\n if (!this.network)\n {\n this.network = RealNetwork.create();\n }\n return this.network;\n }\n\n public setNetwork(network: Network): this\n {\n PreCondition.assertUndefined(this.network, \"this.network\");\n PreCondition.assertNotUndefinedAndNotNull(network, \"network\");\n\n this.network = network;\n\n return this;\n\n }\n}","import * as luxon from \"luxon\";\nimport { DateTime } from \"./dateTime\";\n\nconst pctTimeZone: string = \"America/Los_Angeles\";\n\nexport class LuxonDateTime implements DateTime\n{\n private readonly dateTime: luxon.DateTime;\n\n private constructor(dateTime: luxon.DateTime)\n {\n this.dateTime = dateTime;\n }\n\n private static create(dateTime: luxon.DateTime): LuxonDateTime\n {\n return new LuxonDateTime(dateTime);\n }\n\n public static parse(text: string): LuxonDateTime\n {\n return LuxonDateTime.create(luxon.DateTime.fromISO(text, { zone: pctTimeZone }));\n }\n\n public static now(): LuxonDateTime\n {\n return LuxonDateTime.create(luxon.DateTime.now().setZone(pctTimeZone));\n }\n\n public getYear(): number\n {\n return this.dateTime.year;\n }\n\n public getMonth(): number\n {\n return this.dateTime.month;\n }\n\n public getDay(): number\n {\n return this.dateTime.day;\n }\n\n public getHour(): number\n {\n return this.dateTime.hour;\n }\n\n public getMinute(): number\n {\n return this.dateTime.minute;\n }\n\n public getSecond(): number\n {\n return this.dateTime.second;\n }\n\n public addDays(days: number): LuxonDateTime\n {\n return LuxonDateTime.create(this.dateTime.plus({ days: days }));\n }\n\n public toString(): string\n {\n return this.dateTime.toISO()!;\n }\n\n public toDateString(): string\n {\n return this.dateTime.toISODate()!;\n }\n\n public compareTo(dateTime: DateTime, compareTimes: boolean): number\n {\n return DateTime.compareTo(this, dateTime, compareTimes);\n }\n\n public lessThan(dateTime: DateTime, compareTimes: boolean): boolean\n {\n return DateTime.lessThan(this, dateTime, compareTimes);\n }\n\n public lessThanOrEqualTo(dateTime: DateTime, compareTimes: boolean): boolean\n {\n return DateTime.lessThanOrEqualTo(this, dateTime, compareTimes);\n }\n\n public equals(dateTime: DateTime, compareTimes: boolean): boolean\n {\n return DateTime.equals(this, dateTime, compareTimes);\n }\n\n public greaterThanOrEqualTo(dateTime: DateTime, compareTimes: boolean): boolean\n {\n return DateTime.greaterThanOrEqualTo(this, dateTime, compareTimes);\n }\n\n public greaterThan(dateTime: DateTime, compareTimes: boolean): boolean\n {\n return DateTime.greaterThan(this, dateTime, compareTimes);\n }\n\n public get debug(): string\n {\n return DateTime.debug(this);\n }\n}","import { LuxonDateTime } from \"./luxonDateTime\";\n\nexport abstract class DateTime\n{\n public static parse(text: string): DateTime\n {\n return LuxonDateTime.parse(text);\n }\n\n public static now(): DateTime\n {\n return LuxonDateTime.now();\n }\n\n public abstract getYear(): number;\n\n public abstract getMonth(): number;\n\n public abstract getDay(): number;\n\n public abstract getHour(): number;\n\n public abstract getMinute(): number;\n\n public abstract getSecond(): number;\n\n public abstract addDays(days: number): DateTime;\n\n /**\n * Compare this {@link DateTime} to the provided {@link DateTime}. If this {@link DateTime} is\n * less than the provided {@link DateTime}, then a negative number will be returned, 0 if\n * they're equal, or a positive number if this {@link DateTime} is greater than the provided\n * {@link DateTime}.\n * @param dateTime The {@link DateTime} to compare to this {@link DateTime}.\n */\n public compareTo(dateTime: DateTime, compareTimes: boolean): number\n {\n return DateTime.compareTo(this, dateTime, compareTimes);\n }\n\n public static compareTo(left: DateTime, right: DateTime, compareTimes: boolean): number\n {\n let result: number = left.getYear() - right.getYear();\n if (result === 0)\n {\n result = left.getMonth() - right.getMonth();\n if (result === 0)\n {\n result = left.getDay() - right.getDay();\n if (compareTimes && result === 0)\n {\n result = left.getHour() - right.getHour();\n if (result === 0)\n {\n result = left.getMinute() - right.getMinute();\n if (result === 0)\n {\n result = left.getSecond(); - right.getSecond();\n }\n }\n }\n }\n }\n return result;\n }\n\n public lessThan(dateTime: DateTime, compareTimes: boolean): boolean\n {\n return DateTime.lessThan(this, dateTime, compareTimes);\n }\n\n public static lessThan(left: DateTime, right: DateTime, compareTimes: boolean): boolean\n {\n return left.compareTo(right, compareTimes) < 0;\n }\n\n public lessThanOrEqualTo(dateTime: DateTime, compareTimes: boolean): boolean\n {\n return DateTime.lessThanOrEqualTo(this, dateTime, compareTimes);\n }\n\n public static lessThanOrEqualTo(left: DateTime, right: DateTime, compareTimes: boolean): boolean\n {\n return left.compareTo(right, compareTimes) <= 0;\n }\n\n public equals(dateTime: DateTime, compareTimes: boolean): boolean\n {\n return DateTime.equals(this, dateTime, compareTimes);\n }\n\n public static equals(left: DateTime, right: DateTime, compareTimes: boolean): boolean\n {\n return left.compareTo(right, compareTimes) === 0;\n }\n\n public greaterThanOrEqualTo(dateTime: DateTime, compareTimes: boolean): boolean\n {\n return DateTime.greaterThanOrEqualTo(this, dateTime, compareTimes);\n }\n\n public static greaterThanOrEqualTo(left: DateTime, right: DateTime, compareTimes: boolean): boolean\n {\n return left.compareTo(right, compareTimes) >= 0;\n }\n\n public greaterThan(dateTime: DateTime, compareTimes: boolean): boolean\n {\n return DateTime.greaterThan(this, dateTime, compareTimes);\n }\n\n public static greaterThan(left: DateTime, right: DateTime, compareTimes: boolean): boolean\n {\n return left.compareTo(right, compareTimes) > 0;\n }\n\n public get debug(): string\n {\n return DateTime.debug(this);\n }\n\n public static debug(dateTime: DateTime): string\n {\n return dateTime.toString();\n }\n\n public abstract toString(): string;\n\n public abstract toDateString(): string;\n}","import { EmptyError } from \"./emptyError\";\nimport { EqualFunctions } from \"./equalFunctions\";\nimport { JavascriptIterable } from \"./javascript\";\nimport { List } from \"./list\";\nimport { PreCondition } from \"./preCondition\";\nimport { Stack } from \"./stack\";\nimport { SyncResult } from \"./syncResult\";\n\nexport class ListStack<T> implements Stack<T>\n{\n private readonly list: List<T>;\n\n private constructor(list?: List<T>)\n {\n this.list = list ?? List.create();\n }\n\n public static create<T>(list?: List<T>): ListStack<T>\n {\n return new ListStack<T>(list);\n }\n\n public any(): SyncResult<boolean>\n {\n return this.list.any();\n }\n\n public add(value: T): SyncResult<void>\n {\n return SyncResult.create(() =>\n {\n this.list.add(value);\n });\n }\n\n public addAll(values: JavascriptIterable<T>): SyncResult<void>\n {\n PreCondition.assertNotUndefinedAndNotNull(values, \"values\");\n\n return SyncResult.create(() =>\n {\n this.list.addAll(values);\n });\n }\n\n public remove(): SyncResult<T>\n {\n return SyncResult.create(() =>\n {\n if (!this.any().await())\n {\n throw new EmptyError();\n }\n return this.list.removeLast().await();\n });\n }\n\n public contains(value: T, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return this.list.contains(value, equalFunctions);\n }\n}","import { EqualFunctions } from \"./equalFunctions\";\nimport { JavascriptIterable } from \"./javascript\";\nimport { ListStack } from \"./listStack\";\nimport { AsyncResult } from \"./asyncResult\";\n\n/**\n * A data structure that stores values in a first-in-last-out order.\n */\nexport abstract class Stack<T>\n{\n /**\n * Create an instance of the default {@link Stack} implementation.\n * @returns A new {@link Stack} object.\n */\n public static create<T>(): ListStack<T>\n {\n return ListStack.create();\n }\n\n /**\n * Get whether there are any values in this {@link Stack}.\n */\n public abstract any(): AsyncResult<boolean>;\n\n /**\n * Push the provided value onto the top of this {@link Stack}.\n * @param value The value to push on the top of this {@link Stack}.\n */\n public abstract add(value: T): AsyncResult<void>;\n\n /**\n * Push the provided values onto the top of this {@link Stack}.\n * @param values The values to push onto this {@link Stack}.\n */\n public abstract addAll(values: JavascriptIterable<T>): AsyncResult<void>;\n\n /**\n * Remove the top value off of this {@link Stack}.\n */\n public abstract remove(): AsyncResult<T>;\n\n /**\n * Get whether this {@link Stack} contains the provided value.\n * @param value The value to look for.\n * @param equalFunctions The functions to use to compare values.\n */\n public abstract contains(value: T, equalFunctions?: EqualFunctions): AsyncResult<boolean>;\n}","import { JavascriptIterable, JavascriptIterator } from \"./javascript\";\nimport { List } from \"./list\";\nimport { ListStack } from \"./listStack\";\nimport { PreCondition } from \"./preCondition\";\nimport { SearchControl } from \"./searchControl\";\nimport { Stack } from \"./stack\";\nimport { Set } from \"./set\";\nimport { Iterator } from \"./iterator\";\nimport { SyncResult } from \"./syncResult\";\nimport { isJavascriptIterable, Type } from \"./types\";\n\nclass SearchBreakError extends Error\n{\n}\n\nclass DepthFirstSearch<TVisit,TResult> implements SearchControl<TVisit,TResult>, Iterator<TResult>\n{\n private readonly searchAction: (searchControl: SearchControl<TVisit,TResult>, visiting: TVisit) => void;\n private readonly toVisit: ListStack<TVisit>;\n private readonly visited: Set<TVisit>;\n private readonly results: List<TResult>;\n private started: boolean;\n private done: boolean;\n\n private constructor(initialToVisit: JavascriptIterable<TVisit>, searchAction: (searchControl: SearchControl<TVisit,TResult>, visiting: TVisit) => void)\n {\n PreCondition.assertNotEmpty(initialToVisit, \"initialToVisit\");\n PreCondition.assertNotUndefinedAndNotNull(searchAction, \"searchAction\");\n\n this.searchAction = searchAction;\n this.toVisit = Stack.create();\n this.toVisit.addAll(initialToVisit).await();\n this.visited = Set.create();\n this.results = List.create();\n this.started = false;\n this.done = false;\n }\n\n public static create<TVisit,TResult>(initialToVisit: JavascriptIterable<TVisit>, searchAction: (searchControl: SearchControl<TVisit,TResult>, visiting: TVisit) => void): DepthFirstSearch<TVisit,TResult>\n {\n return new DepthFirstSearch(initialToVisit, searchAction);\n }\n\n public addToVisit(toVisit: TVisit): void\n {\n if (!this.hasVisited(toVisit))\n {\n this.toVisit.add(toVisit);\n }\n }\n\n public addAllToVisit(values: JavascriptIterable<TVisit>): void\n {\n for (const value of values)\n {\n this.addToVisit(value);\n }\n }\n\n public hasVisited(toVisit: TVisit): boolean\n {\n return this.visited.contains(toVisit).await();\n }\n\n public addResult(result: TResult): void\n {\n this.results.add(result);\n }\n\n public addResults(results: JavascriptIterable<TResult>): void\n {\n this.results.addAll(results);\n }\n\n public break(): never\n {\n throw new SearchBreakError();\n }\n\n public next(): SyncResult<boolean>\n {\n return SyncResult.create(() =>\n {\n let result: boolean = false;\n if (!this.done)\n {\n if (!this.started)\n {\n this.started = true;\n }\n else\n {\n this.results.removeFirst().await();\n }\n \n while (!this.hasCurrent() && this.toVisit.any().await())\n {\n const current: TVisit = this.toVisit.remove().await();\n this.visited.add(current);\n this.searchAction(this, current);\n }\n\n result = this.hasCurrent();\n this.done = !result;\n }\n return result;\n });\n }\n\n public hasStarted(): boolean\n {\n return this.started;\n }\n\n public hasCurrent(): boolean\n {\n return this.results.any().await();\n }\n\n public getCurrent(): TResult\n {\n PreCondition.assertTrue(this.hasCurrent(), \"this.hasCurrent()\");\n\n return this.results.first().await();\n }\n\n public start(): SyncResult<this>\n {\n return Iterator.start<TResult,this>(this);\n }\n\n public takeCurrent(): SyncResult<TResult>\n {\n return Iterator.takeCurrent(this);\n }\n\n public any(): SyncResult<boolean>\n {\n return Iterator.any(this);\n }\n\n public getCount(): SyncResult<number>\n {\n return Iterator.getCount(this);\n }\n\n public toArray(): SyncResult<TResult[]>\n {\n return Iterator.toArray(this);\n }\n\n public concatenate(...toConcatenate: JavascriptIterable<TResult>[]): Iterator<TResult>\n {\n return Iterator.concatenate(this, ...toConcatenate);\n }\n\n public where(condition: (value: TResult) => (boolean | SyncResult<boolean>)): Iterator<TResult>\n {\n return Iterator.where(this, condition);\n }\n\n public map<TOutput>(mapping: (value: TResult) => TOutput | SyncResult<TOutput>): Iterator<TOutput>\n {\n return Iterator.map(this, mapping);\n }\n\n public flatMap<TOutput>(mapping: (value: TResult) => JavascriptIterable<TOutput>): Iterator<TOutput>\n {\n return Iterator.flatMap(this, mapping);\n }\n\n public whereInstanceOf<U extends TResult>(typeCheck: (value: TResult) => value is U): Iterator<U>\n {\n return Iterator.whereInstanceOf(this, typeCheck);\n }\n\n public whereInstanceOfType<U extends TResult>(type: Type<U>): Iterator<U>\n {\n return Iterator.whereInstanceOfType(this, type);\n }\n\n public first(condition?: ((value: TResult) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<TResult>\n {\n return Iterator.first(this, condition);\n }\n\n public last(condition?: ((value: TResult) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<TResult>\n {\n return Iterator.last(this, condition);\n }\n\n public take(maximumToTake: number): Iterator<TResult>\n {\n return Iterator.take(this, maximumToTake);\n }\n\n public skip(maximumToSkip: number): Iterator<TResult>\n {\n return Iterator.skip(this, maximumToSkip);\n }\n\n public [Symbol.iterator](): JavascriptIterator<TResult>\n {\n return Iterator[Symbol.iterator](this);\n }\n}\n\nexport function depthFirstSearch<TVisit,TResult>(initialToVisit: JavascriptIterable<TVisit>, searchAction: (searchControl: SearchControl<TVisit,TResult>, current: TVisit) => void): Iterator<TResult>;\nexport function depthFirstSearch<TVisit,TResult>(parameters: { initialToVisit: JavascriptIterable<TVisit>, searchAction: (searchControl: SearchControl<TVisit,TResult>, current: TVisit) => void }): Iterator<TResult>;\nexport function depthFirstSearch<TVisit,TResult>(parametersOrInitialToVisit: JavascriptIterable<TVisit> | { initialToVisit: JavascriptIterable<TVisit>, searchAction: (searchControl: SearchControl<TVisit,TResult>, current: TVisit) => void }, searchAction?: (searchControl: SearchControl<TVisit,TResult>, current: TVisit) => void): Iterator<TResult>\n{\n let initialToVisit: JavascriptIterable<TVisit>;\n if (isJavascriptIterable(parametersOrInitialToVisit))\n {\n initialToVisit = parametersOrInitialToVisit;\n searchAction = searchAction!;\n }\n else\n {\n PreCondition.assertNotUndefinedAndNotNull(parametersOrInitialToVisit, \"parameters\");\n\n initialToVisit = parametersOrInitialToVisit.initialToVisit;\n searchAction = parametersOrInitialToVisit.searchAction;\n }\n\n PreCondition.assertNotUndefinedAndNotNull(initialToVisit, \"initialToVisit\");\n PreCondition.assertNotUndefinedAndNotNull(searchAction, \"searchAction\");\n\n return DepthFirstSearch.create(initialToVisit, searchAction);\n}","import { SyncDisposable } from \"./basicDisposable\";\r\nimport { AsyncResult } from \"./asyncResult\";\r\n\r\n/**\r\n * An object that can be disposed.\r\n */\r\nexport abstract class Disposable\r\n{\r\n /**\r\n * Create a new {@link Disposable} that will invoke the provided {@link Function} when it is\r\n * disposed.\r\n * @param disposedFunction The function to invoke when the returned {@link Disposable} is\r\n * disposed.\r\n */\r\n public static create(disposedFunction: () => void): SyncDisposable\r\n {\r\n return SyncDisposable.create(disposedFunction);\r\n }\r\n\r\n /**\r\n * Synchronously clean up any resources that this object is using. This function will return\r\n * true if this invocation disposed of the object. Subsequent calls to dispose() will return\r\n * false.\r\n */\r\n public abstract dispose(): AsyncResult<boolean>;\r\n\r\n /**\r\n * Get whether this {@link Disposable} has been disposed yet.\r\n */\r\n public abstract isDisposed(): boolean;\r\n}","import { Iterator } from \"./iterator\";\r\nimport { JavascriptIterable } from \"./javascript\";\r\nimport { PreCondition } from \"./preCondition\";\r\n\r\nexport function andList(values: JavascriptIterable<string>): string\r\n{\r\n return list(\"and\", values);\r\n}\r\n\r\nexport function orList(values: JavascriptIterable<string>): string\r\n{\r\n return list(\"or\", values);\r\n}\r\n\r\nfunction list(conjunction: string, values: JavascriptIterable<string>): string\r\n{\r\n PreCondition.assertNotEmpty(conjunction, \"conjunction\");\r\n PreCondition.assertNotUndefinedAndNotNull(values, \"values\");\r\n\r\n let result: string = \"\";\r\n let index = 0;\r\n const iterator: Iterator<string> = Iterator.create(values).start().await();\r\n while (iterator.hasCurrent())\r\n {\r\n const currentValue: string = iterator.takeCurrent().await();\r\n if (index >= 1)\r\n {\r\n if (iterator.hasCurrent())\r\n {\r\n result += `, `;\r\n }\r\n else\r\n {\r\n if (index >= 2)\r\n {\r\n result += `,`;\r\n }\r\n result += ` ${conjunction} `;\r\n }\r\n }\r\n result += currentValue;\r\n index++;\r\n }\r\n return result;\r\n}","import { Iterator } from \"./iterator\";\nimport { JavascriptIterable, JavascriptIterator } from \"./javascript\";\nimport { List } from \"./list\";\nimport { PreCondition } from \"./preCondition\";\nimport { SyncResult } from \"./syncResult\";\nimport { Type } from \"./types\";\n\n/**\n * A control that can be used to interact with a {@link Generator} while it is generating values.\n */\nexport interface GeneratorControl<T>\n{\n /**\n * Add the provided value to the list of values that the {@link Generator} will return.\n * @param value The value to add to the {@link Generator}'s list of values.\n */\n addValue(value: T): void;\n\n /**\n * Add the provided values to the list of values that the {@link Generator} will return.\n * @param returnValues The values to add to the {@link Generator}'s list of values.\n */\n addValues(returnValues: JavascriptIterable<T>): void;\n\n /**\n * Get whether the {@link Generator} currently has a value.\n */\n hasCurrent(): boolean;\n\n /**\n * Get the current value of the {@link Generator}.\n */\n getCurrent(): T;\n}\n\nclass InnerGeneratorControl<T> implements GeneratorControl<T>\n{\n private readonly returnValues: List<T>;\n private done: boolean;\n\n private constructor()\n {\n this.returnValues = List.create();\n this.done = false;\n }\n\n public static create<T>(): InnerGeneratorControl<T>\n {\n return new InnerGeneratorControl<T>();\n }\n\n public addValue(returnValue: T): void\n {\n PreCondition.assertFalse(this.isDone(), \"this.isDone()\");\n\n this.returnValues.add(returnValue);\n }\n\n public addValues(returnValues: JavascriptIterable<T>): void\n {\n PreCondition.assertFalse(this.isDone(), \"this.isDone()\");\n\n this.returnValues.addAll(returnValues);\n }\n\n public hasCurrent(): boolean\n {\n return this.returnValues.any().await();\n }\n\n public getCurrent(): T\n {\n PreCondition.assertTrue(this.hasCurrent(), \"this.hasCurrent()\");\n PreCondition.assertFalse(this.isDone(), \"this.isDone()\");\n\n return this.returnValues.first().await();\n }\n\n public removeCurrent(): void\n {\n PreCondition.assertTrue(this.hasCurrent(), \"this.hasCurrent()\");\n PreCondition.assertFalse(this.isDone(), \"this.isDone()\");\n\n this.returnValues.removeFirst().await();\n }\n\n public setDone(): void\n {\n PreCondition.assertFalse(this.hasCurrent(), \"this.hasCurrent()\");\n PreCondition.assertFalse(this.isDone(), \"this.isDone()\");\n\n this.done = true;\n }\n\n public isDone(): boolean\n {\n return this.done;\n }\n}\n\nexport class Generator<T> implements Iterator<T>\n{\n private readonly control: InnerGeneratorControl<T>;\n private readonly generatorAction: (control: GeneratorControl<T>) => (void | T);\n private started: boolean;\n\n private constructor(generatorAction: (control: GeneratorControl<T>) => (void | T))\n {\n PreCondition.assertNotUndefinedAndNotNull(generatorAction, \"generatorAction\");\n\n this.control = InnerGeneratorControl.create();\n this.generatorAction = generatorAction;\n this.started = false;\n }\n\n public static create<T>(generatorAction: (control: GeneratorControl<T>) => (void | T)): Generator<T>\n {\n return new Generator<T>(generatorAction);\n }\n\n public next(): SyncResult<boolean>\n {\n return SyncResult.create(() =>\n {\n if (!this.control.isDone())\n {\n if (!this.hasStarted())\n {\n this.started = true;\n }\n else\n {\n this.control.removeCurrent();\n }\n\n if (!this.control.hasCurrent())\n {\n const actionResult: void | T = this.generatorAction(this.control);\n if (actionResult !== undefined)\n {\n this.control.addValue(actionResult);\n }\n\n if (!this.control.hasCurrent())\n {\n this.control.setDone();\n }\n }\n }\n\n return this.hasCurrent();\n });\n }\n\n public hasStarted(): boolean\n {\n return this.started;\n }\n\n public hasCurrent(): boolean\n {\n return this.control.hasCurrent();\n }\n\n public getCurrent(): T\n {\n PreCondition.assertTrue(this.hasCurrent(), \"this.hasCurrent()\");\n\n return this.control.getCurrent();\n }\n\n public start(): SyncResult<this>\n {\n return Iterator.start<T, this>(this);\n }\n\n public takeCurrent(): SyncResult<T>\n {\n return Iterator.takeCurrent(this);\n }\n\n public any(): SyncResult<boolean>\n {\n return Iterator.any(this);\n }\n\n public getCount(): SyncResult<number>\n {\n return Iterator.getCount(this);\n }\n\n public toArray(): SyncResult<T[]>\n {\n return Iterator.toArray(this);\n }\n\n public concatenate(...toConcatenate: JavascriptIterable<T>[]): Iterator<T>\n {\n return Iterator.concatenate(this, ...toConcatenate);\n }\n\n public where(condition: (value: T) => (boolean | SyncResult<boolean>)): Iterator<T>\n {\n return Iterator.where(this, condition);\n }\n\n public map<TOutput>(mapping: (value: T) => TOutput | SyncResult<TOutput>): Iterator<TOutput>\n {\n return Iterator.map(this, mapping);\n }\n\n public flatMap<TOutput>(mapping: (value: T) => JavascriptIterable<TOutput>): Iterator<TOutput>\n {\n return Iterator.flatMap(this, mapping);\n }\n\n public whereInstanceOf<U extends T>(typeCheck: (value: T) => value is U): Iterator<U>\n {\n return Iterator.whereInstanceOf(this, typeCheck);\n }\n\n public whereInstanceOfType<U extends T>(type: Type<U>): Iterator<U>\n {\n return Iterator.whereInstanceOfType(this, type);\n }\n\n public first(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>\n {\n return Iterator.first(this, condition);\n }\n\n public last(condition?: ((value: T) => (boolean | SyncResult<boolean>)) | undefined): SyncResult<T>\n {\n return Iterator.last(this, condition);\n }\n\n public take(maximumToTake: number): Iterator<T>\n {\n return Iterator.take(this, maximumToTake);\n }\n\n public skip(maximumToSkip: number): Iterator<T>\n {\n return Iterator.skip(this, maximumToSkip);\n }\n\n public [Symbol.iterator](): JavascriptIterator<T>\n {\n return Iterator[Symbol.iterator](this);\n }\n}","import { FetchHttpClient } from \"./fetchHttpClient\";\r\nimport { HttpOutgoingRequest } from \"./httpOutgoingRequest\";\r\nimport { HttpIncomingResponse } from \"./httpIncomingResponse\";\r\nimport { HttpMethod } from \"./httpMethod\";\r\nimport { AsyncResult } from \"./asyncResult\";\r\n\r\n/**\r\n * An object that can make HTTP network requests.\r\n */\r\nexport abstract class HttpClient\r\n{\r\n public static create(): HttpClient\r\n {\r\n return FetchHttpClient.create();\r\n }\r\n\r\n /**\r\n * Send the provided {@link HttpOutgoingRequest}.\r\n * @param request The {@link HttpOutgoingRequest} to send.\r\n */\r\n public abstract sendRequest(request: HttpOutgoingRequest): AsyncResult<HttpIncomingResponse>;\r\n\r\n /**\r\n * Send a GET {@link HttpOutgoingRequest} to the provided URL.\r\n * @param url The URL to send the GET {@link HttpOutgoingRequest} to.\r\n */\r\n public sendGetRequest(url: string): AsyncResult<HttpIncomingResponse>\r\n {\r\n return HttpClient.sendGetRequest(this, url);\r\n }\r\n\r\n public static sendGetRequest(httpClient: HttpClient, url: string): AsyncResult<HttpIncomingResponse>\r\n {\r\n return httpClient.sendRequest(HttpOutgoingRequest.create(HttpMethod.GET, url));\r\n }\r\n}","import { HttpHeader } from \"./httpHeader\";\r\nimport { HttpHeaders } from \"./httpHeaders\";\r\nimport { HttpMethod } from \"./httpMethod\";\r\nimport { AsyncResult } from \"./asyncResult\";\r\n\r\n/**\r\n * A HTTP request that is received by a {@link HttpServer}.\r\n */\r\nexport abstract class HttpIncomingRequest\r\n{\r\n /**\r\n * Get the {@link HttpMethod} of the request.\r\n */\r\n public abstract getMethod(): HttpMethod;\r\n\r\n public abstract getHost(): AsyncResult<string>;\r\n\r\n /**\r\n * Get the path component of the requested URL.\r\n */\r\n public abstract getURLPath(): string;\r\n\r\n public abstract getHeaders(): AsyncResult<HttpHeaders>;\r\n\r\n public abstract getHeader(headerName: string): AsyncResult<HttpHeader>;\r\n\r\n public abstract getHeaderValue(headerName: string): AsyncResult<string>;\r\n\r\n public abstract getBody(): AsyncResult<string>;\r\n}","import { CharacterWriteStream } from \"./characterWriteStream\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { getLength } from \"./strings\";\r\nimport { SyncResult } from \"./syncResult\";\r\n\r\nexport class InMemoryCharacterWriteStream extends CharacterWriteStream\r\n{\r\n private writtenText: string;\r\n private newlineSequence: string;\r\n\r\n private constructor()\r\n {\r\n super();\r\n\r\n this.writtenText = \"\";\r\n this.newlineSequence = \"\\n\";\r\n }\r\n\r\n public static create(): InMemoryCharacterWriteStream\r\n {\r\n return new InMemoryCharacterWriteStream();\r\n }\r\n\r\n public getNewlineSequence(): string\r\n {\r\n return this.newlineSequence;\r\n }\r\n\r\n public setNewlineSequence(newlineSequence: string): this\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(newlineSequence, \"newlineSequence\");\r\n\r\n this.newlineSequence = newlineSequence;\r\n\r\n return this;\r\n }\r\n\r\n public getWrittenText(): string\r\n {\r\n return this.writtenText;\r\n }\r\n\r\n public clearWrittenText(): this\r\n {\r\n this.writtenText = \"\";\r\n\r\n return this;\r\n }\r\n\r\n public writeString(text: string): SyncResult<number>\r\n {\r\n return SyncResult.create(() =>\r\n {\r\n if (text)\r\n {\r\n this.writtenText += text;\r\n }\r\n return getLength(text);\r\n });\r\n }\r\n\r\n public writeLine(text?: string): SyncResult<number>\r\n {\r\n return SyncResult.create(() =>\r\n {\r\n let result: number = 0;\r\n if (text)\r\n {\r\n result += this.writeString(text).await();\r\n }\r\n if (this.newlineSequence)\r\n {\r\n result += this.writeString(this.newlineSequence).await();\r\n }\r\n return result;\r\n });\r\n }\r\n}","import { EmptyError } from \"./emptyError\";\nimport { EqualFunctions } from \"./equalFunctions\";\nimport { JavascriptIterable } from \"./javascript\";\nimport { List } from \"./list\";\nimport { PreCondition } from \"./preCondition\";\nimport { Queue } from \"./queue\";\nimport { SyncResult } from \"./syncResult\";\n\nexport class ListQueue<T> implements Queue<T>\n{\n private readonly list: List<T>;\n\n private constructor(list?: List<T>)\n {\n this.list = list ?? List.create();\n }\n\n public static create<T>(list?: List<T>): ListQueue<T>\n {\n return new ListQueue<T>(list);\n }\n\n public any(): SyncResult<boolean>\n {\n return this.list.any();\n }\n\n public add(value: T): SyncResult<void>\n {\n return SyncResult.create(() =>\n {\n this.list.add(value);\n });\n }\n\n public addAll(values: JavascriptIterable<T>): SyncResult<void>\n {\n PreCondition.assertNotUndefinedAndNotNull(values, \"values\");\n\n return SyncResult.create(() =>\n {\n this.list.addAll(values);\n });\n }\n\n public remove(): SyncResult<T>\n {\n return SyncResult.create(() =>\n {\n if (!this.any().await())\n {\n throw new EmptyError();\n }\n return this.list.removeLast().await();\n });\n }\n\n public contains(value: T, equalFunctions?: EqualFunctions): SyncResult<boolean>\n {\n return this.list.contains(value, equalFunctions);\n }\n}","import { Iterator } from \"./iterator\";\nimport { PreCondition } from \"./preCondition\";\nimport { Set } from \"./set\";\n\nexport class Node<T>\n{\n private readonly value: T;\n private connectedNodes: Set<Node<T>>;\n\n private constructor(value: T)\n {\n this.value = value;\n this.connectedNodes = Set.create();\n }\n\n public static create<T>(value: T): Node<T>\n {\n return new Node<T>(value);\n }\n\n public getValue(): T\n {\n return this.value;\n }\n\n public iterateConnectedNodes(): Iterator<Node<T>>\n {\n return this.connectedNodes.iterate();\n }\n\n public addConnectedNode(node: Node<T>): void\n {\n PreCondition.assertNotUndefinedAndNotNull(node, \"node\");\n\n this.connectedNodes.add(node);\n }\n}","import { HttpIncomingRequest } from \"./httpIncomingRequest\";\r\nimport * as http from \"http\";\r\nimport { PreCondition } from \"./preCondition\";\r\nimport { HttpHeader } from \"./httpHeader\";\r\nimport { HttpHeaders } from \"./httpHeaders\";\r\nimport { HttpMethod, parseHttpMethod } from \"./httpMethod\";\r\nimport { NotFoundError } from \"./notFoundError\";\r\nimport { isArray } from \"./types\";\r\nimport { escapeAndQuote } from \"./strings\";\r\nimport { SyncResult } from \"./syncResult\";\r\nimport { AsyncResult } from \"./asyncResult\";\r\n\r\nexport class NodeJSHttpIncomingRequest extends HttpIncomingRequest\r\n{\r\n private readonly request: http.IncomingMessage;\r\n\r\n private constructor(request: http.IncomingMessage)\r\n {\r\n PreCondition.assertNotUndefinedAndNotNull(request, \"request\");\r\n\r\n super();\r\n\r\n this.request = request;\r\n }\r\n\r\n public static create(request: http.IncomingMessage): NodeJSHttpIncomingRequest\r\n {\r\n return new NodeJSHttpIncomingRequest(request);\r\n }\r\n\r\n public getMethod(): HttpMethod\r\n {\r\n return parseHttpMethod(this.request.method!).await();\r\n }\r\n\r\n public getHost(): SyncResult<string>\r\n {\r\n return SyncResult.value(process.env.HOST ?? \"localhost\");\r\n }\r\n\r\n public getURLPath(): string\r\n {\r\n const url: URL = new URL(this.request.url!);\r\n return url.pathname;\r\n }\r\n\r\n private static toHttpHeader(header: [string, string | string[] | undefined]): HttpHeader\r\n {\r\n const headerName: string = header[0];\r\n const headerValue: string = this.toHttpHeaderValue(header[1]);\r\n return HttpHeader.create(headerName, headerValue);\r\n }\r\n\r\n private static toHttpHeaderValue(headerValue: string | string[] | undefined): string\r\n {\r\n let result: string | string[] | undefined = headerValue;\r\n if (result === undefined)\r\n {\r\n result = \"\";\r\n }\r\n else if (isArray(result))\r\n {\r\n result = result.join(\",\");\r\n }\r\n return result;\r\n }\r\n\r\n public getHeaders(): SyncResult<HttpHeaders>\r\n {\r\n return SyncResult.value(HttpHeaders.create(Object.entries(this.request.headers).map(NodeJSHttpIncomingRequest.toHttpHeader)));\r\n }\r\n\r\n public getHeader(headerName: string): SyncResult<HttpHeader>\r\n {\r\n PreCondition.assertNotEmpty(headerName, \"headerName\");\r\n\r\n return SyncResult.create(() =>\r\n {\r\n let result: HttpHeader | undefined;\r\n\r\n const lowerHeaderName: string = headerName.toLowerCase();\r\n for (const header of Object.entries(this.request.headers))\r\n {\r\n if (header[0].toLowerCase() === lowerHeaderName)\r\n {\r\n result = HttpHeader.create(header[0], NodeJSHttpIncomingRequest.toHttpHeaderValue(header[1]));\r\n break;\r\n }\r\n }\r\n if (result === undefined)\r\n {\r\n throw new NotFoundError(`No header with the name ${escapeAndQuote(headerName)} found.`);\r\n }\r\n\r\n return result;\r\n });\r\n }\r\n\r\n public getHeaderValue(headerName: string): SyncResult<string>\r\n {\r\n PreCondition.assertNotEmpty(headerName, \"headerName\");\r\n\r\n return SyncResult.create(() =>\r\n {\r\n let result: string | undefined;\r\n\r\n const lowerHeaderName: string = headerName.toLowerCase();\r\n for (const header of Object.entries(this.request.headers))\r\n {\r\n if (header[0].toLowerCase() === lowerHeaderName)\r\n {\r\n result = NodeJSHttpIncomingRequest.toHttpHeaderValue(header[1]);\r\n break;\r\n }\r\n }\r\n if (result === undefined)\r\n {\r\n throw new NotFoundError(`No header with the name ${escapeAndQuote(headerName)} found.`);\r\n }\r\n\r\n return result;\r\n });\r\n }\r\n\r\n public getBody(): SyncResult<string>\r\n {\r\n return SyncResult.create(() =>\r\n {\r\n throw new NotFoundError(\"Could not read the body from the incoming HTTP request.\");\r\n });\r\n }\r\n}","import { EqualFunctions } from \"./equalFunctions\";\nimport { JavascriptIterable } from \"./javascript\";\nimport { ListQueue } from \"./listQueue\";\nimport { ListStack } from \"./listStack\";\nimport { AsyncResult } from \"./asyncResult\";\n\n/**\n * A data structure that stores values in a first-in-first-out order.\n */\nexport abstract class Queue<T>\n{\n /**\n * Create an instance of the default {@link Queue} implementation.\n * @returns A new {@link Queue} object.\n */\n public static create<T>(): ListQueue<T>\n {\n return ListQueue.create();\n }\n\n /**\n * Get whether there are any values in this {@link Stack}.\n */\n public abstract any(): AsyncResult<boolean>;\n\n /**\n * Add the provided value onto the end of this {@link Queue}.\n * @param value The value to add to the end of this {@link Queue}.\n */\n public abstract add(value: T): AsyncResult<void>;\n\n /**\n * Add the provided values to the end of this {@link Queue}.\n * @param values The values to add to the end of this {@link Queue}.\n */\n public abstract addAll(values: JavascriptIterable<T>): AsyncResult<void>;\n\n /**\n * Remove the next value off of this {@link Queue}.\n */\n public abstract remove(): AsyncResult<T>;\n\n /**\n * Get whether this {@link Stack} contains the provided value.\n * @param value The value to look for.\n * @param equalFunctions The functions to use to compare values.\n */\n public abstract contains(value: T, equalFunctions?: EqualFunctions): AsyncResult<boolean>;\n}","import { PromiseAsyncResult } from \"./promiseAsyncResult\";\nimport { DateTime } from \"./dateTime\";\nimport { HttpClient } from \"./httpClient\";\nimport { HttpIncomingResponse } from \"./httpIncomingResponse\";\nimport { HttpOutgoingRequest } from \"./httpOutgoingRequest\";\nimport { Iterable } from \"./iterable\";\nimport { List } from \"./list\";\nimport { PreCondition } from \"./preCondition\";\nimport { AsyncResult } from \"./asyncResult\";\n\nexport interface RecreationDotGovDivisionDayAvailability\n{\n readonly date: DateTime;\n\n readonly walkup: boolean;\n\n readonly reservationsRemaining: number;\n\n readonly totalSpots: number;\n}\n\nexport interface RecreationDotGovDivisionAvailabilityJson\n{\n readonly bools: { [date: string]: boolean };\n\n readonly rules: {\n readonly name: string;\n readonly value: number;\n }[];\n\n readonly quota_type_maps: {\n readonly ConstantQuotaUsageDaily?: {\n [date: string]: {\n readonly is_hidden: boolean;\n readonly remaining: number;\n readonly season_type: string;\n readonly show_walkup: boolean;\n readonly total: number;\n };\n };\n readonly QuotaUsageByMemberDaily?: {\n [date: string]: {\n readonly is_hidden: boolean;\n readonly remaining: number;\n readonly season_type: string;\n readonly show_walkup: boolean;\n readonly total: number;\n };\n };\n };\n}\n\nexport class RecreationDotGovDivisionAvailability\n{\n public readonly json: RecreationDotGovDivisionAvailabilityJson;\n\n public readonly minimumGroupSize?: number;\n public readonly maximumGroupSize?: number;\n public readonly dayAvailabilities: Iterable<RecreationDotGovDivisionDayAvailability>;\n\n private constructor(json: RecreationDotGovDivisionAvailabilityJson)\n {\n PreCondition.assertNotUndefinedAndNotNull(json, \"json\");\n\n this.json = json;\n\n const minGroupSize: string = \"MinGroupSize\".toLowerCase();\n const maxGroupSize: string = \"MaxGroupSize\".toLowerCase();\n for (const rule of json.rules)\n {\n switch (rule.name.toLowerCase())\n {\n case minGroupSize:\n this.minimumGroupSize = rule.value;\n break;\n\n case maxGroupSize:\n this.maximumGroupSize = rule.value;\n break;\n }\n }\n\n const dayAvailabilities = List.create<RecreationDotGovDivisionDayAvailability>();\n const quotaUsageByMemberDaily = json.quota_type_maps?.QuotaUsageByMemberDaily;\n if (quotaUsageByMemberDaily)\n {\n for (const quotaUsage of Object.entries(quotaUsageByMemberDaily))\n {\n const dateString: string = quotaUsage[0];\n\n const usageData = quotaUsage[1];\n\n let walkup: boolean = false;\n let reservationsRemaining: number = 0;\n const boolsEntry: boolean = json.bools[dateString];\n if (boolsEntry)\n {\n walkup = usageData.show_walkup;\n reservationsRemaining = usageData.remaining;\n }\n\n dayAvailabilities.add({\n date: DateTime.parse(dateString),\n totalSpots: usageData.total,\n walkup,\n reservationsRemaining,\n });\n }\n }\n this.dayAvailabilities = dayAvailabilities;\n }\n\n public static create(json: RecreationDotGovDivisionAvailabilityJson): RecreationDotGovDivisionAvailability\n {\n return new RecreationDotGovDivisionAvailability(json);\n }\n}\n\ninterface RecreationDotGovPayloadResponse<T>\n{\n readonly payload: T;\n}\n\nexport interface RecreationDotGovDivisionJson\n{\n readonly id: string;\n\n readonly name: string;\n\n readonly type: string;\n\n readonly district: string;\n}\n\nexport interface RecreationDotGovPermitItineraryJson\n{\n readonly id: string;\n\n readonly name: string;\n\n readonly divisions: { [divisionId: number]: RecreationDotGovDivisionJson };\n}\n\nexport class RecreationDotGovError extends Error\n{\n public constructor(message: string)\n {\n super(message);\n }\n}\n\nexport interface RecreationDotGovErrorResponse\n{\n readonly error: string;\n}\n\nexport class RecreationDotGovClient implements HttpClient\n{\n private readonly httpClient: HttpClient;\n\n private constructor(httpClient: HttpClient)\n {\n PreCondition.assertNotUndefinedAndNotNull(httpClient, \"httpClient\");\n\n this.httpClient = httpClient;\n }\n\n public static create(httpClient: HttpClient): RecreationDotGovClient\n {\n return new RecreationDotGovClient(httpClient);\n }\n\n public sendRequest(request: HttpOutgoingRequest): AsyncResult<HttpIncomingResponse>\n {\n return this.httpClient.sendRequest(request);\n }\n\n public sendGetRequest(url: string): AsyncResult<HttpIncomingResponse>\n {\n return HttpClient.sendGetRequest(this, url);\n }\n\n public getPermitItinerary(permitItineraryId: string): PromiseAsyncResult<RecreationDotGovPermitItineraryJson>\n {\n PreCondition.assertNotEmpty(permitItineraryId, \"permitItineraryId\");\n\n return PromiseAsyncResult.create(async () =>\n {\n const response: HttpIncomingResponse = await this.sendGetRequest(`https://www.recreation.gov/api/permitcontent/${permitItineraryId}`);\n\n const responseBody: string = await response.getBody();\n\n const statusCode: number = response.getStatusCode();\n if (statusCode < 200 || 300 <= statusCode)\n {\n const responseBodyJson: RecreationDotGovErrorResponse = JSON.parse(responseBody);\n const errorMessage: string = responseBodyJson.error;\n switch (errorMessage.toLowerCase())\n {\n case \"permit not found\":\n throw new RecreationDotGovError(`No permit itinerary found for id: ${JSON.stringify(permitItineraryId)}`);\n \n default:\n throw new RecreationDotGovError(`Unrecognized error: ${JSON.stringify(errorMessage)}`);\n }\n }\n\n const responseBodyJson: RecreationDotGovPayloadResponse<RecreationDotGovPermitItineraryJson> = JSON.parse(responseBody);\n return responseBodyJson.payload;\n });\n }\n\n public getDivisionAvailability(permitItineraryId: string, divisionId: string, month: number, year: number, earlyAccessPermitLotteryId?: string): PromiseAsyncResult<RecreationDotGovDivisionAvailability>\n {\n PreCondition.assertNotEmpty(permitItineraryId, \"permitItineraryId\");\n PreCondition.assertNotEmpty(divisionId, \"divisionId\");\n PreCondition.assertBetween(1, month, 12, \"month\");\n\n return PromiseAsyncResult.create(async () =>\n {\n const url: string = earlyAccessPermitLotteryId\n ? `https://www.recreation.gov/api/permititinerary/${permitItineraryId}/division/${divisionId}/eapavailability/month/${earlyAccessPermitLotteryId}?month=${month}&year=${year}`\n : `https://www.recreation.gov/api/permititinerary/${permitItineraryId}/division/${divisionId}/availability/month?month=${month}&year=${year}`\n const response: HttpIncomingResponse = await this.sendGetRequest(url);\n\n let responseBody: string = await response.getBody();\n\n const statusCode: number = response.getStatusCode();\n if (statusCode < 200 || 300 <= statusCode)\n {\n const responseBodyJson: RecreationDotGovErrorResponse = JSON.parse(responseBody) as RecreationDotGovErrorResponse;\n const errorMessage: string = responseBodyJson.error;\n switch (errorMessage.toLowerCase())\n {\n case \"invalid permit id\":\n throw new RecreationDotGovError(`No permit itinerary found for id: ${JSON.stringify(permitItineraryId)}`);\n\n case \"request year is missing or invalid\":\n // Ignore this error and just return an empty availability.\n const emptyResponseBody: RecreationDotGovPayloadResponse<RecreationDotGovDivisionAvailabilityJson> = {\n payload: {\n bools: {},\n rules: [],\n quota_type_maps: {},\n },\n };\n responseBody = JSON.stringify(emptyResponseBody);\n break;\n \n default:\n throw new RecreationDotGovError(`Unrecognized error: ${JSON.stringify(errorMessage)}`);\n }\n }\n\n const responseBodyJson: RecreationDotGovPayloadResponse<RecreationDotGovDivisionAvailabilityJson> = JSON.parse(responseBody);\n return RecreationDotGovDivisionAvailability.create(responseBodyJson.payload);\n });\n }\n}","import { JavascriptIterable } from \"./javascript\";\n\n/**\n * An object that can be used to implement a search algorithm.\n */\nexport abstract class SearchControl<TVisit,TResult>\n{\n /**\n * Add the provided value to the to-visit list.\n * @param value The value to add to the to-visit list.\n */\n public abstract addToVisit(value: TVisit): void;\n\n /**\n * Add the provided values to the to-visit list.\n * @param values The values to add to the to-visit list.\n */\n public abstract addAllToVisit(values: JavascriptIterable<TVisit>): void;\n\n /**\n * Get whether the provided value has already been visited.\n * @param value The value to check.\n */\n public abstract hasVisited(value: TVisit): boolean;\n\n /**\n * Add the provided value to the list of values to be returned.\n * @param value The value to add.\n */\n public abstract addResult(value: TResult): void;\n\n /**\n * Add the provided values to the list of values to be returned.\n * @param values The values to add.\n */\n public abstract addResults(values: JavascriptIterable<TResult>): void;\n\n /**\n * Immediately stop the search.\n */\n public abstract break(): never;\n}","import { Comparer } from \"./comparer\";\r\nimport { Comparison } from \"./comparison\";\r\n\r\n/**\r\n * A {@link Comparer} that performs {@link string} comparisons.\r\n */\r\nexport class StringComparer extends Comparer<string>\r\n{\r\n protected constructor()\r\n {\r\n super();\r\n }\r\n\r\n public static create(): StringComparer\r\n {\r\n return new StringComparer();\r\n }\r\n\r\n public override compare(left: string, right: string): Comparison\r\n {\r\n return StringComparer.compare(left, right);\r\n }\r\n\r\n public static compare(left: string, right: string): Comparison\r\n {\r\n let result: Comparison | undefined = Comparer.compareSameUndefinedNull(left, right);\r\n if (result === undefined)\r\n {\r\n result = (left < right ? Comparison.LessThan : Comparison.GreaterThan);\r\n }\r\n return result;\r\n }\r\n}","import { DateTime } from \"./dateTime\";\nimport { HttpClient } from \"./httpClient\";\nimport { HttpIncomingResponse } from \"./httpIncomingResponse\";\nimport { HttpOutgoingRequest } from \"./httpOutgoingRequest\";\nimport { Iterable } from \"./iterable\";\nimport { PreCondition } from \"./preCondition\";\nimport { RecreationDotGovClient, RecreationDotGovDivisionAvailability, RecreationDotGovDivisionDayAvailability } from \"./recreationDotGovClient\";\nimport { AsyncResult } from \"./asyncResult\";\nimport { Map } from \"./map\";\nimport { List } from \"./list\";\nimport { JavascriptIterable } from \"./javascript\";\nimport { hasProperty, isNumber, isObject, isUndefinedOrNull } from \"./types\";\nimport { MutableMap } from \"./mutableMap\";\nimport { NotFoundError } from \"./notFoundError\";\nimport { Iterator } from \"./iterator\";\nimport { Stack } from \"./stack\";\nimport { ListStack } from \"./listStack\";\nimport { PromiseAsyncResult } from \"./promiseAsyncResult\";\nimport { SyncResult } from \"./syncResult\";\n\nexport interface WonderlandTrailLocation\n{\n readonly name: string;\n readonly trailhead: boolean;\n readonly foodCacheStorage: boolean;\n readonly divisionId: string;\n readonly groupSiteDivisionId: string;\n readonly latitude: number;\n readonly longitude: number;\n readonly elevationFeet: number;\n}\n\nexport function isWonderlandTrailLocation(value: unknown): value is WonderlandTrailLocation\n{\n return isObject(value) &&\n hasProperty(value, \"name\") &&\n hasProperty(value, \"trailhead\") &&\n hasProperty(value, \"foodCacheStorage\") &&\n hasProperty(value, \"divisionId\") &&\n hasProperty(value, \"groupSiteDivisionId\");\n}\n\nexport abstract class WonderlandTrailLocations\n{\n public static readonly graniteCreek: WonderlandTrailLocation = {\n name: \"Granite Creek\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170009\",\n groupSiteDivisionId: \"46753170010\",\n latitude: 46.92058,\n longitude: -121.70800,\n elevationFeet: 5851,\n };\n\n public static readonly sunriseCamp: WonderlandTrailLocation = {\n name: \"Sunrise Camp\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170058\",\n groupSiteDivisionId: \"46753170059\",\n latitude: 46.91129,\n longitude: -121.66002,\n elevationFeet: 6258,\n };\n\n public static readonly sunriseVisitorCenter: WonderlandTrailLocation = {\n name: \"Sunrise Visitor Center\",\n trailhead: true,\n foodCacheStorage: true,\n divisionId: \"\",\n groupSiteDivisionId: \"\",\n latitude: 46.91448,\n longitude: -121.64337,\n elevationFeet: 6410,\n };\n\n public static readonly whiteRiver: WonderlandTrailLocation = {\n name: \"White River\",\n trailhead: true,\n foodCacheStorage: true,\n divisionId: \"46753170066\",\n groupSiteDivisionId: \"46753170067\",\n latitude: 46.90255,\n longitude: -121.63869,\n elevationFeet: 4229,\n };\n\n public static readonly fryingPanCreek: WonderlandTrailLocation = {\n name: \"Fryingpan Creek\",\n trailhead: true,\n foodCacheStorage: false,\n divisionId: \"\",\n groupSiteDivisionId: \"\",\n latitude: 46.88809,\n longitude: -121.61019,\n elevationFeet: 3835,\n };\n\n public static readonly summerland: WonderlandTrailLocation = {\n name: \"Summerland\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170056\",\n groupSiteDivisionId: \"46753170057\",\n latitude: 46.86616,\n longitude: -121.65843,\n elevationFeet: 5988,\n };\n\n public static readonly indianBar: WonderlandTrailLocation = {\n name: \"Indian Bar\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170046\",\n groupSiteDivisionId: \"46753170047\",\n latitude: 46.82593,\n longitude: -121.63942,\n elevationFeet: 5101,\n };\n\n public static readonly nickelCreek: WonderlandTrailLocation = {\n name: \"Nickel Creek\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170051\",\n groupSiteDivisionId: \"46753170052\",\n latitude: 46.77204,\n longitude: -121.62402,\n elevationFeet: 3383,\n };\n\n public static readonly boxCanyon: WonderlandTrailLocation = {\n name: \"Box Canyon\",\n trailhead: true,\n foodCacheStorage: false,\n divisionId: \"\",\n groupSiteDivisionId: \"\",\n latitude: 46.76570,\n longitude: -121.63517,\n elevationFeet: 3025,\n };\n\n public static readonly mapleCreek: WonderlandTrailLocation = {\n name: \"Maple Creek\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170027\",\n groupSiteDivisionId: \"46753170028\",\n latitude: 46.75745,\n longitude: -121.65764,\n elevationFeet: 2806,\n };\n\n public static readonly reflectionLakes: WonderlandTrailLocation = {\n name: \"Reflection Lakes\",\n trailhead: true,\n foodCacheStorage: false,\n divisionId: \"\",\n groupSiteDivisionId: \"\",\n latitude: 46.76824,\n longitude: -121.72890,\n elevationFeet: 4862,\n };\n\n public static readonly paradiseRiver: WonderlandTrailLocation = {\n name: \"Paradise River\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170031\",\n groupSiteDivisionId: \"46753170032\",\n latitude: 46.77076,\n longitude: -121.75909,\n elevationFeet: 3960,\n };\n\n public static readonly longmire: WonderlandTrailLocation = {\n name: \"Longmire\",\n trailhead: true,\n foodCacheStorage: true,\n divisionId: \"\",\n groupSiteDivisionId: \"\",\n latitude: 46.75011,\n longitude: -121.81253,\n elevationFeet: 2750,\n };\n\n public static readonly pyramidCreek: WonderlandTrailLocation = {\n name: \"Pyramid Creek\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170033\",\n groupSiteDivisionId: \"\",\n latitude: 46.77832,\n longitude: -121.80963,\n elevationFeet: 3721,\n };\n\n public static readonly devilsDream: WonderlandTrailLocation = {\n name: \"Devil's Dream\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170040\",\n groupSiteDivisionId: \"46753170041\",\n latitude: 46.78196,\n longitude: -121.83297,\n elevationFeet: 4929,\n };\n\n public static readonly southPuyallupRiver: WonderlandTrailLocation = {\n name: \"South Puyallup River\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170035\",\n groupSiteDivisionId: \"46753170036\",\n latitude: 46.81331,\n longitude: -121.86445,\n elevationFeet: 4183,\n };\n\n public static readonly klapatchePark: WonderlandTrailLocation = {\n name: \"Klapatche Park\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170024\",\n groupSiteDivisionId: \"\",\n latitude: 46.83571,\n longitude: -121.87752,\n elevationFeet: 5496,\n };\n\n public static readonly northPuyallupRiver: WonderlandTrailLocation = {\n name: \"North Puyallup River\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170029\",\n groupSiteDivisionId: \"46753170030\",\n latitude: 46.84751,\n longitude: -121.87005,\n elevationFeet: 3733,\n };\n\n public static readonly goldenLakes: WonderlandTrailLocation = {\n name: \"Golden Lakes\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170022\",\n groupSiteDivisionId: \"46753170023\",\n latitude: 46.88327,\n longitude: -121.89919,\n elevationFeet: 4927,\n };\n\n public static readonly southMowichRiver: WonderlandTrailLocation = {\n name: \"South Mowich River\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170019\",\n groupSiteDivisionId: \"46753170020\",\n latitude: 46.91146,\n longitude: -121.89314,\n elevationFeet: 2686,\n };\n\n public static readonly mowichLake: WonderlandTrailLocation = {\n name: \"Mowich Lake\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170015\",\n groupSiteDivisionId: \"46753170016\",\n latitude: 46.93204,\n longitude: -121.86351,\n elevationFeet: 4868,\n };\n\n public static readonly eaglesRoost: WonderlandTrailLocation = {\n name: \"Eagle's Roost\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170006\",\n groupSiteDivisionId: \"\",\n latitude: 46.91529,\n longitude: -121.84816,\n elevationFeet: 4834,\n };\n\n public static readonly cataractValley: WonderlandTrailLocation = {\n name: \"Cataract Valley\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170003\",\n groupSiteDivisionId: \"46753170004\",\n latitude: 46.94049,\n longitude: -121.80486,\n elevationFeet: 4488,\n };\n\n public static readonly ipsutCreek: WonderlandTrailLocation = {\n name: \"Ipsut Creek\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170011\",\n groupSiteDivisionId: \"46753170012\",\n latitude: 46.97615,\n longitude: -121.83022,\n elevationFeet: 2359,\n };\n\n public static readonly carbonRiver: WonderlandTrailLocation = {\n name: \"Carbon River\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170001\",\n groupSiteDivisionId: \"46753170002\",\n latitude: 46.95063,\n longitude: -121.79991,\n elevationFeet: 3255,\n };\n\n public static readonly dickCreek: WonderlandTrailLocation = {\n name: \"Dick Creek\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170005\",\n groupSiteDivisionId: \"\",\n latitude: 46.94071,\n longitude: -121.78431,\n elevationFeet: 4114,\n };\n\n public static readonly mysticLake: WonderlandTrailLocation = {\n name: \"Mystic Lake\",\n trailhead: false,\n foodCacheStorage: false,\n divisionId: \"46753170017\",\n groupSiteDivisionId: \"46753170018\",\n latitude: 46.91570,\n longitude: -121.75045,\n elevationFeet: 5538,\n };\n\n public static getLocations(): Iterable<WonderlandTrailLocation>\n {\n return Iterable.create([\n this.graniteCreek,\n this.sunriseCamp,\n this.sunriseVisitorCenter,\n this.whiteRiver,\n this.fryingPanCreek,\n this.summerland,\n this.indianBar,\n this.nickelCreek,\n this.boxCanyon,\n this.mapleCreek,\n this.reflectionLakes,\n this.paradiseRiver,\n this.longmire,\n this.pyramidCreek,\n this.devilsDream,\n this.southPuyallupRiver,\n this.klapatchePark,\n this.northPuyallupRiver,\n this.goldenLakes,\n this.southMowichRiver,\n this.mowichLake,\n this.eaglesRoost,\n this.cataractValley,\n this.ipsutCreek,\n this.carbonRiver,\n this.dickCreek,\n this.mysticLake,\n ]);\n }\n\n public static getTrailheads(): Iterable<WonderlandTrailLocation>\n {\n return this.getLocations().where(location => location.trailhead);\n }\n}\n\nexport enum WonderlandTrailReservationType\n{\n Reserved,\n Walkup,\n}\n\nexport interface WonderlandTrailAvailabilityType\n{\n readonly individualSite?: WonderlandTrailReservationType;\n readonly groupSite?: WonderlandTrailReservationType;\n}\n\nexport class WonderlandTrailAvailability\n{\n private readonly availabilityMap: MutableMap<WonderlandTrailLocation, MutableMap<string, WonderlandTrailAvailabilityType>>;\n\n private constructor()\n {\n this.availabilityMap = Map.create();\n }\n\n public static create(): WonderlandTrailAvailability\n {\n return new WonderlandTrailAvailability();\n }\n\n public any(): boolean\n {\n return this.availabilityMap.any().await();\n }\n\n public addAvailability(location: WonderlandTrailLocation, date: DateTime, individualSite?: WonderlandTrailReservationType, groupSite?: WonderlandTrailReservationType): void\n {\n PreCondition.assertNotUndefinedAndNotNull(location, \"location\");\n PreCondition.assertNotUndefinedAndNotNull(date, \"date\");\n\n const locationAvailability: MutableMap<string, WonderlandTrailAvailabilityType> | undefined = this.getAvailability(location);\n\n const dateString: string = date.toDateString();\n const locationDayAvailability: WonderlandTrailAvailabilityType = locationAvailability.getOrSet(dateString, () => { return {}; }).await();\n locationAvailability.set(dateString, {\n individualSite: individualSite ?? locationDayAvailability.individualSite,\n groupSite: groupSite ?? locationDayAvailability.groupSite,\n });\n }\n\n public getAvailability(location: WonderlandTrailLocation): MutableMap<string, WonderlandTrailAvailabilityType>\n {\n PreCondition.assertNotUndefinedAndNotNull(location, \"location\");\n\n return this.availabilityMap.getOrSet(location, () => MutableMap.create()).await();\n }\n\n public getDayAvailability(location: WonderlandTrailLocation, date: DateTime): SyncResult<WonderlandTrailAvailabilityType>\n {\n PreCondition.assertNotUndefinedAndNotNull(location, \"location\");\n PreCondition.assertNotUndefinedAndNotNull(date, \"date\");\n\n return this.getAvailability(location).get(date.toDateString())\n .convertError(NotFoundError, () => new NotFoundError(`No availability was found for ${location.name} on ${date.toDateString()}.`));\n }\n}\n\nexport class WonderlandTrailDirection\n{\n private readonly value: string;\n\n private constructor(value: string)\n {\n PreCondition.assertNotEmpty(value, \"value\");\n\n this.value = value;\n }\n\n public static readonly clockwise = new WonderlandTrailDirection(\"Clockwise\");\n public static readonly counterClockwise = new WonderlandTrailDirection(\"CounterClockwise\");\n\n public toString(): string\n {\n return this.value;\n }\n\n public reverse(): WonderlandTrailDirection\n {\n return this === WonderlandTrailDirection.clockwise ? WonderlandTrailDirection.counterClockwise : WonderlandTrailDirection.clockwise;\n }\n}\n\nexport class WonderlandTrailConnection\n{\n public readonly startLocation: WonderlandTrailLocation;\n public readonly endLocation: WonderlandTrailLocation;\n public readonly distanceMiles: number;\n public readonly ascentFeet: number;\n public readonly descentFeet: number;\n public readonly direction: WonderlandTrailDirection;\n public readonly intermediateLocations: Iterable<WonderlandTrailLocation>;\n\n private constructor(startLocation: WonderlandTrailLocation, endLocation: WonderlandTrailLocation, distanceMiles: number, ascentFeet: number, descentFeet: number, direction: WonderlandTrailDirection, intermediateLocations: Iterable<WonderlandTrailLocation>)\n {\n PreCondition.assertNotUndefinedAndNotNull(startLocation, \"startLocation\");\n PreCondition.assertNotUndefinedAndNotNull(endLocation, \"endLocation\");\n PreCondition.assertGreaterThanOrEqualTo(distanceMiles, 0, \"distanceMiles\");\n PreCondition.assertGreaterThanOrEqualTo(ascentFeet, 0, \"ascentFeet\");\n PreCondition.assertGreaterThanOrEqualTo(descentFeet, 0, \"descentFeet\");\n PreCondition.assertNotUndefinedAndNotNull(intermediateLocations, \"intermediateLocations\");\n\n this.startLocation = startLocation;\n this.endLocation = endLocation;\n this.distanceMiles = distanceMiles;\n this.ascentFeet = ascentFeet;\n this.descentFeet = descentFeet;\n this.direction = direction;\n this.intermediateLocations = intermediateLocations;\n }\n\n public static create(startLocation: WonderlandTrailLocation, endLocation: WonderlandTrailLocation, distanceMiles: number, ascentFeet: number, descentFeet: number, direction: WonderlandTrailDirection, intermediateLocations: Iterable<WonderlandTrailLocation>): WonderlandTrailConnection\n {\n return new WonderlandTrailConnection(startLocation, endLocation, distanceMiles, ascentFeet, descentFeet, direction, intermediateLocations);\n }\n\n public getLocations(): Iterable<WonderlandTrailLocation>\n {\n const result: List<WonderlandTrailLocation> = List.create();\n WonderlandTrailConnection.ensureExists(result, this.startLocation);\n WonderlandTrailConnection.ensureAllExist(result, this.intermediateLocations);\n WonderlandTrailConnection.ensureExists(result, this.endLocation);\n return result;\n }\n\n private static ensureExists(list: List<WonderlandTrailLocation>, location: WonderlandTrailLocation): void\n {\n if (!list.contains(location).await())\n {\n list.add(location);\n }\n }\n\n private static ensureAllExist(list: List<WonderlandTrailLocation>, locations: JavascriptIterable<WonderlandTrailLocation>): void\n {\n for (const location of locations)\n {\n WonderlandTrailConnection.ensureExists(list, location);\n }\n }\n\n public reverseDirection(): WonderlandTrailConnection\n {\n return WonderlandTrailConnection.create(\n this.endLocation,\n this.startLocation,\n this.distanceMiles,\n this.descentFeet,\n this.ascentFeet,\n this.direction.reverse(),\n this.intermediateLocations,\n )\n }\n\n public join(connection: WonderlandTrailConnection): WonderlandTrailConnection\n {\n const intermediateLocations: List<WonderlandTrailLocation> = List.create();\n WonderlandTrailConnection.ensureAllExist(intermediateLocations, this.intermediateLocations);\n WonderlandTrailConnection.ensureExists(intermediateLocations, this.endLocation);\n WonderlandTrailConnection.ensureExists(intermediateLocations, connection.startLocation);\n WonderlandTrailConnection.ensureAllExist(intermediateLocations, connection.intermediateLocations);\n\n return WonderlandTrailConnection.create(\n this.startLocation,\n connection.endLocation,\n this.distanceMiles + connection.distanceMiles,\n this.ascentFeet + connection.ascentFeet,\n this.descentFeet + connection.descentFeet,\n this.direction,\n intermediateLocations,\n );\n }\n\n public containsLocation(location: WonderlandTrailLocation): boolean\n {\n return this.getLocations().contains(location).await();\n }\n\n public isLoop(): boolean\n {\n return this.startLocation === this.endLocation;\n }\n}\n\nexport class WonderlandTrailConnections\n{\n private connections: MutableMap<WonderlandTrailLocation, List<WonderlandTrailConnection>>;\n public readonly addReverseConnectionDefault: boolean;\n\n private constructor(addReverseConnectionDefault: boolean)\n {\n this.connections = Map.create();\n this.addReverseConnectionDefault = addReverseConnectionDefault;\n }\n\n public static create(addReverseConnectionDefault?: boolean): WonderlandTrailConnections\n {\n return new WonderlandTrailConnections(!!addReverseConnectionDefault);\n }\n\n public static createDefault(): WonderlandTrailConnections\n {\n return WonderlandTrailConnections.create(true)\n .addConnection({\n startLocation: WonderlandTrailLocations.whiteRiver,\n endLocation: WonderlandTrailLocations.fryingPanCreek,\n distanceMiles: 2.7,\n ascentFeet: 100,\n descentFeet: 600,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.fryingPanCreek,\n endLocation: WonderlandTrailLocations.summerland,\n distanceMiles: 4.3,\n ascentFeet: 2200,\n descentFeet: 100,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.summerland,\n endLocation: WonderlandTrailLocations.indianBar,\n distanceMiles: 4.7,\n ascentFeet: 1200,\n descentFeet: 2100,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.indianBar,\n endLocation: WonderlandTrailLocations.nickelCreek,\n distanceMiles: 6.8,\n ascentFeet: 1400,\n descentFeet: 3200,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.nickelCreek,\n endLocation: WonderlandTrailLocations.boxCanyon,\n distanceMiles: 0.9,\n ascentFeet: 100,\n descentFeet: 400,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.boxCanyon,\n endLocation: WonderlandTrailLocations.mapleCreek,\n distanceMiles: 2.7,\n ascentFeet: 500,\n descentFeet: 700,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.mapleCreek,\n endLocation: WonderlandTrailLocations.reflectionLakes,\n distanceMiles: 4.7,\n ascentFeet: 2300,\n descentFeet: 200,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.reflectionLakes,\n endLocation: WonderlandTrailLocations.paradiseRiver,\n distanceMiles: 2.6,\n ascentFeet: 200,\n descentFeet: 1200,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.paradiseRiver,\n endLocation: WonderlandTrailLocations.longmire,\n distanceMiles: 3.6,\n ascentFeet: 100,\n descentFeet: 1200,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.longmire,\n endLocation: WonderlandTrailLocations.pyramidCreek,\n distanceMiles: 3.3,\n ascentFeet: 1400,\n descentFeet: 400,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.pyramidCreek,\n endLocation: WonderlandTrailLocations.devilsDream,\n distanceMiles: 2.5,\n ascentFeet: 1400,\n descentFeet: 100,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.devilsDream,\n endLocation: WonderlandTrailLocations.southPuyallupRiver,\n distanceMiles: 6.5,\n ascentFeet: 1900,\n descentFeet: 2700,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.southPuyallupRiver,\n endLocation: WonderlandTrailLocations.klapatchePark,\n distanceMiles: 4.1,\n ascentFeet: 2100,\n descentFeet: 800,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.klapatchePark,\n endLocation: WonderlandTrailLocations.northPuyallupRiver,\n distanceMiles: 2.6,\n ascentFeet: 100,\n descentFeet: 1900,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.northPuyallupRiver,\n endLocation: WonderlandTrailLocations.goldenLakes,\n distanceMiles: 5.1,\n ascentFeet: 1900,\n descentFeet: 600,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.goldenLakes,\n endLocation: WonderlandTrailLocations.southMowichRiver,\n distanceMiles: 5.8,\n ascentFeet: 200,\n descentFeet: 2400,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.southMowichRiver,\n endLocation: WonderlandTrailLocations.mowichLake,\n distanceMiles: 4.4,\n ascentFeet: 2400,\n descentFeet: 300,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.mowichLake,\n endLocation: WonderlandTrailLocations.ipsutCreek,\n distanceMiles: 5.6,\n ascentFeet: 400,\n descentFeet: 3000,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.ipsutCreek,\n endLocation: WonderlandTrailLocations.carbonRiver,\n distanceMiles: 4,\n ascentFeet: 1300,\n descentFeet: 400,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.mowichLake,\n endLocation: WonderlandTrailLocations.eaglesRoost,\n distanceMiles: 2,\n ascentFeet: 500,\n descentFeet: 600,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.eaglesRoost,\n endLocation: WonderlandTrailLocations.cataractValley,\n distanceMiles: 12.4,\n ascentFeet: 3300,\n descentFeet: 3700,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.cataractValley,\n endLocation: WonderlandTrailLocations.carbonRiver,\n distanceMiles: 1.6,\n ascentFeet: 100,\n descentFeet: 1300,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.carbonRiver,\n endLocation: WonderlandTrailLocations.dickCreek,\n distanceMiles: 1.3,\n ascentFeet: 1000,\n descentFeet: 100,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.dickCreek,\n endLocation: WonderlandTrailLocations.mysticLake,\n distanceMiles: 3.7,\n ascentFeet: 2100,\n descentFeet: 600,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.mysticLake,\n endLocation: WonderlandTrailLocations.graniteCreek,\n distanceMiles: 4.1,\n ascentFeet: 1500,\n descentFeet: 1200,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.graniteCreek,\n endLocation: WonderlandTrailLocations.sunriseCamp,\n distanceMiles: 4.6,\n ascentFeet: 1400,\n descentFeet: 1000,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.sunriseCamp,\n endLocation: WonderlandTrailLocations.whiteRiver,\n distanceMiles: 3.5,\n ascentFeet: 100,\n descentFeet: 2100,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.sunriseCamp,\n endLocation: WonderlandTrailLocations.sunriseVisitorCenter,\n distanceMiles: 1.4,\n ascentFeet: 400,\n descentFeet: 200,\n })\n .addConnection({\n startLocation: WonderlandTrailLocations.sunriseVisitorCenter,\n endLocation: WonderlandTrailLocations.whiteRiver,\n distanceMiles: 3.1,\n ascentFeet: 0,\n descentFeet: 2200,\n });\n }\n\n public iterateConnections(startLocation?: WonderlandTrailLocation, endLocation?: WonderlandTrailLocation, direction?: WonderlandTrailDirection): Iterator<WonderlandTrailConnection>;\n public iterateConnections(properties: { startLocation?: WonderlandTrailLocation, endLocation?: WonderlandTrailLocation, direction?: WonderlandTrailDirection }): Iterator<WonderlandTrailConnection>;\n iterateConnections(startLocationOrProperties?: WonderlandTrailLocation | { startLocation?: WonderlandTrailLocation, endLocation?: WonderlandTrailLocation, direction?: WonderlandTrailDirection }, endLocation?: WonderlandTrailLocation, direction?: WonderlandTrailDirection): Iterator<WonderlandTrailConnection>\n {\n let startLocation: WonderlandTrailLocation | undefined;\n if (isWonderlandTrailLocation(startLocationOrProperties))\n {\n startLocation = startLocationOrProperties;\n }\n else if (startLocationOrProperties)\n {\n startLocation = startLocationOrProperties.startLocation;\n endLocation = startLocationOrProperties.endLocation;\n direction = startLocationOrProperties.direction;\n }\n\n let result: Iterator<WonderlandTrailConnection>;\n if (!startLocation)\n {\n result = this.connections.iterateValues().flatMap(x => x);\n }\n else\n {\n result = this.connections.get(startLocation)\n .catch(NotFoundError, () => Iterable.create<WonderlandTrailConnection>())\n .await()\n .iterate();\n }\n\n if (endLocation)\n {\n result = result.where(connection => connection.endLocation == endLocation);\n }\n\n if (direction != null)\n {\n result = result.where(connection => connection.direction == direction);\n }\n\n return result;\n }\n\n private addConnectionInner(connection: WonderlandTrailConnection): void\n {\n const startLocationConnections: List<WonderlandTrailConnection> = this.connections.getOrSet(connection.startLocation, () => List.create()).await();\n startLocationConnections.add(connection);\n }\n\n public addConnection(connection: WonderlandTrailConnection, addReverseConnection?: boolean): this;\n public addConnection(startLocation: WonderlandTrailLocation, endLocation: WonderlandTrailLocation, distanceMiles: number, ascentFeet: number, descentFeet: number, direction?: WonderlandTrailDirection, intermediateLocations?: Iterable<WonderlandTrailLocation>, addReverseConnection?: boolean): this\n public addConnection(properties: { startLocation: WonderlandTrailLocation, endLocation: WonderlandTrailLocation, distanceMiles: number, ascentFeet: number, descentFeet: number, direction?: WonderlandTrailDirection, intermediateLocations?: Iterable<WonderlandTrailLocation>, addReverseConnection?: boolean }): this\n addConnection(connectionStartLocationOrProperties: WonderlandTrailLocation | { startLocation: WonderlandTrailLocation, endLocation: WonderlandTrailLocation, distanceMiles: number, ascentFeet: number, descentFeet: number, direction?: WonderlandTrailDirection, intermediateLocations?: Iterable<WonderlandTrailLocation>, addReverseConnection?: boolean }, addReverseConnectionOrEndLocation?: boolean | WonderlandTrailLocation, distanceMiles?: number, ascentFeet?: number, descentFeet?: number, direction?: WonderlandTrailDirection, intermediateLocations?: Iterable<WonderlandTrailLocation>, addReverseConnection?: boolean): this\n {\n let startLocation: WonderlandTrailLocation;\n let endLocation: WonderlandTrailLocation;\n if (isWonderlandTrailLocation(connectionStartLocationOrProperties))\n {\n startLocation = connectionStartLocationOrProperties;\n }\n else if (connectionStartLocationOrProperties instanceof WonderlandTrailConnection)\n {\n startLocation = connectionStartLocationOrProperties.startLocation;\n endLocation = connectionStartLocationOrProperties.endLocation;\n distanceMiles = connectionStartLocationOrProperties.distanceMiles;\n ascentFeet = connectionStartLocationOrProperties.ascentFeet;\n descentFeet = connectionStartLocationOrProperties.descentFeet;\n direction = connectionStartLocationOrProperties.direction;\n intermediateLocations = connectionStartLocationOrProperties.intermediateLocations;\n addReverseConnection = !!addReverseConnectionOrEndLocation;\n }\n else\n {\n startLocation = connectionStartLocationOrProperties.startLocation;\n endLocation = connectionStartLocationOrProperties.endLocation;\n distanceMiles = connectionStartLocationOrProperties.distanceMiles;\n ascentFeet = connectionStartLocationOrProperties.ascentFeet;\n descentFeet = connectionStartLocationOrProperties.descentFeet;\n direction = connectionStartLocationOrProperties.direction;\n intermediateLocations = connectionStartLocationOrProperties.intermediateLocations;\n addReverseConnection = connectionStartLocationOrProperties.addReverseConnection;\n }\n\n const connection: WonderlandTrailConnection = WonderlandTrailConnection.create(\n startLocation,\n endLocation!,\n distanceMiles!,\n ascentFeet!,\n descentFeet!,\n direction ?? WonderlandTrailDirection.clockwise,\n intermediateLocations ?? Iterable.create(),\n );\n\n this.addConnectionInner(connection);\n if (addReverseConnection ?? this.addReverseConnectionDefault)\n {\n this.addConnectionInner(connection.reverseDirection());\n }\n\n return this;\n }\n\n public containsConnection(connection: WonderlandTrailConnection): boolean\n {\n PreCondition.assertNotUndefinedAndNotNull(connection, \"connection\");\n\n const startLocationConnections: Iterable<WonderlandTrailConnection> | undefined = this.connections.get(connection.startLocation).catch(() => undefined).await();\n return startLocationConnections?.contains(connection)?.await() === true;\n }\n\n public reverseDirection(): WonderlandTrailConnections\n {\n const result: WonderlandTrailConnections = WonderlandTrailConnections.create(this.addReverseConnectionDefault);\n for (const connection of this.iterateConnections())\n {\n result.addConnection(connection.reverseDirection());\n }\n return result;\n }\n\n public expandConnections(startLocation?: WonderlandTrailLocation, endLocation?: WonderlandTrailLocation, direction?: WonderlandTrailDirection): WonderlandTrailConnections\n {\n if (isUndefinedOrNull(direction))\n {\n direction = WonderlandTrailDirection.clockwise;\n }\n\n const result: WonderlandTrailConnections = WonderlandTrailConnections.create(this.addReverseConnectionDefault);\n\n const toVisit: ListStack<WonderlandTrailConnection> = Stack.create();\n toVisit.addAll(this.iterateConnections(startLocation, undefined, direction));\n\n while (toVisit.any().await())\n {\n const currentConnection: WonderlandTrailConnection = toVisit.remove().await();\n result.addConnection(currentConnection, false);\n\n if (!currentConnection.isLoop() && currentConnection.endLocation !== endLocation)\n {\n for (const endLocationConnection of this.iterateConnections(currentConnection.endLocation, undefined, direction))\n {\n if (!result.containsConnection(endLocationConnection) &&\n !toVisit.contains(endLocationConnection))\n {\n toVisit.add(endLocationConnection);\n }\n\n if (!currentConnection.intermediateLocations.contains(endLocationConnection.endLocation))\n {\n toVisit.add(currentConnection.join(endLocationConnection));\n }\n }\n }\n }\n\n return result;\n }\n}\n\nexport class WonderlandTrailItinerary\n{\n public readonly startDay: DateTime;\n private readonly connections: List<WonderlandTrailConnection>;\n private readonly availabilityTypes: List<WonderlandTrailAvailabilityType>;\n\n private constructor(startDay: DateTime)\n {\n PreCondition.assertNotUndefinedAndNotNull(startDay, \"startDay\");\n\n this.startDay = startDay;\n this.connections = List.create();\n this.availabilityTypes = List.create();\n }\n\n public static create(startDay: DateTime): WonderlandTrailItinerary\n {\n return new WonderlandTrailItinerary(startDay);\n }\n\n public clone(): WonderlandTrailItinerary\n {\n return WonderlandTrailItinerary.create(this.startDay)\n .addConnections(this.connections)\n .addAvailabilityTypes(this.availabilityTypes);\n }\n\n public getConnections(): Iterable<WonderlandTrailConnection>\n {\n return this.connections;\n }\n\n public getEndDay(): DateTime\n {\n return this.startDay.addDays(this.getDayCount() - 1);\n }\n\n public getDayCount(): number\n {\n return this.connections.getCount().await();\n }\n\n public getStartLocation(): SyncResult<WonderlandTrailLocation>\n {\n return this.connections.first().then(firstConnection => firstConnection.startLocation);\n }\n\n public getIntermediateLocations(): Iterable<WonderlandTrailLocation>\n {\n const result: List<WonderlandTrailLocation> = List.create();\n for (const connection of this.connections)\n {\n if (result.any().await())\n {\n result.add(connection.startLocation);\n }\n result.addAll(connection.intermediateLocations);\n }\n return result;\n }\n\n public getEndLocation(): SyncResult<WonderlandTrailLocation>\n {\n return this.connections.last().then(lastConnection => lastConnection.endLocation);\n }\n\n public getPath(): Iterable<WonderlandTrailLocation>\n {\n const result: List<WonderlandTrailLocation> = List.create();\n for (const connection of this.connections)\n {\n if (!result.any().await())\n {\n result.add(connection.startLocation);\n }\n result.add(connection.endLocation);\n }\n return result;\n }\n\n public getPathStrings(includeAvailabilityTypes?: boolean): Iterable<string>\n {\n includeAvailabilityTypes = includeAvailabilityTypes ?? true;\n\n const result: List<string> = List.create();\n let availabilityTypeIndex: number = 0;\n const availabilityTypeCount: number = this.availabilityTypes.getCount().await();\n\n for (const connection of this.connections)\n {\n if (!result.any().await())\n {\n result.add(connection.startLocation.name);\n }\n\n let pathString: string = connection.endLocation.name;\n if (includeAvailabilityTypes && availabilityTypeIndex < availabilityTypeCount)\n {\n pathString += \" \";\n\n const availabilityType: WonderlandTrailAvailabilityType = this.availabilityTypes.get(availabilityTypeIndex).await();\n availabilityTypeIndex++;\n\n if (availabilityType.individualSite !== undefined)\n {\n if (availabilityType.groupSite !== undefined)\n {\n pathString += `(Individual ${availabilityType.individualSite}/Group ${availabilityType.groupSite})`;\n }\n else\n {\n pathString += `(Individual ${availabilityType.individualSite})`;\n }\n }\n else\n {\n pathString += `(Group ${availabilityType.groupSite})`;\n }\n }\n\n result.add(pathString);\n }\n\n return result;\n }\n\n public contains(parameters: {\n location: WonderlandTrailLocation,\n checkItineraryStartLocation?: boolean,\n checkItineraryIntermediateLocations?: boolean,\n checkItineraryEndLocation?: boolean,\n }): boolean\n {\n PreCondition.assertNotUndefinedAndNotNull(parameters, \"parameters\");\n\n const location: WonderlandTrailLocation = parameters.location;\n const checkItineraryStartLocation: boolean = parameters.checkItineraryStartLocation ?? true;\n const checkItineraryIntermediateLocations: boolean = parameters.checkItineraryIntermediateLocations ?? true;\n const checkItineraryEndLocation: boolean = parameters.checkItineraryEndLocation ?? true;\n\n PreCondition.assertNotUndefinedAndNotNull(location, \"location\");\n\n let result: boolean = false;\n\n const connectionCount: number = this.connections.getCount().await();\n for (let i = 0; i < connectionCount; i++)\n {\n if (i !== 0 || checkItineraryStartLocation)\n {\n result = (this.connections.get(i).await().startLocation === location);\n if (result)\n {\n break;\n }\n }\n\n if (checkItineraryIntermediateLocations)\n {\n result = this.connections.get(i).await().intermediateLocations.contains(location).await();\n if (result)\n {\n break;\n }\n }\n\n if (i === connectionCount - 1 && checkItineraryEndLocation)\n {\n result = (this.connections.get(i).await().endLocation === location);\n if (result)\n {\n break;\n }\n }\n }\n\n return result;\n }\n\n public containsAny(parameters: {\n connection: WonderlandTrailConnection,\n checkConnectionStartLocation?: boolean,\n checkConnectionIntermediateLocations?: boolean,\n checkConnectionEndLocation?: boolean,\n checkItineraryStartLocation?: boolean,\n checkItineraryIntermediateLocations?: boolean,\n checkItineraryEndLocation?: boolean,\n }): boolean\n {\n PreCondition.assertNotUndefinedAndNotNull(parameters, \"parameters\");\n\n const connection: WonderlandTrailConnection = parameters.connection;\n const checkConnectionStartLocation: boolean = parameters.checkConnectionStartLocation ?? true;\n const checkConnectionIntermediateLocations: boolean = parameters.checkConnectionIntermediateLocations ?? true;\n const checkConnectionEndLocation: boolean = parameters.checkConnectionEndLocation ?? true;\n const checkItineraryStartLocation: boolean = parameters.checkItineraryStartLocation ?? true;\n const checkItineraryIntermediateLocations: boolean = parameters.checkItineraryIntermediateLocations ?? true;\n const checkItineraryEndLocation: boolean = parameters.checkItineraryEndLocation ?? true;\n\n PreCondition.assertNotUndefinedAndNotNull(connection, \"connection\");\n\n let result: boolean = false;\n\n if (!result && checkConnectionStartLocation)\n {\n result = this.contains({\n location: connection.startLocation,\n checkItineraryStartLocation,\n checkItineraryIntermediateLocations,\n checkItineraryEndLocation,\n });\n }\n\n if (!result && checkConnectionIntermediateLocations)\n {\n for (const connectionIntermediateLocation of connection.intermediateLocations)\n {\n result = this.contains({\n location: connectionIntermediateLocation,\n checkItineraryStartLocation,\n checkItineraryIntermediateLocations,\n checkItineraryEndLocation,\n });\n if (result)\n {\n break;\n }\n }\n }\n\n if (!result && checkConnectionEndLocation)\n {\n result = this.contains({\n location: connection.endLocation,\n checkItineraryStartLocation,\n checkItineraryIntermediateLocations,\n checkItineraryEndLocation,\n });\n }\n\n return result;\n }\n\n public addConnection(connection: WonderlandTrailConnection): this\n {\n PreCondition.assertNotUndefinedAndNotNull(connection, \"connection\");\n\n this.connections.add(connection);\n\n return this;\n }\n\n public addConnections(connections: JavascriptIterable<WonderlandTrailConnection>): this\n {\n PreCondition.assertNotUndefinedAndNotNull(connections, \"connections\");\n\n this.connections.addAll(connections);\n\n return this;\n }\n\n public addAvailabilityType(availabilityType: WonderlandTrailAvailabilityType): this\n {\n PreCondition.assertNotUndefinedAndNotNull(availabilityType, \"availabilityType\");\n\n this.availabilityTypes.add(availabilityType);\n\n return this;\n }\n\n public addAvailabilityTypes(availabilityTypes: JavascriptIterable<WonderlandTrailAvailabilityType>): this\n {\n PreCondition.assertNotUndefinedAndNotNull(availabilityTypes, \"availabilityTypes\");\n\n this.availabilityTypes.addAll(availabilityTypes);\n\n return this;\n }\n\n public toString(includeAvailabilityTypes?: boolean): string\n {\n includeAvailabilityTypes = includeAvailabilityTypes ?? true;\n return `startDay:${this.startDay.toDateString()},path:${this.getPathStrings(includeAvailabilityTypes)}`;\n }\n}\n\nexport class WonderlandTrailClient implements HttpClient\n{\n public static readonly permitItineraryId: string = \"4675317\";\n\n private readonly httpClient: HttpClient;\n private readonly recreationDotGovClient: RecreationDotGovClient;\n\n private constructor(httpClient: HttpClient)\n {\n PreCondition.assertNotUndefinedAndNotNull(httpClient, \"httpClient\");\n\n this.httpClient = httpClient;\n this.recreationDotGovClient = RecreationDotGovClient.create(httpClient);\n }\n\n public static create(httpClient: HttpClient): WonderlandTrailClient\n {\n return new WonderlandTrailClient(httpClient);\n }\n\n public sendRequest(request: HttpOutgoingRequest): AsyncResult<HttpIncomingResponse>\n {\n return this.httpClient.sendRequest(request);\n }\n\n public sendGetRequest(url: string): AsyncResult<HttpIncomingResponse>\n {\n return HttpClient.sendGetRequest(this, url);\n }\n\n public getAvailability(month: number, year: number, allowWalkupPermits: boolean, allowIndividualSites: boolean, allowGroupSites: boolean, earlyAccessPermitLotteryId?: string): PromiseAsyncResult<WonderlandTrailAvailability>;\n public getAvailability(options: { month: number, year: number, allowWalkupPermits: boolean, allowIndividualSites: boolean, allowGroupSites: boolean, earlyAccessPermitLotteryId?: string }): PromiseAsyncResult<WonderlandTrailAvailability>;\n getAvailability(monthOrOptions: number | { month: number, year: number, allowWalkupPermits: boolean, allowIndividualSites: boolean, allowGroupSites: boolean, earlyAccessPermitLotteryId?: string }, year?: number, allowWalkupPermits?: boolean, allowIndividualSites?: boolean, allowGroupSites?: boolean, earlyAccessPermitLotteryId?: string): PromiseAsyncResult<WonderlandTrailAvailability>\n {\n let month: number;\n if (isNumber(monthOrOptions))\n {\n month = monthOrOptions;\n year = year!;\n allowWalkupPermits = allowWalkupPermits!;\n allowIndividualSites = allowIndividualSites!;\n allowGroupSites = allowGroupSites!;\n }\n else\n {\n month = monthOrOptions.month;\n year = monthOrOptions.year;\n allowWalkupPermits = monthOrOptions.allowWalkupPermits;\n allowIndividualSites = monthOrOptions.allowIndividualSites;\n allowGroupSites = monthOrOptions.allowGroupSites;\n earlyAccessPermitLotteryId = monthOrOptions.earlyAccessPermitLotteryId;\n }\n return PromiseAsyncResult.create(async () =>\n {\n const result = WonderlandTrailAvailability.create();\n\n for (const location of WonderlandTrailLocations.getLocations())\n {\n if (allowIndividualSites && location.divisionId)\n {\n const divisionAvailability: RecreationDotGovDivisionAvailability = await this.recreationDotGovClient.getDivisionAvailability(\n WonderlandTrailClient.permitItineraryId,\n location.divisionId,\n month,\n year,\n earlyAccessPermitLotteryId,\n );\n const divisionDayAvailabilities: Iterable<RecreationDotGovDivisionDayAvailability> = divisionAvailability.dayAvailabilities;\n if (divisionDayAvailabilities)\n {\n for (const divisionDayAvailability of divisionDayAvailabilities)\n {\n const hasWalkupPermits: boolean = (allowWalkupPermits && divisionDayAvailability.walkup);\n const hasReservationPermits: boolean = (divisionDayAvailability.reservationsRemaining > 0);\n if (hasWalkupPermits || hasReservationPermits)\n {\n result.addAvailability(\n location,\n divisionDayAvailability.date,\n hasWalkupPermits ? WonderlandTrailReservationType.Walkup : WonderlandTrailReservationType.Reserved,\n undefined,\n );\n }\n }\n }\n }\n\n if (allowGroupSites && location.groupSiteDivisionId)\n {\n const groupSiteDivisionAvailability: RecreationDotGovDivisionAvailability = await this.recreationDotGovClient.getDivisionAvailability(\n WonderlandTrailClient.permitItineraryId,\n location.groupSiteDivisionId,\n month,\n year,\n earlyAccessPermitLotteryId,\n );\n const groupSiteDivisionDayAvailabilities: Iterable<RecreationDotGovDivisionDayAvailability> = groupSiteDivisionAvailability.dayAvailabilities;\n if (groupSiteDivisionDayAvailabilities)\n {\n for (const groupSiteDayAvailability of groupSiteDivisionDayAvailabilities)\n {\n const hasWalkupPermits: boolean = (allowWalkupPermits && groupSiteDayAvailability.walkup);\n const hasReservationPermits: boolean = (groupSiteDayAvailability.reservationsRemaining > 0);\n if (hasWalkupPermits || hasReservationPermits)\n {\n result.addAvailability(\n location,\n groupSiteDayAvailability.date,\n undefined,\n hasWalkupPermits ? WonderlandTrailReservationType.Walkup : WonderlandTrailReservationType.Reserved,\n );\n }\n }\n }\n }\n }\n\n return result;\n });\n }\n\n public findItineraries(parameters: {\n availability: WonderlandTrailAvailability,\n startDate: DateTime,\n startLocation: WonderlandTrailLocation,\n endLocation: WonderlandTrailLocation,\n direction: WonderlandTrailDirection,\n maximumDayDistanceMiles?: number,\n maximumItineraryDays?: number,\n campsitesToAvoid?: JavascriptIterable<WonderlandTrailLocation>,\n }): Iterable<WonderlandTrailItinerary>\n {\n PreCondition.assertNotUndefinedAndNotNull(parameters, \"parameters\");\n\n const availability: WonderlandTrailAvailability = parameters.availability;\n const startDate: DateTime = parameters.startDate;\n const startLocation: WonderlandTrailLocation = parameters.startLocation;\n const endLocation: WonderlandTrailLocation = parameters.endLocation;\n const direction: WonderlandTrailDirection = parameters.direction;\n const maximumDayDistanceMiles: number | undefined = parameters.maximumDayDistanceMiles;\n const maximumItineraryDays: number | undefined = parameters.maximumItineraryDays;\n const campsitesToAvoid: Iterable<WonderlandTrailLocation> = Iterable.create(parameters.campsitesToAvoid ?? []);\n\n const result: List<WonderlandTrailItinerary> = List.create();\n\n const connections: WonderlandTrailConnections = WonderlandTrailConnections.createDefault()\n .expandConnections(startLocation, endLocation, direction);\n\n let startLocationConnections: Iterator<WonderlandTrailConnection> = connections.iterateConnections(startLocation, undefined, direction);\n if (!isUndefinedOrNull(maximumDayDistanceMiles))\n {\n startLocationConnections = startLocationConnections.where(connection => connection.distanceMiles <= maximumDayDistanceMiles);\n }\n\n const possibleItineraries: ListStack<WonderlandTrailItinerary> = Stack.create();\n possibleItineraries.addAll(startLocationConnections.map(c => WonderlandTrailItinerary.create(startDate).addConnection(c)));\n\n while (possibleItineraries.any().await())\n {\n const currentItinerary: WonderlandTrailItinerary = possibleItineraries.remove().await();\n const currentItineraryEndLocation: WonderlandTrailLocation = currentItinerary.getEndLocation().await();\n\n if ((maximumItineraryDays === undefined || currentItinerary.getDayCount() <= maximumItineraryDays) &&\n (startLocation === currentItineraryEndLocation || endLocation === currentItineraryEndLocation || !campsitesToAvoid.contains(currentItineraryEndLocation).await()))\n {\n if (currentItineraryEndLocation === endLocation)\n {\n result.add(currentItinerary);\n }\n else\n {\n const dayAvailability: WonderlandTrailAvailabilityType | undefined = availability.getDayAvailability(currentItineraryEndLocation, currentItinerary.getEndDay())\n .catch(() => undefined)\n .await();\n if (dayAvailability)\n {\n currentItinerary.addAvailabilityType(dayAvailability);\n\n for (const nextDayConnection of connections.iterateConnections(currentItineraryEndLocation, undefined, direction))\n {\n if (!currentItinerary.containsAny({\n connection: nextDayConnection,\n checkConnectionStartLocation: false,\n checkItineraryStartLocation: false,\n checkItineraryEndLocation: false,\n }))\n {\n if (maximumDayDistanceMiles === undefined || nextDayConnection.distanceMiles <= maximumDayDistanceMiles)\n {\n possibleItineraries.add(currentItinerary.clone().addConnection(nextDayConnection));\n }\n }\n }\n }\n }\n }\n }\n\n return result;\n }\n\n public findItinerariesAsync(parameters: {\n startDay: DateTime,\n startLocation?: WonderlandTrailLocation,\n endLocation?: WonderlandTrailLocation,\n direction?: WonderlandTrailDirection,\n maximumDayDistanceMiles?: number,\n maximumItineraryDays?: number,\n allowWalkupPermits?: boolean,\n allowIndividualSites?: boolean,\n allowGroupSites?: boolean,\n campsitesToAvoid?: JavascriptIterable<WonderlandTrailLocation>,\n }): PromiseAsyncResult<Iterable<WonderlandTrailItinerary>>\n {\n PreCondition.assertNotUndefinedAndNotNull(parameters, \"parameters\");\n\n const startDay: DateTime = parameters.startDay;\n const startLocation: WonderlandTrailLocation | undefined = parameters.startLocation;\n const endLocation: WonderlandTrailLocation | undefined = parameters.endLocation;\n const direction: WonderlandTrailDirection | undefined = parameters.direction;\n const maximumDayDistanceMiles: number | undefined = parameters.maximumDayDistanceMiles;\n const maximumItineraryDays: number | undefined = parameters.maximumItineraryDays;\n const allowWalkupPermits: boolean = parameters.allowWalkupPermits ?? true;\n const allowIndividualSites: boolean = parameters.allowIndividualSites ?? true;\n const allowGroupSites: boolean = parameters.allowGroupSites ?? false;\n const campsitesToAvoid: JavascriptIterable<WonderlandTrailLocation> = parameters.campsitesToAvoid ?? [];\n\n PreCondition.assertNotUndefinedAndNotNull(startDay, \"startDay\");\n\n return PromiseAsyncResult.create(async () =>\n {\n const result: List<WonderlandTrailItinerary> = List.create();\n\n const startLocationsToCheck: Iterable<WonderlandTrailLocation> =\n (!isUndefinedOrNull(startLocation) ? Iterable.create([startLocation]) : WonderlandTrailLocations.getTrailheads());\n const directionsToCheck: Iterable<WonderlandTrailDirection> =\n (!isUndefinedOrNull(direction) ? Iterable.create([direction]) : Iterable.create([WonderlandTrailDirection.clockwise, WonderlandTrailDirection.counterClockwise]));\n\n const availability: WonderlandTrailAvailability = await this.getAvailability(\n startDay.getMonth(),\n startDay.getYear(),\n allowWalkupPermits,\n allowIndividualSites,\n allowGroupSites,\n );\n\n for (const startLocationToCheck of startLocationsToCheck)\n {\n for (const directionToCheck of directionsToCheck)\n {\n result.addAll(this.findItineraries({\n availability,\n startDate: startDay,\n startLocation: startLocationToCheck,\n endLocation: endLocation ?? startLocationToCheck,\n direction: directionToCheck,\n maximumDayDistanceMiles,\n maximumItineraryDays,\n campsitesToAvoid,\n }))\n }\n }\n\n return result;\n });\n }\n}"],"mappings":"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","names":["DateTime","Map","Set","Comparison","quote","Map","Map","Set","Set","list","Map","insertIndex","HttpMethod","DateTime","DateTime","list","Set","list","Set","DateTime","responseBodyJson","WonderlandTrailReservationType","Map","list"]}