-- Code of Figure 9.11, pages 379-380 from
-- Kenneth C. Louden, Programming Languages
-- Principles and Practice 2nd Edition
-- Copyright (C) Brooks-Cole/ITP, 2003

package body Queues is
  type Queuerep is
  record
    data: T;
    next: Queue;
  end record;

  function createq return Queue is
  begin
    return null;
  end createq;

  function enqueue(q:Queue;elem:T) return Queue 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;
    return temp;
  end enqueue;

  function frontq(q:Queue) return T is
  begin
    return q.next.data;
  end frontq;

  function dequeue(q:Queue) return Queue is
  begin
    if q = q.next then
       return null;
    else
       q.next := q.next.next;
       return q; -- corrected from code in text
    end if;
  end dequeue;

  function emptyq(q:Queue) return Boolean is
  begin
    return q = null;
  end emptyq;

end Queues;
