| 111 | } |
| 112 | |
| 113 | func (q *Queue) RemoveIf(predicate func(v interface{}) bool) (bool, interface{}) { |
| 114 | q.lock.Lock() |
| 115 | defer q.lock.Unlock() |
| 116 | |
| 117 | var found bool |
| 118 | var removed interface{} |
| 119 | newBuf := make([]interface{}, 0, q.capacity) |
| 120 | |
| 121 | for i := 0; i < q.size; i++ { |
| 122 | idx := (q.head + i) % q.capacity |
| 123 | item := q.buffer[idx] |
| 124 | if !found && predicate(item) { |
| 125 | found = true |
| 126 | removed = item |
| 127 | continue |
| 128 | } |
| 129 | newBuf = append(newBuf, item) |
| 130 | } |
| 131 | |
| 132 | if !found { |
| 133 | return false, nil |
| 134 | } |
| 135 | |
| 136 | q.buffer = make([]interface{}, q.capacity) |
| 137 | copy(q.buffer, newBuf) |
| 138 | q.head = 0 |
| 139 | q.tail = len(newBuf) |
| 140 | q.size = len(newBuf) |
| 141 | |
| 142 | return true, removed |
| 143 | } |
| 144 | |
| 145 | func (q *Queue) FindIf(predicate func(v interface{}) bool) (bool, interface{}) { |
| 146 | q.lock.RLock() |