]> gitweb.factorcode.org Git - factor.git/commitdiff
Deque name change
authorDaniel Ehrenberg <littledan@Macintosh-103.local>
Tue, 19 Aug 2008 19:06:20 +0000 (21:06 +0200)
committerDaniel Ehrenberg <littledan@Macintosh-103.local>
Tue, 19 Aug 2008 19:06:20 +0000 (21:06 +0200)
28 files changed:
basis/compiler/compiler.factor
basis/concurrency/conditions/conditions.factor
basis/concurrency/locks/locks.factor
basis/concurrency/mailboxes/mailboxes.factor
basis/concurrency/messaging/messaging-tests.factor
basis/deques/authors.txt [new file with mode: 0644]
basis/deques/deques-docs.factor [new file with mode: 0644]
basis/deques/deques.factor [new file with mode: 0644]
basis/deques/summary.txt [new file with mode: 0644]
basis/deques/tags.txt [new file with mode: 0644]
basis/dlists/dlists-docs.factor
basis/dlists/dlists-tests.factor
basis/dlists/dlists.factor
basis/generator/generator.factor
basis/help/handbook/handbook.factor
basis/search-deques/authors.txt [new file with mode: 0644]
basis/search-deques/search-deques-docs.factor [new file with mode: 0644]
basis/search-deques/search-deques-tests.factor [new file with mode: 0644]
basis/search-deques/search-deques.factor [new file with mode: 0644]
basis/search-deques/summary.txt [new file with mode: 0644]
basis/search-deques/tags.txt [new file with mode: 0644]
basis/threads/threads-docs.factor
basis/threads/threads.factor
checksums.txt [new file with mode: 0644]
extra/io/paths/paths.factor
extra/ui/gadgets/gadgets-tests.factor
extra/ui/gadgets/gadgets.factor
extra/ui/ui.factor

index 093b215013e329c66804ecac99903bf587c5d05d..58d16e17af35e5ff57fa88c25574ae3d2ad23887 100755 (executable)
@@ -4,7 +4,7 @@ USING: kernel namespaces arrays sequences io inference.backend
 inference.state generator debugger words compiler.units
 continuations vocabs assocs alien.compiler dlists optimizer
 definitions math compiler.errors threads graphs generic
-inference combinators dequeues search-dequeues ;
+inference combinators deques search-deques ;
 IN: compiler
 
 SYMBOL: +failed+
@@ -60,8 +60,8 @@ SYMBOL: +failed+
         } cleave
     ] curry with-return ;
 
-: compile-loop ( dequeue -- )
-    [ (compile) yield ] slurp-dequeue ;
+: compile-loop ( deque -- )
+    [ (compile) yield ] slurp-deque ;
 
 : decompile ( word -- )
     f 2array 1array t modify-code-heap ;
index 72f520dab32bb9ba56c74e30ac5d2d83a7b6186b..43374d312754d6d35d5ecb469eca432ee1c6934c 100755 (executable)
@@ -1,13 +1,13 @@
 ! Copyright (C) 2008 Slava Pestov.\r
 ! See http://factorcode.org/license.txt for BSD license.\r
-USING: dequeues threads kernel arrays sequences alarms ;\r
+USING: deques threads kernel arrays sequences alarms ;\r
 IN: concurrency.conditions\r
 \r
-: notify-1 ( dequeue -- )\r
-    dup dequeue-empty? [ drop ] [ pop-back resume-now ] if ;\r
+: notify-1 ( deque -- )\r
+    dup deque-empty? [ drop ] [ pop-back resume-now ] if ;\r
 \r
-: notify-all ( dequeue -- )\r
-    [ resume-now ] slurp-dequeue ;\r
+: notify-all ( deque -- )\r
+    [ resume-now ] slurp-deque ;\r
 \r
 : queue-timeout ( queue timeout -- alarm )\r
     #! Add an alarm which removes the current thread from the\r
index 2ab204e91dc00e5df3a1de68b628514dfe24fd5f..95b6801db2df1dfe48ea0f1254210ddf428ea2a8 100755 (executable)
@@ -1,6 +1,6 @@
 ! Copyright (C) 2008 Slava Pestov.\r
 ! See http://factorcode.org/license.txt for BSD license.\r
-USING: dequeues dlists kernel threads continuations math\r
+USING: deques dlists kernel threads continuations math\r
 concurrency.conditions ;\r
 IN: concurrency.locks\r
 \r
@@ -80,7 +80,7 @@ TUPLE: rw-lock readers writers reader# writer ;
 \r
 : release-write-lock ( lock -- )\r
     f over set-rw-lock-writer\r
-    dup rw-lock-readers dequeue-empty?\r
+    dup rw-lock-readers deque-empty?\r
     [ notify-writer ] [ rw-lock-readers notify-all ] if ;\r
 \r
 : reentrant-read-lock-ok? ( lock -- ? )\r
index 11624ab47395856f10e41d9a2e121ec94e88f294..993c26d922e2e0340aa76228d05730e584711742 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2005, 2008 Chris Double, Slava Pestov.\r
 ! See http://factorcode.org/license.txt for BSD license.\r
 IN: concurrency.mailboxes\r
-USING: dlists dequeues threads sequences continuations\r
+USING: dlists deques threads sequences continuations\r
 destructors namespaces random math quotations words kernel\r
 arrays assocs init system concurrency.conditions accessors\r
 debugger debugger.threads ;\r
@@ -14,7 +14,7 @@ M: mailbox dispose* threads>> notify-all ;
     <dlist> <dlist> f mailbox boa ;\r
 \r
 : mailbox-empty? ( mailbox -- bool )\r
-    data>> dequeue-empty? ;\r
+    data>> deque-empty? ;\r
 \r
 : mailbox-put ( obj mailbox -- )\r
     [ data>> push-front ]\r
index f78287078329890dd21a0c49a7439375a5b95bbe..b5c022effeee263debbede1364c2b5316a6843d6 100755 (executable)
@@ -2,12 +2,12 @@
 ! See http://factorcode.org/license.txt for BSD license.
 !
 USING: kernel threads vectors arrays sequences
-namespaces tools.test continuations dequeues strings math words
+namespaces tools.test continuations deques strings math words
 match quotations concurrency.messaging concurrency.mailboxes
 concurrency.count-downs accessors ;
 IN: concurrency.messaging.tests
 
-[ ] [ my-mailbox mailbox-data clear-dequeue ] unit-test
+[ ] [ my-mailbox mailbox-data clear-deque ] unit-test
 
 [ "received" ] [ 
     [
@@ -64,4 +64,4 @@ SYMBOL: exit
 !     receive drop
 ! ] "Bad synchronous send" spawn "t" set
 
-! [ 3 "t" get send-synchronous ] must-fail
\ No newline at end of file
+! [ 3 "t" get send-synchronous ] must-fail
diff --git a/basis/deques/authors.txt b/basis/deques/authors.txt
new file mode 100644 (file)
index 0000000..1901f27
--- /dev/null
@@ -0,0 +1 @@
+Slava Pestov
diff --git a/basis/deques/deques-docs.factor b/basis/deques/deques-docs.factor
new file mode 100644 (file)
index 0000000..5a4b338
--- /dev/null
@@ -0,0 +1,89 @@
+IN: deques
+USING: help.markup help.syntax kernel ;
+
+ARTICLE: "deques" "Dequeues"
+"A deque is a data structure with constant-time insertion and removal of elements at both ends. Dequeue operations are defined in the " { $vocab-link "deques" } " vocabulary."
+$nl
+"Dequeues must be instances of a mixin class:"
+{ $subsection deque }
+"Dequeues must implement a protocol."
+$nl
+"Querying the deque:"
+{ $subsection peek-front }
+{ $subsection peek-back }
+{ $subsection deque-length }
+{ $subsection deque-member? }
+"Adding and removing elements:"
+{ $subsection push-front* }
+{ $subsection push-back* }
+{ $subsection pop-front* }
+{ $subsection pop-back* }
+{ $subsection clear-deque }
+"Working with node objects output by " { $link push-front* } " and " { $link push-back* } ":"
+{ $subsection delete-node }
+{ $subsection node-value }
+"Utility operations built in terms of the above:"
+{ $subsection deque-empty? }
+{ $subsection push-front }
+{ $subsection push-all-front }
+{ $subsection push-back }
+{ $subsection push-all-back }
+{ $subsection pop-front }
+{ $subsection pop-back }
+{ $subsection slurp-deque }
+"When using a deque as a queue, the convention is to queue elements with " { $link push-front } " and deque them with " { $link pop-back } "." ;
+
+ABOUT: "deques"
+
+HELP: deque-empty?
+{ $values { "deque" { $link deque } } { "?" "a boolean" } }
+{ $description "Returns true if a deque is empty." }
+{ $notes "This operation is O(1)." } ;
+
+HELP: push-front
+{ $values { "obj" object } { "deque" deque } }
+{ $description "Push the object onto the front of the deque." } 
+{ $notes "This operation is O(1)." } ;
+
+HELP: push-front*
+{ $values { "obj" object } { "deque" deque } { "node" "a node" } }
+{ $description "Push the object onto the front of the deque and return the newly created node." } 
+{ $notes "This operation is O(1)." } ;
+
+HELP: push-back
+{ $values { "obj" object } { "deque" deque } }
+{ $description "Push the object onto the back of the deque." } 
+{ $notes "This operation is O(1)." } ;
+
+HELP: push-back*
+{ $values { "obj" object } { "deque" deque } { "node" "a node" } }
+{ $description "Push the object onto the back of the deque and return the newly created node." } 
+{ $notes "This operation is O(1)." } ;
+
+HELP: peek-front
+{ $values { "deque" deque } { "obj" object } }
+{ $description "Returns the object at the front of the deque." } ;
+
+HELP: pop-front
+{ $values { "deque" deque } { "obj" object } }
+{ $description "Pop the object off the front of the deque and return the object." }
+{ $notes "This operation is O(1)." } ;
+
+HELP: pop-front*
+{ $values { "deque" deque } }
+{ $description "Pop the object off the front of the deque." }
+{ $notes "This operation is O(1)." } ;
+
+HELP: peek-back
+{ $values { "deque" deque } { "obj" object } }
+{ $description "Returns the object at the back of the deque." } ;
+
+HELP: pop-back
+{ $values { "deque" deque } { "obj" object } }
+{ $description "Pop the object off the back of the deque and return the object." }
+{ $notes "This operation is O(1)." } ;
+
+HELP: pop-back*
+{ $values { "deque" deque } }
+{ $description "Pop the object off the back of the deque." }
+{ $notes "This operation is O(1)." } ;
diff --git a/basis/deques/deques.factor b/basis/deques/deques.factor
new file mode 100644 (file)
index 0000000..1d86a3f
--- /dev/null
@@ -0,0 +1,43 @@
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: kernel sequences math ;
+IN: deques
+
+GENERIC: push-front* ( obj deque -- node )
+GENERIC: push-back* ( obj deque -- node )
+GENERIC: peek-front ( deque -- obj )
+GENERIC: peek-back ( deque -- obj )
+GENERIC: pop-front* ( deque -- )
+GENERIC: pop-back* ( deque -- )
+GENERIC: delete-node ( node deque -- )
+GENERIC: deque-length ( deque -- n )
+GENERIC: deque-member? ( value deque -- ? )
+GENERIC: clear-deque ( deque -- )
+GENERIC: node-value ( node -- value )
+
+: deque-empty? ( deque -- ? )
+    deque-length zero? ;
+
+: push-front ( obj deque -- )
+    push-front* drop ;
+
+: push-all-front ( seq deque -- )
+    [ push-front ] curry each ;
+
+: push-back ( obj deque -- )
+    push-back* drop ;
+
+: push-all-back ( seq deque -- )
+    [ push-back ] curry each ;
+
+: pop-front ( deque -- obj )
+    [ peek-front ] [ pop-front* ] bi ;
+
+: pop-back ( deque -- obj )
+    [ peek-back ] [ pop-back* ] bi ;
+
+: slurp-deque ( deque quot -- )
+    [ drop [ deque-empty? not ] curry ]
+    [ [ pop-back ] prepose curry ] 2bi [ ] while ; inline
+
+MIXIN: deque
diff --git a/basis/deques/summary.txt b/basis/deques/summary.txt
new file mode 100644 (file)
index 0000000..2f348eb
--- /dev/null
@@ -0,0 +1 @@
+Double-ended queue protocol and common operations
diff --git a/basis/deques/tags.txt b/basis/deques/tags.txt
new file mode 100644 (file)
index 0000000..42d711b
--- /dev/null
@@ -0,0 +1 @@
+collections
index 8ee3510bb9df67c207cffe7ec1e7f0f003617421..557010cf7c636c033fc67e505b0341051ff919d7 100755 (executable)
@@ -1,16 +1,16 @@
 USING: help.markup help.syntax kernel quotations
-dequeues ;
+deques ;
 IN: dlists
 
 ARTICLE: "dlists" "Double-linked lists"
-"A double-linked list is the canonical implementation of a " { $link dequeue } "."
+"A double-linked list is the canonical implementation of a " { $link deque } "."
 $nl
 "Double-linked lists form a class:"
 { $subsection dlist }
 { $subsection dlist? }
 "Constructing a double-linked list:"
 { $subsection <dlist> }
-"Double-linked lists support all the operations of the dequeue protocol (" { $link "dequeues" } ") as well as the following."
+"Double-linked lists support all the operations of the deque protocol (" { $link "deques" } ") as well as the following."
 $nl
 "Iterating over elements:"
 { $subsection dlist-each }
index 119a0acadbaeffbf1c5769d2d1416041b6030ad3..15022452eedeea2c905c47452a1a67326a96674e 100755 (executable)
@@ -1,17 +1,17 @@
-USING: dequeues dlists dlists.private kernel tools.test random
+USING: deques dlists dlists.private kernel tools.test random
 assocs sets sequences namespaces sorting debugger io prettyprint
 math accessors classes ;
 IN: dlists.tests
 
-[ t ] [ <dlist> dequeue-empty? ] unit-test
+[ t ] [ <dlist> deque-empty? ] unit-test
 
 [ T{ dlist f T{ dlist-node f 1 f f } T{ dlist-node f 1 f f } 1 } ]
 [ <dlist> 1 over push-front ] unit-test
 
 ! Make sure empty lists are empty
-[ t ] [ <dlist> dequeue-empty? ] unit-test
-[ f ] [ <dlist> 1 over push-front dequeue-empty? ] unit-test
-[ f ] [ <dlist> 1 over push-back dequeue-empty? ] unit-test
+[ t ] [ <dlist> deque-empty? ] unit-test
+[ f ] [ <dlist> 1 over push-front deque-empty? ] unit-test
+[ f ] [ <dlist> 1 over push-back deque-empty? ] unit-test
 
 [ 1 ] [ <dlist> 1 over push-front pop-front ] unit-test
 [ 1 ] [ <dlist> 1 over push-front pop-back ] unit-test
@@ -50,17 +50,17 @@ IN: dlists.tests
 [ t ] [ <dlist> 1 over push-back [ 1 = ] dlist-contains? ] unit-test
 
 [ 1 ] [ <dlist> 1 over push-back [ 1 = ] delete-node-if ] unit-test
-[ t ] [ <dlist> 1 over push-back dup [ 1 = ] delete-node-if drop dequeue-empty? ] unit-test
-[ t ] [ <dlist> 1 over push-back dup [ 1 = ] delete-node-if drop dequeue-empty? ] unit-test
-[ 0 ] [ <dlist> 1 over push-back dup [ 1 = ] delete-node-if drop dequeue-length ] unit-test
-[ 1 ] [ <dlist> 1 over push-back 2 over push-back dup [ 1 = ] delete-node-if drop dequeue-length ] unit-test
-[ 2 ] [ <dlist> 1 over push-back 2 over push-back 3 over push-back dup [ 1 = ] delete-node-if drop dequeue-length ] unit-test
-[ 2 ] [ <dlist> 1 over push-back 2 over push-back 3 over push-back dup [ 2 = ] delete-node-if drop dequeue-length ] unit-test
-[ 2 ] [ <dlist> 1 over push-back 2 over push-back 3 over push-back dup [ 3 = ] delete-node-if drop dequeue-length ] unit-test
-
-[ 0 ] [ <dlist> dequeue-length ] unit-test
-[ 1 ] [ <dlist> 1 over push-front dequeue-length ] unit-test
-[ 0 ] [ <dlist> 1 over push-front dup pop-front* dequeue-length ] unit-test
+[ t ] [ <dlist> 1 over push-back dup [ 1 = ] delete-node-if drop deque-empty? ] unit-test
+[ t ] [ <dlist> 1 over push-back dup [ 1 = ] delete-node-if drop deque-empty? ] unit-test
+[ 0 ] [ <dlist> 1 over push-back dup [ 1 = ] delete-node-if drop deque-length ] unit-test
+[ 1 ] [ <dlist> 1 over push-back 2 over push-back dup [ 1 = ] delete-node-if drop deque-length ] unit-test
+[ 2 ] [ <dlist> 1 over push-back 2 over push-back 3 over push-back dup [ 1 = ] delete-node-if drop deque-length ] unit-test
+[ 2 ] [ <dlist> 1 over push-back 2 over push-back 3 over push-back dup [ 2 = ] delete-node-if drop deque-length ] unit-test
+[ 2 ] [ <dlist> 1 over push-back 2 over push-back 3 over push-back dup [ 3 = ] delete-node-if drop deque-length ] unit-test
+
+[ 0 ] [ <dlist> deque-length ] unit-test
+[ 1 ] [ <dlist> 1 over push-front deque-length ] unit-test
+[ 0 ] [ <dlist> 1 over push-front dup pop-front* deque-length ] unit-test
 
 [ t ] [ <dlist> 4 over push-back 5 over push-back [ obj>> 4 = ] dlist-find-node drop class dlist-node = ] unit-test
 [ t ] [ <dlist> 4 over push-back 5 over push-back [ obj>> 5 = ] dlist-find-node drop class dlist-node = ] unit-test
@@ -72,8 +72,8 @@ IN: dlists.tests
 [ <dlist> pop-front ] [ empty-dlist? ] must-fail-with
 [ <dlist> pop-back ] [ empty-dlist? ] must-fail-with
 
-[ t ] [ <dlist> 3 over push-front 4 over push-back 3 swap dequeue-member? ] unit-test
+[ t ] [ <dlist> 3 over push-front 4 over push-back 3 swap deque-member? ] unit-test
 
-[ f ] [ <dlist> 3 over push-front 4 over push-back -1 swap dequeue-member? ] unit-test
+[ f ] [ <dlist> 3 over push-front 4 over push-back -1 swap deque-member? ] unit-test
 
-[ f ] [ <dlist> 0 swap dequeue-member? ] unit-test
+[ f ] [ <dlist> 0 swap deque-member? ] unit-test
index 91a5f610ad6c4780a83dcef8cab6d85782a7ffbd..3b3cae28200a24182baef4913918929ed4ad29e0 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2007, 2008 Mackenzie Straight, Doug Coleman,
 ! Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: combinators kernel math sequences accessors dequeues
+USING: combinators kernel math sequences accessors deques
 summary ;
 IN: dlists
 
@@ -11,7 +11,7 @@ TUPLE: dlist front back length ;
     dlist new
         0 >>length ;
 
-M: dlist dequeue-length length>> ;
+M: dlist deque-length length>> ;
 
 <PRIVATE
 
@@ -121,7 +121,7 @@ M: dlist pop-back* ( dlist -- )
 : dlist-contains? ( dlist quot -- ? )
     dlist-find nip ; inline
 
-M: dlist dequeue-member? ( value dlist -- ? )
+M: dlist deque-member? ( value dlist -- ? )
     [ = ] with dlist-contains? ;
 
 M: dlist delete-node ( dlist-node dlist -- )
@@ -145,7 +145,7 @@ M: dlist delete-node ( dlist-node dlist -- )
 : delete-node-if ( dlist quot -- obj/f )
     [ obj>> ] prepose delete-node-if* drop ; inline
 
-M: dlist clear-dequeue ( dlist -- )
+M: dlist clear-deque ( dlist -- )
     f >>front
     f >>back
     0 >>length
@@ -156,4 +156,4 @@ M: dlist clear-dequeue ( dlist -- )
 
 : 1dlist ( obj -- dlist ) <dlist> [ push-front ] keep ;
 
-INSTANCE: dlist dequeue
+INSTANCE: dlist deque
index e646010c4c6ada09a8772204826e807c6bb0c51e..a5443a6e8cfc1776fbcbb12343657d10828c2b58 100755 (executable)
@@ -5,7 +5,7 @@ effects generator.fixup generator.registers generic hashtables
 inference inference.backend inference.dataflow io kernel
 kernel.private layouts math namespaces optimizer
 optimizer.specializers prettyprint quotations sequences system
-threads words vectors sets dequeues ;
+threads words vectors sets deques ;
 IN: generator
 
 SYMBOL: compile-queue
index fc0d00e94d9899417c90551bb69d2e330219f9d8..e44ba441ea8dc8fc12e784a787092f8e745d9128 100755 (executable)
@@ -128,10 +128,10 @@ ARTICLE: "collections" "Collections"
 { $subsection "alists" }
 { $subsection "enums" }
 { $heading "Double-ended queues" }
-{ $subsection "dequeues" }
+{ $subsection "deques" }
 "Implementations:"
 { $subsection "dlists" }
-{ $subsection "search-dequeues" }
+{ $subsection "search-deques" }
 { $heading "Other collections" }
 { $subsection "boxes" }
 { $subsection "heaps" }
diff --git a/basis/search-deques/authors.txt b/basis/search-deques/authors.txt
new file mode 100644 (file)
index 0000000..1901f27
--- /dev/null
@@ -0,0 +1 @@
+Slava Pestov
diff --git a/basis/search-deques/search-deques-docs.factor b/basis/search-deques/search-deques-docs.factor
new file mode 100644 (file)
index 0000000..fef770b
--- /dev/null
@@ -0,0 +1,21 @@
+IN: search-deques
+USING: help.markup help.syntax kernel dlists hashtables
+deques assocs ;
+
+ARTICLE: "search-deques" "Search deques"
+"A search deque is a data structure with constant-time insertion and removal of elements at both ends, and constant-time membership tests. Inserting an element more than once has no effect. Search deques implement all deque operations in terms of an underlying deque, and membership testing with " { $link deque-member? } " is implemented with an underlying assoc. Search deques are defined in the " { $vocab-link "search-deques" } " vocabulary."
+$nl
+"Creating a search deque:"
+{ $subsection <search-deque> }
+"Default implementation:"
+{ $subsection <hashed-dlist> } ;
+
+ABOUT: "search-deques"
+
+HELP: <search-deque> ( assoc deque -- search-deque )
+{ $values { "assoc" assoc } { "deque" deque } { "search-deque" search-deque } }
+{ $description "Creates a new " { $link search-deque } "." } ;
+
+HELP: <hashed-dlist> ( -- search-deque )
+{ $values { "search-deque" search-deque } }
+{ $description "Creates a new " { $link search-deque } " backed by a " { $link dlist } ", with a " { $link hashtable } " for fast membership tests." } ;
diff --git a/basis/search-deques/search-deques-tests.factor b/basis/search-deques/search-deques-tests.factor
new file mode 100644 (file)
index 0000000..cf2837a
--- /dev/null
@@ -0,0 +1,35 @@
+IN: search-deques.tests
+USING: search-deques tools.test namespaces
+kernel sequences words deques vocabs ;
+
+<hashed-dlist> "h" set
+
+[ t ] [ "h" get deque-empty? ] unit-test
+
+[ ] [ 3 "h" get push-front* "1" set ] unit-test
+[ ] [ 1 "h" get push-front ] unit-test
+[ ] [ 3 "h" get push-front* "2" set ] unit-test
+[ ] [ 3 "h" get push-front* "3" set ] unit-test
+[ ] [ 7 "h" get push-front ] unit-test
+
+[ t ] [ "1" get "2" get eq? ] unit-test
+[ t ] [ "2" get "3" get eq? ] unit-test
+
+[ 3 ] [ "h" get deque-length ] unit-test
+[ t ] [ 7 "h" get deque-member? ] unit-test
+
+[ 3 ] [ "1" get node-value ] unit-test
+[ ] [ "1" get "h" get delete-node ] unit-test
+
+[ 2 ] [ "h" get deque-length ] unit-test
+[ 1 ] [ "h" get pop-back ] unit-test
+[ 7 ] [ "h" get pop-back ] unit-test
+
+[ f ] [ 7 "h" get deque-member? ] unit-test
+
+[ ] [
+    <hashed-dlist>
+    [ all-words swap [ push-front ] curry each ]
+    [ [ drop ] slurp-deque ]
+    bi
+] unit-test
diff --git a/basis/search-deques/search-deques.factor b/basis/search-deques/search-deques.factor
new file mode 100644 (file)
index 0000000..8e55060
--- /dev/null
@@ -0,0 +1,53 @@
+! Copyright (C) 2008 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors kernel assocs deques dlists hashtables ;
+IN: search-deques
+
+TUPLE: search-deque assoc deque ;
+
+C: <search-deque> search-deque
+
+: <hashed-dlist> ( -- search-deque )
+    0 <hashtable> <dlist> <search-deque> ;
+
+M: search-deque deque-length deque>> deque-length ;
+
+M: search-deque peek-front deque>> peek-front ;
+
+M: search-deque peek-back deque>> peek-back ;
+
+M: search-deque push-front*
+    2dup assoc>> at* [ 2nip ] [
+        drop
+        [ deque>> push-front* ] [ assoc>> ] 2bi
+        [ 2drop ] [ set-at ] 3bi
+    ] if ;
+
+M: search-deque push-back*
+    2dup assoc>> at* [ 2nip ] [
+        drop
+        [ deque>> push-back* ] [ assoc>> ] 2bi
+        [ 2drop ] [ set-at ] 3bi
+    ] if ;
+
+M: search-deque pop-front*
+    [ [ deque>> peek-front ] [ assoc>> ] bi delete-at ]
+    [ deque>> pop-front* ]
+    bi ;
+
+M: search-deque pop-back*
+    [ [ deque>> peek-back ] [ assoc>> ] bi delete-at ]
+    [ deque>> pop-back* ]
+    bi ;
+
+M: search-deque delete-node
+    [ deque>> delete-node ]
+    [ [ node-value ] [ assoc>> ] bi* delete-at ] 2bi ;
+
+M: search-deque clear-deque
+    [ deque>> clear-deque ] [ assoc>> clear-assoc ] bi ;
+
+M: search-deque deque-member?
+    assoc>> key? ;
+
+INSTANCE: search-deque deque
diff --git a/basis/search-deques/summary.txt b/basis/search-deques/summary.txt
new file mode 100644 (file)
index 0000000..9102bf2
--- /dev/null
@@ -0,0 +1 @@
+Double-ended queues with sub-linear membership testing
diff --git a/basis/search-deques/tags.txt b/basis/search-deques/tags.txt
new file mode 100644 (file)
index 0000000..42d711b
--- /dev/null
@@ -0,0 +1 @@
+collections
index 944526e05ccfce6945244757187392c505b51144..da308f5abf937369da9d706c06f9e16e186bdb72 100755 (executable)
@@ -1,6 +1,6 @@
 USING: help.markup help.syntax kernel kernel.private io
 threads.private continuations dlists init quotations strings
-assocs heaps boxes namespaces dequeues ;
+assocs heaps boxes namespaces deques ;
 IN: threads
 
 ARTICLE: "threads-start/stop" "Starting and stopping threads"
@@ -86,7 +86,7 @@ HELP: run-queue
 { $var-description "Global variable holding the queue of runnable threads. Calls to " { $link yield } " switch to the thread which has been in the queue for the longest period of time."
 $nl
 "By convention, threads are queued with " { $link push-front } 
-" and dequeued with " { $link pop-back } "." } ;
+" and dequed with " { $link pop-back } "." } ;
 
 HELP: resume
 { $values { "thread" thread } }
index c406d0db126db98e1c6af417267eed4b3274088f..e6ffbf98577dac80b013bddd0d1d2a197636dd2d 100755 (executable)
@@ -4,7 +4,7 @@
 USING: arrays hashtables heaps kernel kernel.private math
 namespaces sequences vectors continuations continuations.private
 dlists assocs system combinators init boxes accessors
-math.order dequeues strings quotations ;
+math.order deques strings quotations ;
 IN: threads
 
 SYMBOL: initial-thread
@@ -91,7 +91,7 @@ PRIVATE>
 
 : sleep-time ( -- ms/f )
     {
-        { [ run-queue dequeue-empty? not ] [ 0 ] }
+        { [ run-queue deque-empty? not ] [ 0 ] }
         { [ sleep-queue heap-empty? ] [ f ] }
         [ sleep-queue heap-peek nip millis [-] ]
     } cond ;
@@ -151,7 +151,7 @@ DEFER: next
 
 : next ( -- * )
     expire-sleep-loop
-    run-queue dup dequeue-empty? [
+    run-queue dup deque-empty? [
         drop no-runnable-threads
     ] [
         pop-back dup array? [ first2 ] [ f swap ] if (next)
diff --git a/checksums.txt b/checksums.txt
new file mode 100644 (file)
index 0000000..875e3ad
--- /dev/null
@@ -0,0 +1,4 @@
+boot.x86.32.image 07cd1d5506e508e8054d22f03cd0e63b
+boot.x86.64.image 4e99cd0902df35bbef4d1ad30559d911
+boot.linux-ppc.image 2188d87eb2920b7f34b5c6f2ddf7bd27
+boot.macosx-ppc.image 37e05c8b04df0386032959bdbd9dc9cc
index 98cf3e576960bf17d8cef35fae5d3b4ac33ff1f5..fb4f6d3a6d1f1defa66785a1a0c6bfbf765873ce 100755 (executable)
@@ -1,5 +1,5 @@
 USING: io.files kernel sequences accessors
-dlists dequeues arrays sequences.lib ;
+dlists deques arrays sequences.lib ;
 IN: io.paths
 
 TUPLE: directory-iterator path bfs queue ;
@@ -18,7 +18,7 @@ TUPLE: directory-iterator path bfs queue ;
     dup path>> over push-directory ;
 
 : next-file ( iter -- file/f )
-    dup queue>> dequeue-empty? [ drop f ] [
+    dup queue>> deque-empty? [ drop f ] [
         dup queue>> pop-back first2
         [ over push-directory next-file ] [ nip ] if
     ] if ;
index 1a2555d5381276feabc417caced99f93d5cd8d30..0bce366fccc2253c1b70bed75885fdbc07c75f4c 100755 (executable)
@@ -1,6 +1,6 @@
 IN: ui.gadgets.tests
 USING: accessors ui.gadgets ui.gadgets.packs ui.gadgets.worlds
-tools.test namespaces models kernel dlists dequeues math sets
+tools.test namespaces models kernel dlists deques math sets
 math.parser ui sequences hashtables assocs io arrays prettyprint
 io.streams.string math.geometry.rect ;
 
@@ -91,26 +91,26 @@ M: mock-gadget ungraft*
 [
     <dlist> \ graft-queue [
         [ ] [ <mock-gadget> dup queue-graft unqueue-graft ] unit-test
-        [ t ] [ graft-queue dequeue-empty? ] unit-test
+        [ t ] [ graft-queue deque-empty? ] unit-test
     ] with-variable
 
     <dlist> \ graft-queue [
-        [ t ] [ graft-queue dequeue-empty? ] unit-test
+        [ t ] [ graft-queue deque-empty? ] unit-test
 
         <mock-gadget> "g" set
         [ ] [ "g" get queue-graft ] unit-test
-        [ f ] [ graft-queue dequeue-empty? ] unit-test
+        [ f ] [ graft-queue deque-empty? ] unit-test
         [ { f t } ] [ "g" get gadget-graft-state ] unit-test
         [ ] [ "g" get graft-later ] unit-test
         [ { f t } ] [ "g" get gadget-graft-state ] unit-test
         [ ] [ "g" get ungraft-later ] unit-test
         [ { f f } ] [ "g" get gadget-graft-state ] unit-test
-        [ t ] [ graft-queue dequeue-empty? ] unit-test
+        [ t ] [ graft-queue deque-empty? ] unit-test
         [ ] [ "g" get ungraft-later ] unit-test
         [ ] [ "g" get graft-later ] unit-test
         [ ] [ notify-queued ] unit-test
         [ { t t } ] [ "g" get gadget-graft-state ] unit-test
-        [ t ] [ graft-queue dequeue-empty? ] unit-test
+        [ t ] [ graft-queue deque-empty? ] unit-test
         [ ] [ "g" get graft-later ] unit-test
         [ 1 ] [ "g" get mock-gadget-graft-called ] unit-test
         [ ] [ "g" get ungraft-later ] unit-test
@@ -146,7 +146,7 @@ M: mock-gadget ungraft*
             [ { f t } ] [ "1" get gadget-graft-state ] unit-test
             [ { f t } ] [ "2" get gadget-graft-state ] unit-test
             [ { f t } ] [ "3" get gadget-graft-state ] unit-test
-            [ ] [ graft-queue [ "x" print notify ] slurp-dequeue ] unit-test
+            [ ] [ graft-queue [ "x" print notify ] slurp-deque ] unit-test
             [ ] [ notify-queued ] unit-test
             [ V{ { t t } } ] [ status-flags ] unit-test
         ] with-variable ;
index 90eea255e8eb511ac93220ecfbd8179d5a1a8097..15a28801d603c69b9e83cf346b371e30631dda52 100755 (executable)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays hashtables kernel models math namespaces
        sequences quotations math.vectors combinators sorting
-       binary-search vectors dlists dequeues models threads
+       binary-search vectors dlists deques models threads
        concurrency.flags math.order math.geometry.rect ;
 
 IN: ui.gadgets
index 29d1d166425bdc5dc20e1dc0939d2d56232e0f3c..0e00627cb980c7c24b0bdf7b2e54eaa9df32c73e 100755 (executable)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2006, 2007 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays assocs io kernel math models namespaces
-prettyprint dlists dequeues sequences threads sequences words
+prettyprint dlists deques sequences threads sequences words
 debugger ui.gadgets ui.gadgets.worlds ui.gadgets.tracks
 ui.gestures ui.backend ui.render continuations init combinators
 hashtables concurrency.flags sets accessors ;
@@ -15,7 +15,7 @@ SYMBOL: stop-after-last-window?
 : event-loop? ( -- ? )
     {
         { [ stop-after-last-window? get not ] [ t ] }
-        { [ graft-queue dequeue-empty? not ] [ t ] }
+        { [ graft-queue deque-empty? not ] [ t ] }
         { [ windows get-global empty? not ] [ t ] }
         [ f ]
     } cond ;
@@ -126,7 +126,7 @@ SYMBOL: ui-hook
         in-layout? on
         layout-queue [
             dup layout find-world [ , ] when*
-        ] slurp-dequeue
+        ] slurp-deque
     ] { } make prune ;
 
 : redraw-worlds ( seq -- )
@@ -141,7 +141,7 @@ SYMBOL: ui-hook
     } case ;
 
 : notify-queued ( -- )
-    graft-queue [ notify ] slurp-dequeue ;
+    graft-queue [ notify ] slurp-deque ;
 
 : update-ui ( -- )
     [ notify-queued layout-queued redraw-worlds ] assert-depth ;