1- import { ErrorOption } from "./misc/misc.ts" ;
1+ import { ErrorOption , nullableAsArray } from "./misc/misc.ts" ;
22
33export class ResultError extends Error {
44 override name = "ArrayResultError" ;
@@ -16,48 +16,44 @@ export type Result<T> =
1616export class IterableResult < T > {
1717 #evaluated: Array < Result < T > > = [ ] ;
1818 #iterator: Iterator < Result < T > > ;
19- constructor ( generator : ( ) => Iterator < Result < T > > ) {
19+ constructor (
20+ evaluated : ReadonlyArray < Result < T > > ,
21+ generator : ( ) => Iterator < Result < T > > ,
22+ ) {
23+ this . #evaluated = [ ...evaluated ] ;
2024 this . #iterator = generator ( ) ;
2125 }
2226
2327 static fromArray < T > ( array : ReadonlyArray < T > ) : IterableResult < T > {
24- return new IterableResult ( function * ( ) {
25- for ( const value of array ) {
26- yield { type : "value" , value } ;
27- }
28- } ) ;
28+ return new IterableResult (
29+ array . map ( ( value ) => ( { type : "value" , value } ) ) ,
30+ function * ( ) { } ,
31+ ) ;
2932 }
3033
3134 static fromNullable < T > ( value ?: T ) : IterableResult < NonNullable < T > > {
32- return new IterableResult ( function * ( ) {
33- if ( value != null ) {
34- yield { type : "value" , value } ;
35- }
36- } ) ;
35+ return IterableResult . fromArray ( nullableAsArray ( value ) ) ;
3736 }
3837
3938 static single < T > ( value : T ) : IterableResult < T > {
40- return new IterableResult ( function * ( ) {
41- yield { type : "value" , value } ;
42- } ) ;
39+ return IterableResult . fromArray ( [ value ] ) ;
4340 }
4441
4542 static errors ( errors : ReadonlyArray < ResultError > ) : IterableResult < never > {
46- return new IterableResult ( function * ( ) {
47- for ( const error of errors ) {
48- yield { type : "error" , error } ;
49- }
50- } ) ;
43+ return new IterableResult (
44+ errors . map ( ( error ) => ( { type : "error" , error } ) ) ,
45+ function * ( ) { } ,
46+ ) ;
5147 }
5248
5349 static empty ( ) : IterableResult < never > {
54- return new IterableResult ( function * ( ) { } ) ;
50+ return IterableResult . fromArray ( [ ] ) ;
5551 }
5652
5753 static concat < T > (
5854 ...iterableResults : ReadonlyArray < IterableResult < T > >
5955 ) : IterableResult < T > {
60- return new IterableResult ( function * ( ) {
56+ return new IterableResult ( [ ] , function * ( ) {
6157 const errors : Array < ResultError > = [ ] ;
6258 let yielded = false ;
6359 for ( const iterable of iterableResults ) {
@@ -89,7 +85,7 @@ export class IterableResult<T> {
8985 // we resorted to using `any` types here, make sure it works properly
9086 return iterableResults . reduce (
9187 ( left : IterableResult < any > , right ) =>
92- new IterableResult ( function * ( ) {
88+ new IterableResult ( [ ] , function * ( ) {
9389 let rightAggregate : null | Array < any > = null ;
9490 let yielded = false ;
9591 for ( const leftResult of left ) {
@@ -198,6 +194,7 @@ export class IterableResult<T> {
198194
199195 flatMap < U > ( mapper : ( value : T ) => IterableResult < U > ) : IterableResult < U > {
200196 return new IterableResult (
197+ [ ] ,
201198 function * ( this : IterableResult < T > ) : Generator < Result < U > > {
202199 const errors : Array < ResultError > = [ ] ;
203200 let yielded = false ;
@@ -235,6 +232,7 @@ export class IterableResult<T> {
235232
236233 sort ( comparer : ( left : T , right : T ) => number ) : IterableResult < T > {
237234 return new IterableResult (
235+ [ ] ,
238236 function * ( this : IterableResult < T > ) {
239237 let hasError = false ;
240238 const array : Array < T > = [ ] ;
@@ -273,6 +271,7 @@ export class IterableResult<T> {
273271
274272 addErrorWhenNone ( error : ( ) => ResultError ) : IterableResult < T > {
275273 return new IterableResult (
274+ [ ] ,
276275 function * ( this : IterableResult < T > ) : Generator < Result < T > > {
277276 let yielded = false ;
278277 for ( const result of this ) {
0 commit comments