-- Code of Queues body on pages 391-392 from
-- Kenneth C. Louden, Programming Languages
-- Principles and Practice 2nd Edition
-- Copyright (C) Brooks-Cole/ITP, 2003
-- (Opaque static queue)

package body Queues2 is

  type Queuerep;
  type Queue is access Queuerep;

  type Queuerep is
  record
    data: T;
    next: Queue;
  end record;

  q: Queue;

  procedure enqueue(elem:T) is
    temp: Queue;
  begin
    temp := new Queuerep;
    temp.data := elem;
    if (q /= null) then
       temp.next := q.next;
       q.next := temp;
    else
       temp.next := temp;
    end if;
    q := temp;
  end enqueue;

  function frontq return T is
  begin
    return q.next.data;
  end frontq;

  procedure dequeue is
  begin
    if q = q.next then
       q := null;
    else
       q.next := q.next.next;
       q := q.next;
    end if;
  end dequeue;

  function emptyq return Boolean is
  begin
    return q = null;
  end emptyq;

begin
  q := null;
end Queues2;
