factor/libs/dlists.factor

66 lines
1.7 KiB
Factor
Raw Permalink 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.
2006-06-18 20:58:11 -04:00
IN: dlists
USING: generic kernel math modules ;
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 ] if ;
2005-02-07 18:27:55 -05:00
: dlist-empty? ( dlist -- ? )
dlist-first f = ;
2005-02-09 20:17:23 -05:00
: (unlink-prev) ( dlist dnode -- )
dup dlist-node-prev [
dupd swap dlist-node-next swap set-dlist-node-next
] when*
2dup swap dlist-first eq? [
dlist-node-next swap set-dlist-first
] [ 2drop ] if ;
2005-02-09 20:17:23 -05:00
: (unlink-next) ( dlist dnode -- )
dup dlist-node-next [
dupd swap dlist-node-prev swap set-dlist-node-prev
] when*
2dup swap dlist-last eq? [
dlist-node-prev swap set-dlist-last
] [ 2drop ] if ;
2005-02-09 20:17:23 -05:00
: (dlist-unlink) ( dlist dnode -- )
[ (unlink-prev) ] 2keep (unlink-next) ;
2005-02-07 18:27:55 -05:00
: (dlist-pop-front) ( dlist -- data )
2005-02-09 20:17:23 -05:00
[ dlist-first dlist-node-data ] keep dup dlist-first (dlist-unlink) ;
2005-02-07 18:27:55 -05:00
: dlist-pop-front ( dlist -- data )
dup dlist-empty? [ drop f ] [ (dlist-pop-front) ] if ;
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
] if* ; inline
2005-02-08 10:48:12 -05:00
: dlist-each ( dlist quot -- )
2005-02-12 02:23:38 -05:00
swap dlist-first (dlist-each) ; inline
2005-02-08 10:48:12 -05:00
: dlist-length ( dlist -- length )
0 swap [ drop 1 + ] dlist-each ;
2006-06-18 20:58:11 -04:00
2006-11-28 21:57:29 -05:00
PROVIDE: libs/dlists ;