From 99be920904634b47d57fc1aeb8e703a29000cd01 Mon Sep 17 00:00:00 2001 From: Yanhu007 Date: Wed, 15 Apr 2026 16:08:16 +0800 Subject: [PATCH] fix: collect results after last error in ResultErrorPool The collect method in resultAggregator skipped all results that came after the last errored task. The filtering loop only appended segments between errored indices but never appended the tail segment after the last error. For example, with tasks [ok, err, ok], only the first ok was returned instead of both ok results. Add the tail segment after the loop. Add regression test. Fixes #156 --- pool/result_error_pool_test.go | 12 ++++++++++++ pool/result_pool.go | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/pool/result_error_pool_test.go b/pool/result_error_pool_test.go index 7326639..b95d200 100644 --- a/pool/result_error_pool_test.go +++ b/pool/result_error_pool_test.go @@ -147,3 +147,15 @@ func TestResultErrorPool(t *testing.T) { require.NotErrorIs(t, errs2, err1) }) } + +func TestResultErrorPoolResultsAfterError(t *testing.T) { + t.Parallel() + p := pool.NewWithResults[int]().WithErrors().WithMaxGoroutines(1) + p.Go(func() (int, error) { return 1, nil }) + p.Go(func() (int, error) { return 2, errors.New("an error") }) + p.Go(func() (int, error) { return 3, nil }) + + got, err := p.Wait() + require.Error(t, err) + require.Equal(t, []int{1, 3}, got) +} diff --git a/pool/result_pool.go b/pool/result_pool.go index f73a772..238b345 100644 --- a/pool/result_pool.go +++ b/pool/result_pool.go @@ -138,5 +138,10 @@ func (r *resultAggregator[T]) collect(collectErrored bool) []T { filtered = append(filtered, r.results[r.errored[i-1]+1:e]...) } } + // Append any results after the last errored index. + lastErrored := r.errored[len(r.errored)-1] + if lastErrored+1 < len(r.results) { + filtered = append(filtered, r.results[lastErrored+1:]...) + } return filtered }