class Stack is Sequence {
construct new() {
_list = [ ]
}
count {
return _list.count
}
isEmpty {
return _list.isEmpty
}
clear() {
_list.clear()
}
peek {
if (_list.isEmpty) {
Fiber.abort("Peeking from empty stack.")
}
return _list[_list.count - 1]
}
pop() {
if (_list.isEmpty) {
Fiber.abort("Popping from empty stack.")
}
var ret = _list[_list.count - 1]
_list.removeAt(_list.count - 1)
return ret
}
push(val) {
_list.add(val)
return this
}
iterate(iterator) {
if (iterator == null) {
iterator = _list.count
}
iterator = iterator - 1
if (iterator < 0) {
return null
}
return iterator
}
iteratorValue(iterator) {
return _list[iterator]
}
}
var add = Fn.new { |a,b| a + b }
var mul = Fn.new { |a,b| a * b }