<span class="hljs-comment">/*
borrowed from https://github.com/paladin-t/b95/blob/master/b95.wren
*/</span>
<span class="hljs-keyword">class</span> <span class="hljs-title class_">Stack</span> <span class="hljs-keyword">is</span> <span class="hljs-title class_ inherited__">Sequence</span> {
<span class="hljs-keyword">construct</span> <span class="hljs-title function_">new</span>() {
<span class="hljs-variable">_list</span> <span class="hljs-operator">=</span> [ ]
}
<span class="hljs-title function_">count</span> {
<span class="hljs-keyword">return</span> <span class="hljs-variable">_list</span>.<span class="hljs-property">count</span>
}
<span class="hljs-title function_">isEmpty</span> {
<span class="hljs-keyword">return</span> <span class="hljs-variable">_list</span>.<span class="hljs-property">isEmpty</span>
}
<span class="hljs-title function_">clear</span>() {
<span class="hljs-variable">_list</span>.<span class="hljs-property">clear</span>()
}
<span class="hljs-title function_">peek</span> {
<span class="hljs-keyword">if</span> (<span class="hljs-variable">_list</span>.<span class="hljs-property">isEmpty</span>) {
<span class="hljs-title class_">Fiber</span>.<span class="hljs-property">abort</span>(<span class="hljs-string">"Peeking from empty stack."</span>)
}
<span class="hljs-keyword">return</span> <span class="hljs-variable">_list</span>[<span class="hljs-variable">_list</span>.<span class="hljs-property">count</span> <span class="hljs-operator">-</span> <span class="hljs-number">1</span>]
}
<span class="hljs-title function_">pop</span>() {
<span class="hljs-keyword">if</span> (<span class="hljs-variable">_list</span>.<span class="hljs-property">isEmpty</span>) {
<span class="hljs-title class_">Fiber</span>.<span class="hljs-property">abort</span>(<span class="hljs-string">"Popping from empty stack."</span>)
}
<span class="hljs-keyword">var</span> <span class="hljs-variable">ret</span> <span class="hljs-operator">=</span> <span class="hljs-variable">_list</span>[<span class="hljs-variable">_list</span>.<span class="hljs-property">count</span> <span class="hljs-operator">-</span> <span class="hljs-number">1</span>]
<span class="hljs-variable">_list</span>.<span class="hljs-property">removeAt</span>(<span class="hljs-variable">_list</span>.<span class="hljs-property">count</span> <span class="hljs-operator">-</span> <span class="hljs-number">1</span>)
<span class="hljs-keyword">return</span> <span class="hljs-variable">ret</span>
}
<span class="hljs-title function_">push</span>(<span class="hljs-params">val</span>) {
<span class="hljs-variable">_list</span>.<span class="hljs-property">add</span>(<span class="hljs-variable">val</span>)
<span class="hljs-keyword">return</span> <span class="hljs-variable language_">this</span>
}
<span class="hljs-comment">// Iterates top-down, but doesn't pop anything.</span>
<span class="hljs-title function_">iterate</span>(<span class="hljs-params">iterator</span>) {
<span class="hljs-keyword">if</span> (<span class="hljs-variable">iterator</span> <span class="hljs-operator">==</span> <span class="hljs-literal">null</span>) {
<span class="hljs-variable">iterator</span> <span class="hljs-operator">=</span> <span class="hljs-variable">_list</span>.<span class="hljs-property">count</span>
}
<span class="hljs-variable">iterator</span> <span class="hljs-operator">=</span> <span class="hljs-variable">iterator</span> <span class="hljs-operator">-</span> <span class="hljs-number">1</span>
<span class="hljs-keyword">if</span> (<span class="hljs-variable">iterator</span> <span class="hljs-operator"><</span> <span class="hljs-number">0</span>) {
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>
}
<span class="hljs-keyword">return</span> <span class="hljs-variable">iterator</span>
}
<span class="hljs-title function_">iteratorValue</span>(<span class="hljs-params">iterator</span>) {
<span class="hljs-keyword">return</span> <span class="hljs-variable">_list</span>[<span class="hljs-variable">iterator</span>]
}
}
<span class="hljs-keyword">var</span> <span class="hljs-variable">add</span> <span class="hljs-operator">=</span> <span class="hljs-title class_">Fn</span>.<span class="hljs-property">new</span> { <span class="hljs-operator">|</span><span class="hljs-variable">a</span>,<span class="hljs-variable">b</span><span class="hljs-operator">|</span> <span class="hljs-variable">a</span> <span class="hljs-operator">+</span> <span class="hljs-variable">b</span> }
<span class="hljs-keyword">var</span> <span class="hljs-variable">mul</span> <span class="hljs-operator">=</span> <span class="hljs-title class_">Fn</span>.<span class="hljs-property">new</span> { <span class="hljs-operator">|</span><span class="hljs-variable">a</span>,<span class="hljs-variable">b</span><span class="hljs-operator">|</span> <span class="hljs-variable">a</span> <span class="hljs-operator">*</span> <span class="hljs-variable">b</span> }