{
: empty
: new
: is_empty
: push
: pop
: pop_all
: append
: concat
}
Where
Define (concat queues)
(LIST.reduce queues empty append)
Where
Define (pop_all queue)
Define (rec rec queue)
Match (pop queue)
| 'nothing 'nil
| 'just.{item queue} [item & (rec rec queue)]
;
In
(rec rec queue)
Define (push_all queue items)
(LIST.reduce items queue push)
Define (append a b)
Iterate {a b} From {a b}
Match (pop b)
| 'nothing a
| 'just.{item b} Continue {(push a item) b}
;
Where
Define (push queue item)
{
: incoming [item & queue.incoming]
: outgoing queue.outgoing
}
Define (pop queue)
Define (rec rec queue)
Match queue.outgoing
| 'cons.{item outgoing}
Let queue
{
: incoming queue.incoming
: outgoing
}
In
'just.{item queue}
| 'nil
Match queue.incoming
| 'nil 'nothing
| _ (rec rec (new (LIST.reverse queue.incoming)))
;
;
In
(rec rec queue)
Where
Define (new init)
{
: incoming 'nil
: outgoing init
}
Let empty
{
: incoming 'nil
: outgoing 'nil
}
Define (is_empty queue)
Match queue.incoming
| 'nil Match queue.outgoing | 'nil True | 'cons._ False ;
| 'cons._ False
;
Where
Let LIST Package "list"