2006-05-14 23:26:05 -04:00
|
|
|
! Copyright (C) 2005, 2006 Slava Pestov.
|
2005-12-31 04:20:07 -05:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2005-08-23 15:50:32 -04:00
|
|
|
IN: queues
|
2006-05-14 23:26:05 -04:00
|
|
|
USING: errors kernel ;
|
2005-08-23 15:50:32 -04:00
|
|
|
|
2006-05-14 23:26:05 -04:00
|
|
|
TUPLE: entry obj next ;
|
|
|
|
|
|
|
|
|
|
C: entry ( obj -- entry ) [ set-entry-obj ] keep ;
|
|
|
|
|
|
|
|
|
|
TUPLE: queue head tail ;
|
2005-12-31 04:20:07 -05:00
|
|
|
|
|
|
|
|
C: queue ( -- queue ) ;
|
|
|
|
|
|
2006-05-14 23:26:05 -04:00
|
|
|
: queue-empty? ( queue -- ? ) queue-head not ;
|
|
|
|
|
|
|
|
|
|
: clear-queue ( queue -- )
|
|
|
|
|
f over set-queue-head f swap set-queue-tail ;
|
|
|
|
|
|
2006-06-04 02:00:59 -04:00
|
|
|
: (enque) ( entry queue -- )
|
2006-05-14 23:26:05 -04:00
|
|
|
[ set-queue-head ] 2keep set-queue-tail ;
|
2005-12-31 04:20:07 -05:00
|
|
|
|
|
|
|
|
: enque ( obj queue -- )
|
2006-05-14 23:26:05 -04:00
|
|
|
>r <entry> r> dup queue-empty? [
|
2006-06-04 02:00:59 -04:00
|
|
|
(enque)
|
2006-05-14 23:26:05 -04:00
|
|
|
] [
|
|
|
|
|
[ queue-tail set-entry-next ] 2keep set-queue-tail
|
|
|
|
|
] if ;
|
|
|
|
|
|
|
|
|
|
: (deque) ( queue -- )
|
|
|
|
|
dup queue-head over queue-tail eq? [
|
|
|
|
|
clear-queue
|
|
|
|
|
] [
|
|
|
|
|
dup queue-head entry-next swap set-queue-head
|
|
|
|
|
] if ;
|
2005-12-31 04:20:07 -05:00
|
|
|
|
|
|
|
|
: deque ( queue -- obj )
|
2006-05-14 23:26:05 -04:00
|
|
|
dup queue-empty? [
|
|
|
|
|
"Empty queue" throw
|
2005-08-23 15:50:32 -04:00
|
|
|
] [
|
2006-05-14 23:26:05 -04:00
|
|
|
dup queue-head entry-obj >r (deque) r>
|
|
|
|
|
] if ;
|