Trails/api/_queue.wren
2022-01-26 20:29:00 +01:00

62 lines
No EOL
1,007 B
Text

#hidden
class Queue is Sequence{
data{_data}
count{_count}
construct new(){
_data = []
_count = 0
_head = -1
}
clear(){
_count = 0
_head = -1
}
enqueue(value){
_count = _count + 1
_head = _head + 1
if(_data.count >= _count){
if(_head >= _data.count){
_head = _head - _data.count
}
_data[_head] = value
} else {
_data.insert(_head, value)
}
return value
}
dequeue(){
if(_count == 0) return null
var res = peek()
_count = _count - 1
return res
}
peek(){
if(_count == 0) return null
var tail = _head - _count + 1
if(tail < 0) tail = _data.count + tail
return _data[tail]
}
empty(){_count == 0}
[index]{
index = _head - _count + 1 + index
if(index < 0) index = _data.count + index
return _data[index]
}
iterate(iter){
if(!iter) return _count > 0 ? 0 : false
if(iter >= _count - 1) return false
return iter + 1
}
iteratorValue(iter){
return this[iter]
}
}