dlists: adding push-before and push-sorted.
parent
0de857e1fe
commit
d8f258d47e
|
@ -1,5 +1,5 @@
|
||||||
USING: accessors arrays classes deques dlists kernel locals
|
USING: accessors arrays classes deques dlists kernel locals
|
||||||
math tools.test ;
|
math sequences tools.test ;
|
||||||
IN: dlists.tests
|
IN: dlists.tests
|
||||||
|
|
||||||
[ t ] [ <dlist> deque-empty? ] unit-test
|
[ t ] [ <dlist> deque-empty? ] unit-test
|
||||||
|
@ -148,3 +148,8 @@ TUPLE: my-node < dlist-link { obj fixnum } ;
|
||||||
] unit-test
|
] unit-test
|
||||||
|
|
||||||
|
|
||||||
|
{ DL{ 0 1 2 3 4 } } [
|
||||||
|
<dlist> [
|
||||||
|
{ 3 2 4 1 0 } [ swap push-sorted drop ] with each
|
||||||
|
] keep
|
||||||
|
] unit-test
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
! Copyright (C) 2007, 2009 Mackenzie Straight, Doug Coleman,
|
! Copyright (C) 2007, 2009 Mackenzie Straight, Doug Coleman,
|
||||||
! Slava Pestov.
|
! Slava Pestov, John Benediktsson.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: accessors arrays combinators combinators.short-circuit
|
USING: accessors arrays combinators combinators.short-circuit
|
||||||
deques fry hashtables kernel parser search-deques sequences
|
deques fry hashtables kernel math.order parser search-deques
|
||||||
summary vocabs.loader ;
|
sequences summary vocabs.loader ;
|
||||||
IN: dlists
|
IN: dlists
|
||||||
|
|
||||||
TUPLE: dlist-link { prev maybe{ dlist-link } } { next maybe{ dlist-link } } ;
|
TUPLE: dlist-link { prev maybe{ dlist-link } } { next maybe{ dlist-link } } ;
|
||||||
|
@ -192,6 +192,31 @@ M: dlist clear-deque ( dlist -- )
|
||||||
M: dlist clone
|
M: dlist clone
|
||||||
<dlist> [ '[ _ push-back ] dlist-each ] keep ;
|
<dlist> [ '[ _ push-back ] dlist-each ] keep ;
|
||||||
|
|
||||||
|
<PRIVATE
|
||||||
|
|
||||||
|
: (push-before-node) ( obj dlist-node -- new-dlist-node )
|
||||||
|
[ [ prev>> ] keep <dlist-node> ] keep {
|
||||||
|
[ prev>> [ next<< ] [ drop ] if* ]
|
||||||
|
[ prev<< ]
|
||||||
|
[ drop ]
|
||||||
|
} 2cleave ; inline
|
||||||
|
|
||||||
|
: push-before-node ( obj dlist-node dlist -- new-dlist-node )
|
||||||
|
2dup front>> eq? [
|
||||||
|
nip push-front*
|
||||||
|
] [
|
||||||
|
drop (push-before-node)
|
||||||
|
] if ; inline
|
||||||
|
|
||||||
|
PRIVATE>
|
||||||
|
|
||||||
|
: push-before ( ... obj dlist quot: ( ... obj -- ... ? ) -- ... dlist-node )
|
||||||
|
[ obj>> ] prepose over [ dlist-find-node ] dip swap
|
||||||
|
[ swap push-before-node ] [ push-back* ] if* ; inline
|
||||||
|
|
||||||
|
: push-sorted ( obj dlist -- dlist-node )
|
||||||
|
dupd [ before? ] with push-before ;
|
||||||
|
|
||||||
INSTANCE: dlist deque
|
INSTANCE: dlist deque
|
||||||
|
|
||||||
SYNTAX: DL{ \ } [ >dlist ] parse-literal ;
|
SYNTAX: DL{ \ } [ >dlist ] parse-literal ;
|
||||||
|
|
Loading…
Reference in New Issue