dlists: adding push-before and push-sorted.

db4
John Benediktsson 2013-09-18 18:17:45 -07:00
parent 0de857e1fe
commit d8f258d47e
2 changed files with 34 additions and 4 deletions

View File

@ -1,5 +1,5 @@
USING: accessors arrays classes deques dlists kernel locals
math tools.test ;
math sequences tools.test ;
IN: dlists.tests
[ t ] [ <dlist> deque-empty? ] unit-test
@ -148,3 +148,8 @@ TUPLE: my-node < dlist-link { obj fixnum } ;
] unit-test
{ DL{ 0 1 2 3 4 } } [
<dlist> [
{ 3 2 4 1 0 } [ swap push-sorted drop ] with each
] keep
] unit-test

View File

@ -1,9 +1,9 @@
! Copyright (C) 2007, 2009 Mackenzie Straight, Doug Coleman,
! Slava Pestov.
! Slava Pestov, John Benediktsson.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors arrays combinators combinators.short-circuit
deques fry hashtables kernel parser search-deques sequences
summary vocabs.loader ;
deques fry hashtables kernel math.order parser search-deques
sequences summary vocabs.loader ;
IN: dlists
TUPLE: dlist-link { prev maybe{ dlist-link } } { next maybe{ dlist-link } } ;
@ -192,6 +192,31 @@ M: dlist clear-deque ( dlist -- )
M: dlist clone
<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
SYNTAX: DL{ \ } [ >dlist ] parse-literal ;