GENERIC DEFINITION MODULE DList (T : TYPE); (* A generic doubly linked list. *) TYPE Node = POINTER TO NodeRec; NodeRec = RECORD val : T; prev, next : Node; END; List = RECORD head, tail : Node; count : INTEGER; END; PROCEDURE Init(VAR l : List); PROCEDURE Append(VAR l : List; v : T); PROCEDURE Prepend(VAR l : List; v : T); PROCEDURE Count(VAR l : List) : INTEGER; PROCEDURE Get(VAR l : List; i : INTEGER) : T; PROCEDURE Sum(VAR l : List) : T; (* arithmetic over the formal T *) PROCEDURE Reverse(VAR l : List); PROCEDURE ForEach(VAR l : List; (* a procedure parameter *) visit : PROCEDURE(VAR acc : INTEGER; v : T); VAR acc : INTEGER); END DList.