DIRECTORY RefQ; RefQImpl: CEDAR PROGRAM EXPORTS RefQ SHARES RefQ = { OPEN RefQ; Enqueue: PUBLIC PROC [queue: Queue, value: REF] RETURNS [qPlusValue: Queue] = { RETURN[IF value=NIL THEN queue ELSE EnqueueQ[queue, LIST[value]]]; }; EnqueueQ: PUBLIC PROC [queue: Queue, newQ: LIST OF REF] RETURNS [longerQ: Queue] = { IF newQ=NIL THEN RETURN[queue]; IF queue=NIL THEN RETURN[newQ]; longerQ _ queue; FOR q: Queue_queue, q.rest DO IF q.rest#NIL THEN LOOP; q.rest_newQ; RETURN; ENDLOOP; }; Dequeue: PUBLIC PROC [queue: Queue, subqueue: Queue_NIL, mode: DequeueMode_remove] RETURNS [shorterQ: Queue]= { prev: LIST OF REF; shorterQ _ queue; IF queue=NIL THEN RETURN; SELECT mode FROM remove => IF subqueue=NIL THEN subqueue _ queue; truncate => IF subqueue=NIL THEN RETURN; ENDCASE=>ERROR; prev_NIL; FOR ls: Queue _ queue, ls.rest WHILE ls#NIL DO IF ls#subqueue THEN { prev _ ls; LOOP; }; SELECT TRUE FROM prev=NIL OR mode=truncate => shorterQ _ subqueue.rest; mode=remove => prev.rest _ subqueue.rest; ENDCASE=>ERROR; RETURN; ENDLOOP; }; Map: PUBLIC PROC[queue: Queue, p: MapType] RETURNS[quit: BOOL_FALSE] = { FOR ls: Queue _ queue, ls.rest WHILE ls#NIL DO IF p[ls] THEN RETURN[TRUE]; ENDLOOP; }; }. |RefQImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Swinehart, October 22, 1985 3:23:59 pm PDT Κ‰˜šœ ™ Icodešœ Οmœ1™