{ : empty : new : is_empty : push : pop : pop_all : append : concat } Where Define (concat queues) (LIST.reduce queues empty append) Where Define (pop_all queue) Unfold queue Match (pop queue) | 'nothing 'nil | 'just.{item queue} [item & (Fold 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) Unfold queue Match queue.outgoing | 'cons.{item outgoing} Let queue { : incoming queue.incoming : outgoing } In 'just.{item queue} | 'nil Match queue.incoming | 'nil 'nothing | _ (Fold (new (LIST.reverse queue.incoming))) ; ; 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"