1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
PriorityQueue {
var array;
put { arg time, item;
_PriorityQueueAdd
^this.primitiveFailed;
}
pop {
_PriorityQueuePop
^this.primitiveFailed;
}
topPriority {
_PriorityQueueTop
^this.primitiveFailed;
}
clear {
_PriorityQueueClear
^this.primitiveFailed;
}
postpone { arg time;
_PriorityQueuePostpone
^this.primitiveFailed;
}
isEmpty {
_PriorityQueueEmpty
^this.primitiveFailed;
}
notEmpty { ^this.isEmpty.not }
removeValue {|value|
var newObject = PriorityQueue(), currentPriority, topObject;
while {this.notEmpty} {
currentPriority = this.topPriority;
topObject = this.pop;
if (topObject != value) {
newObject.put(currentPriority, topObject)
}
};
array = newObject.prInternalArray;
}
do {|func|
if (array.size > 1) {
forBy(1, array.size-1, 3) {|i|
func.value(array[i+1],array[i+0])
}
}
}
// private
prInternalArray {
^array
}
}
|