Workiva / go-datastructures

A collection of useful, performant, and threadsafe Go datastructures.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

queue.TakeUntil - does not pop final matching element

mikeatlas opened this issue · comments

This isn't quite the behavior I expected the queue.TakeUntil(...) function to behave. Here's a quick non-test-harness way I wrote a snippit to check my understanding of how this feature works:

    q := queue.New(10)
    q.Put(`a`, `b`, `c`)
    takeItems, _ := q.TakeUntil(func(item interface{}) bool {
        return item != `c`
    })

    restItems, _ := q.Get(3)

    fmt.Sprintf("TakeUntil Test. takeItems: %v, restItems: %v",
        takeItems, restItems)

This prints:
TakeUntil Test. takeItems: [a b], restItems: [b c]

I would have assumed that restItems would be either [c] (mutable call) or [a b c] (immutable call) but the result of [b c] is unexpected because the function both returned [a b] (looks like an immutable return value) but when I see [b c] it looks as if the queue was indeed mutated, but I would have expected in that case for the queue to have been [c]. Am I not understanding something, or is this a bug?

Anyways, the point was that I was hoping TakeUntil could serve as a Peek (a common operation on many queue data structure implementations) but the behavior I'm seeing doesn't indicate that it's usable nor that TakeUntil behaves as I expected from the documentation.

Closing since for now since the maintainers didn't comment on this behavior being correctly defined as expected or not. Will reopen if others see a reason.

@mikeatlas That is unexpected. I would expect get to return [c]. Sorry for the slow response, been very busy lately. I'll take a look when I get a chance.