factor/library/dlists.factor

46 lines
1.2 KiB
Factor
Raw Normal View History

2005-02-07 18:27:55 -05:00
! Copyright (C) 2005 Mackenzie Straight.
! See http://factor.sf.net/license.txt for BSD license.
2005-02-07 18:31:06 -05:00
IN: dlists USING: generic kernel math ;
2005-02-07 18:27:55 -05:00
! Double-linked lists.
TUPLE: dlist first last ;
TUPLE: dlist-node next prev data ;
C: dlist ;
C: dlist-node
[ set-dlist-node-next ] keep
[ set-dlist-node-prev ] keep
[ set-dlist-node-data ] keep ;
: dlist-push-end ( data dlist -- )
[ dlist-last f <dlist-node> ] keep
[ dlist-last [ dupd set-dlist-node-next ] when* ] keep
2dup set-dlist-last
dup dlist-first [ 2drop ] [ set-dlist-first ] ifte ;
: dlist-empty? ( dlist -- ? )
dlist-first f = ;
: (dlist-pop-front) ( dlist -- data )
[ dlist-first dlist-node-data ] keep
[ dup dlist-first dlist-node-next swap set-dlist-first ] keep
dup dlist-first [ drop ] [ f swap set-dlist-last ] ifte ;
: dlist-pop-front ( dlist -- data )
dup dlist-empty? [ drop f ] [ (dlist-pop-front) ] ifte ;
2005-02-08 10:48:12 -05:00
: (dlist-each) ( quot dnode -- )
[
[ dlist-node-data swap call ] 2keep
2005-02-08 10:48:12 -05:00
dlist-node-next (dlist-each)
] [
drop
] ifte* ;
: dlist-each ( dlist quot -- )
swap dlist-first (dlist-each) ;
: dlist-length ( dlist -- length )
0 swap [ drop 1 + ] dlist-each ;