]> gitweb.factorcode.org Git - factor.git/commitdiff
dlists: adding push-before and push-sorted.
authorJohn Benediktsson <mrjbq7@gmail.com>
Thu, 19 Sep 2013 01:17:45 +0000 (18:17 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Thu, 19 Sep 2013 01:17:45 +0000 (18:17 -0700)
basis/dlists/dlists-tests.factor
basis/dlists/dlists.factor

index a4879d6ea39d54d2ba5062d50c6fd1b287e6c3ad..5c650adabe7bf07a5c15ce2b7c27f0ce0c48e506 100644 (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
index 297e5a5c25a1fb3f36baa2fc3fa22a6eac6584ae..251ab78e7e5d69f47ec598e2141df86026a47369 100644 (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 ;