@@ -442,10 +442,17 @@ object ZQuery {
442
442
def foreach [R , E , A , B , Collection [+ Element ] <: Iterable [Element ]](
443
443
as : Collection [A ]
444
444
)(f : A => ZQuery [R , E , B ])(implicit bf : BuildFrom [Collection [A ], B , Collection [B ]]): ZQuery [R , E , Collection [B ]] =
445
- as.foldLeft[ZQuery [R , E , Builder [B , Collection [B ]]]](ZQuery .succeed(bf.newBuilder(as)))((bs, a) =>
446
- bs.zipWith(f(a))(_ += _)
447
- )
448
- .map(_.result())
445
+ if (as.isEmpty) ZQuery .succeed(bf.newBuilder(as).result)
446
+ else {
447
+ val iterator = as.iterator
448
+ var builder : ZQuery [R , E , Builder [B , Collection [B ]]] = null
449
+ while (iterator.hasNext) {
450
+ val a = iterator.next()
451
+ if (builder eq null ) builder = f(a).map(bf.newBuilder(as) += _)
452
+ else builder = builder.zipWith(f(a))(_ += _)
453
+ }
454
+ builder.map(_.result())
455
+ }
449
456
450
457
/**
451
458
* Performs a query for each element in a collection, collecting the results
@@ -455,10 +462,17 @@ object ZQuery {
455
462
def foreachPar [R , E , A , B , Collection [+ Element ] <: Iterable [Element ]](
456
463
as : Collection [A ]
457
464
)(f : A => ZQuery [R , E , B ])(implicit bf : BuildFrom [Collection [A ], B , Collection [B ]]): ZQuery [R , E , Collection [B ]] =
458
- as.foldLeft[ZQuery [R , E , Builder [B , Collection [B ]]]](ZQuery .succeed(bf.newBuilder(as)))((bs, a) =>
459
- bs.zipWithPar(f(a))(_ += _)
460
- )
461
- .map(_.result())
465
+ if (as.isEmpty) ZQuery .succeed(bf.newBuilder(as).result)
466
+ else {
467
+ val iterator = as.iterator
468
+ var builder : ZQuery [R , E , Builder [B , Collection [B ]]] = null
469
+ while (iterator.hasNext) {
470
+ val a = iterator.next()
471
+ if (builder eq null ) builder = f(a).map(bf.newBuilder(as) += _)
472
+ else builder = builder.zipWithPar(f(a))(_ += _)
473
+ }
474
+ builder.map(_.result())
475
+ }
462
476
463
477
/**
464
478
* Constructs a query from an effect.
0 commit comments