Skip to content

Commit 836ef31

Browse files
Merge pull request #142 from Workiva/queue_take_until
Fix index in take until.
2 parents 9399ee1 + 6d93be5 commit 836ef31

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

queue/queue.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,17 +115,18 @@ func (items *items) getUntil(checker func(item interface{}) bool) []interface{}
115115
}
116116

117117
returnItems := make([]interface{}, 0, length)
118-
index := 0
118+
index := -1
119119
for i, item := range *items {
120120
if !checker(item) {
121121
break
122122
}
123123

124124
returnItems = append(returnItems, item)
125125
index = i
126+
(*items)[i] = nil // prevent memory leak
126127
}
127128

128-
*items = (*items)[index:]
129+
*items = (*items)[index+1:]
129130
return returnItems
130131
}
131132

queue/queue_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,30 @@ func TestTakeUntilEmptyQueue(t *testing.T) {
384384
assert.Equal(t, expected, result)
385385
}
386386

387+
func TestTakeUntilThenGet(t *testing.T) {
388+
q := New(10)
389+
q.Put(`a`, `b`, `c`)
390+
takeItems, _ := q.TakeUntil(func(item interface{}) bool {
391+
return item != `c`
392+
})
393+
394+
restItems, _ := q.Get(3)
395+
assert.Equal(t, []interface{}{`a`, `b`}, takeItems)
396+
assert.Equal(t, []interface{}{`c`}, restItems)
397+
}
398+
399+
func TestTakeUntilNoMatches(t *testing.T) {
400+
q := New(10)
401+
q.Put(`a`, `b`, `c`)
402+
takeItems, _ := q.TakeUntil(func(item interface{}) bool {
403+
return item != `a`
404+
})
405+
406+
restItems, _ := q.Get(3)
407+
assert.Equal(t, []interface{}{}, takeItems)
408+
assert.Equal(t, []interface{}{`a`, `b`, `c`}, restItems)
409+
}
410+
387411
func TestTakeUntilOnDisposedQueue(t *testing.T) {
388412
q := New(10)
389413
q.Dispose()

0 commit comments

Comments
 (0)