{Record
    empty
    new
    is_empty
    push
    pop
    pop_all
    append
    concat
    }

Where

Let (concat queues)
    (LIST.reduce queues empty append)

Where

Define (pop_all queue)
    Match (pop queue)
    | `nothing []
    | `just.{item queue} (item :: (pop_all queue))
    ;

Let (push_all queue items)
    (LIST.reduce items queue push)

Define (append queue queue')
    Match (pop queue')
    | `nothing queue
    | `just.{item queue'} (append (push queue item) queue')
    ;

Where

Let (push queue item)
    {Record incoming:(item :: queue.incoming) outgoing:queue.outgoing}

Define (pop queue)
    Match queue.outgoing
    | `cons.{item outgoing}
        Let queue
            {Record incoming:queue.incoming outgoing}
        In
        `just.{item queue}
    | `nil
        Match queue.incoming
        | `nil `nothing
        | _ (pop (new (LIST.reverse queue.incoming)))
        ;
    ;

Where

Let (new init)
    {Record incoming:[] outgoing:init}

Let empty {Record incoming:[] outgoing:[]}

Let (is_empty queue)
    Match queue.incoming
    | `nil Match queue.outgoing | `nil True | `cons._ False ;
    | `cons._ False
    ;

Where

Let LIST Package "list"