From 87610f24dc0d96af9a6d02700655a9c583cb319f Mon Sep 17 00:00:00 2001 From: Daniel Ehrenberg Date: Fri, 15 Aug 2008 05:10:18 +0200 Subject: [PATCH 1/3] persistent deques cleanup, name changes --- basis/persistent/deques/deques-tests.factor | 29 +++++----- basis/persistent/deques/deques.factor | 63 ++++++++++++--------- 2 files changed, 53 insertions(+), 39 deletions(-) diff --git a/basis/persistent/deques/deques-tests.factor b/basis/persistent/deques/deques-tests.factor index 353828cb14..96c7bd7ea2 100644 --- a/basis/persistent/deques/deques-tests.factor +++ b/basis/persistent/deques/deques-tests.factor @@ -1,35 +1,38 @@ -! Copyright (C) 2008 Daniel Ehrenberg +! Copyback (C) 2008 Daniel Ehrenberg ! See http://factorcode.org/license.txt for BSD license. USING: tools.test persistent.deques kernel math ; IN: persistent.deques.tests [ 3 2 1 t ] -[ { 1 2 3 } sequence>deque 3 [ pop-right ] times deque-empty? ] unit-test +[ { 1 2 3 } sequence>deque 3 [ pop-back ] times deque-empty? ] unit-test [ 1 2 3 t ] -[ { 1 2 3 } sequence>deque 3 [ pop-left ] times deque-empty? ] unit-test +[ { 1 2 3 } sequence>deque 3 [ pop-front ] times deque-empty? ] unit-test [ 1 3 2 t ] -[ { 1 2 3 } sequence>deque pop-left 2 [ pop-right ] times deque-empty? ] +[ { 1 2 3 } sequence>deque pop-front 2 [ pop-back ] times deque-empty? ] unit-test [ { 2 3 4 5 6 1 } ] -[ { 1 2 3 4 5 6 } sequence>deque pop-left swap push-right deque>sequence ] +[ { 1 2 3 4 5 6 } sequence>deque pop-front swap push-back deque>sequence ] unit-test -[ 1 t ] [ 1 push-left pop-right deque-empty? ] unit-test -[ 1 t ] [ 1 push-left pop-left deque-empty? ] unit-test -[ 1 t ] [ 1 push-right pop-left deque-empty? ] unit-test -[ 1 t ] [ 1 push-right pop-right deque-empty? ] unit-test +[ 1 ] [ { 1 2 3 4 } sequence>deque peek-front ] unit-test +[ 4 ] [ { 1 2 3 4 } sequence>deque peek-back ] unit-test + +[ 1 t ] [ 1 push-front pop-back deque-empty? ] unit-test +[ 1 t ] [ 1 push-front pop-front deque-empty? ] unit-test +[ 1 t ] [ 1 push-back pop-front deque-empty? ] unit-test +[ 1 t ] [ 1 push-back pop-back deque-empty? ] unit-test [ 1 f ] -[ 1 push-left 2 push-left pop-right deque-empty? ] unit-test +[ 1 push-front 2 push-front pop-back deque-empty? ] unit-test [ 1 f ] -[ 1 push-right 2 push-right pop-left deque-empty? ] unit-test +[ 1 push-back 2 push-back pop-front deque-empty? ] unit-test [ 2 f ] -[ 1 push-right 2 push-right pop-right deque-empty? ] unit-test +[ 1 push-back 2 push-back pop-back deque-empty? ] unit-test [ 2 f ] -[ 1 push-left 2 push-left pop-left deque-empty? ] unit-test +[ 1 push-front 2 push-front pop-front deque-empty? ] unit-test diff --git a/basis/persistent/deques/deques.factor b/basis/persistent/deques/deques.factor index b30153aada..db8335c982 100644 --- a/basis/persistent/deques/deques.factor +++ b/basis/persistent/deques/deques.factor @@ -1,4 +1,4 @@ -! Copyright (C) 2008 Daniel Ehrenberg +! Copyback (C) 2008 Daniel Ehrenberg ! See http://factorcode.org/license.txt for BSD license. USING: kernel accessors math qualified ; QUALIFIED: sequences @@ -33,44 +33,55 @@ C: cons dup length 2/ cut [ reverse ] bi@ ; PRIVATE> -TUPLE: deque { lhs read-only } { rhs read-only } ; +TUPLE: deque { front read-only } { back read-only } ; : ( -- deque ) T{ deque } ; +> ] [ front>> ] bi deque boa ; + +: flipped ( deque quot -- newdeque ) + >r flip r> call flip ; +PRIVATE> + : deque-empty? ( deque -- ? ) - [ lhs>> ] [ rhs>> ] bi or not ; - -: push-left ( deque item -- newdeque ) - swap [ lhs>> ] [ rhs>> ] bi deque boa ; - -: push-right ( deque item -- newdeque ) - swap [ rhs>> ] [ lhs>> ] bi swap deque boa ; + [ front>> ] [ back>> ] bi or not ; > car>> ] [ [ lhs>> cdr>> ] [ rhs>> ] bi deque boa ] bi ; - -: transfer-left ( deque -- item newdeque ) - rhs>> [ split-reverse deque boa (pop-left) ] - [ "Popping from an empty deque" throw ] if* ; +: push ( item deque -- newdeque ) + [ front>> ] [ back>> ] bi deque boa ; inline PRIVATE> -: pop-left ( deque -- item newdeque ) - dup lhs>> [ (pop-left) ] [ transfer-left ] if ; +: push-front ( deque item -- newdeque ) + swap push ; + +: push-back ( deque item -- newdeque ) + swap [ push ] flipped ; > car>> ] [ [ lhs>> ] [ rhs>> cdr>> ] bi deque boa ] bi ; +: remove ( deque -- item newdeque ) + [ front>> car>> ] [ [ front>> cdr>> ] [ back>> ] bi deque boa ] bi ; inline -: transfer-right ( deque -- newdeque item ) - lhs>> [ split-reverse deque boa (pop-left) ] - [ "Popping from an empty deque" throw ] if* ; +: transfer ( deque -- item newdeque ) + back>> [ split-reverse deque boa remove ] + [ "Popping from an empty deque" throw ] if* ; inline + +: pop ( deque -- item newdeque ) + dup front>> [ remove ] [ transfer ] if ; inline PRIVATE> -: pop-right ( deque -- item newdeque ) - dup rhs>> [ (pop-right) ] [ transfer-right ] if ; +: pop-front ( deque -- item newdeque ) + pop ; + +: pop-back ( deque -- item newdeque ) + [ pop ] flipped ; + +: peek-front ( deque -- item ) pop-front drop ; + +: peek-back ( deque -- item ) pop-back drop ; : sequence>deque ( sequence -- deque ) - [ push-right ] sequences:reduce ; + [ push-back ] sequences:reduce ; : deque>sequence ( deque -- sequence ) - [ dup deque-empty? not ] [ pop-left swap ] [ ] sequences:produce nip ; + [ dup deque-empty? not ] [ pop-front swap ] [ ] sequences:produce nip ; From 1c13a6a4b97967b70f88f5e78ca3bf6118d17283 Mon Sep 17 00:00:00 2001 From: Daniel Ehrenberg Date: Tue, 19 Aug 2008 21:06:20 +0200 Subject: [PATCH 2/3] Deque name change --- basis/compiler/compiler.factor | 6 +- .../concurrency/conditions/conditions.factor | 10 +-- basis/concurrency/locks/locks.factor | 4 +- basis/concurrency/mailboxes/mailboxes.factor | 4 +- .../messaging/messaging-tests.factor | 6 +- basis/deques/authors.txt | 1 + basis/deques/deques-docs.factor | 89 +++++++++++++++++++ basis/deques/deques.factor | 43 +++++++++ basis/deques/summary.txt | 1 + basis/deques/tags.txt | 1 + basis/dlists/dlists-docs.factor | 6 +- basis/dlists/dlists-tests.factor | 36 ++++---- basis/dlists/dlists.factor | 10 +-- basis/generator/generator.factor | 2 +- basis/help/handbook/handbook.factor | 4 +- basis/search-deques/authors.txt | 1 + basis/search-deques/search-deques-docs.factor | 21 +++++ .../search-deques/search-deques-tests.factor | 35 ++++++++ basis/search-deques/search-deques.factor | 53 +++++++++++ basis/search-deques/summary.txt | 1 + basis/search-deques/tags.txt | 1 + basis/threads/threads-docs.factor | 4 +- basis/threads/threads.factor | 6 +- checksums.txt | 4 + extra/io/paths/paths.factor | 4 +- extra/ui/gadgets/gadgets-tests.factor | 14 +-- extra/ui/gadgets/gadgets.factor | 2 +- extra/ui/ui.factor | 8 +- 28 files changed, 314 insertions(+), 63 deletions(-) create mode 100644 basis/deques/authors.txt create mode 100644 basis/deques/deques-docs.factor create mode 100644 basis/deques/deques.factor create mode 100644 basis/deques/summary.txt create mode 100644 basis/deques/tags.txt create mode 100644 basis/search-deques/authors.txt create mode 100644 basis/search-deques/search-deques-docs.factor create mode 100644 basis/search-deques/search-deques-tests.factor create mode 100644 basis/search-deques/search-deques.factor create mode 100644 basis/search-deques/summary.txt create mode 100644 basis/search-deques/tags.txt create mode 100644 checksums.txt diff --git a/basis/compiler/compiler.factor b/basis/compiler/compiler.factor index 093b215013..58d16e17af 100755 --- a/basis/compiler/compiler.factor +++ b/basis/compiler/compiler.factor @@ -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 ; diff --git a/basis/concurrency/conditions/conditions.factor b/basis/concurrency/conditions/conditions.factor index 72f520dab3..43374d3127 100755 --- a/basis/concurrency/conditions/conditions.factor +++ b/basis/concurrency/conditions/conditions.factor @@ -1,13 +1,13 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: dequeues threads kernel arrays sequences alarms ; +USING: deques threads kernel arrays sequences alarms ; IN: concurrency.conditions -: notify-1 ( dequeue -- ) - dup dequeue-empty? [ drop ] [ pop-back resume-now ] if ; +: notify-1 ( deque -- ) + dup deque-empty? [ drop ] [ pop-back resume-now ] if ; -: notify-all ( dequeue -- ) - [ resume-now ] slurp-dequeue ; +: notify-all ( deque -- ) + [ resume-now ] slurp-deque ; : queue-timeout ( queue timeout -- alarm ) #! Add an alarm which removes the current thread from the diff --git a/basis/concurrency/locks/locks.factor b/basis/concurrency/locks/locks.factor index 2ab204e91d..95b6801db2 100755 --- a/basis/concurrency/locks/locks.factor +++ b/basis/concurrency/locks/locks.factor @@ -1,6 +1,6 @@ ! Copyright (C) 2008 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: dequeues dlists kernel threads continuations math +USING: deques dlists kernel threads continuations math concurrency.conditions ; IN: concurrency.locks @@ -80,7 +80,7 @@ TUPLE: rw-lock readers writers reader# writer ; : release-write-lock ( lock -- ) f over set-rw-lock-writer - dup rw-lock-readers dequeue-empty? + dup rw-lock-readers deque-empty? [ notify-writer ] [ rw-lock-readers notify-all ] if ; : reentrant-read-lock-ok? ( lock -- ? ) diff --git a/basis/concurrency/mailboxes/mailboxes.factor b/basis/concurrency/mailboxes/mailboxes.factor index 11624ab473..993c26d922 100755 --- a/basis/concurrency/mailboxes/mailboxes.factor +++ b/basis/concurrency/mailboxes/mailboxes.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2005, 2008 Chris Double, Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. IN: concurrency.mailboxes -USING: dlists dequeues threads sequences continuations +USING: dlists deques threads sequences continuations destructors namespaces random math quotations words kernel arrays assocs init system concurrency.conditions accessors debugger debugger.threads ; @@ -14,7 +14,7 @@ M: mailbox dispose* threads>> notify-all ; f mailbox boa ; : mailbox-empty? ( mailbox -- bool ) - data>> dequeue-empty? ; + data>> deque-empty? ; : mailbox-put ( obj mailbox -- ) [ data>> push-front ] diff --git a/basis/concurrency/messaging/messaging-tests.factor b/basis/concurrency/messaging/messaging-tests.factor index f782870783..b5c022effe 100755 --- a/basis/concurrency/messaging/messaging-tests.factor +++ b/basis/concurrency/messaging/messaging-tests.factor @@ -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 index 0000000000..1901f27a24 --- /dev/null +++ b/basis/deques/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/basis/deques/deques-docs.factor b/basis/deques/deques-docs.factor new file mode 100644 index 0000000000..5a4b33887b --- /dev/null +++ b/basis/deques/deques-docs.factor @@ -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 index 0000000000..1d86a3f1db --- /dev/null +++ b/basis/deques/deques.factor @@ -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 index 0000000000..2f348ebb05 --- /dev/null +++ b/basis/deques/summary.txt @@ -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 index 0000000000..42d711b32b --- /dev/null +++ b/basis/deques/tags.txt @@ -0,0 +1 @@ +collections diff --git a/basis/dlists/dlists-docs.factor b/basis/dlists/dlists-docs.factor index 8ee3510bb9..557010cf7c 100755 --- a/basis/dlists/dlists-docs.factor +++ b/basis/dlists/dlists-docs.factor @@ -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 } -"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 } diff --git a/basis/dlists/dlists-tests.factor b/basis/dlists/dlists-tests.factor index 119a0acadb..15022452ee 100755 --- a/basis/dlists/dlists-tests.factor +++ b/basis/dlists/dlists-tests.factor @@ -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 ] [ dequeue-empty? ] unit-test +[ t ] [ deque-empty? ] unit-test [ T{ dlist f T{ dlist-node f 1 f f } T{ dlist-node f 1 f f } 1 } ] [ 1 over push-front ] unit-test ! Make sure empty lists are empty -[ t ] [ dequeue-empty? ] unit-test -[ f ] [ 1 over push-front dequeue-empty? ] unit-test -[ f ] [ 1 over push-back dequeue-empty? ] unit-test +[ t ] [ deque-empty? ] unit-test +[ f ] [ 1 over push-front deque-empty? ] unit-test +[ f ] [ 1 over push-back deque-empty? ] unit-test [ 1 ] [ 1 over push-front pop-front ] unit-test [ 1 ] [ 1 over push-front pop-back ] unit-test @@ -50,17 +50,17 @@ IN: dlists.tests [ t ] [ 1 over push-back [ 1 = ] dlist-contains? ] unit-test [ 1 ] [ 1 over push-back [ 1 = ] delete-node-if ] unit-test -[ t ] [ 1 over push-back dup [ 1 = ] delete-node-if drop dequeue-empty? ] unit-test -[ t ] [ 1 over push-back dup [ 1 = ] delete-node-if drop dequeue-empty? ] unit-test -[ 0 ] [ 1 over push-back dup [ 1 = ] delete-node-if drop dequeue-length ] unit-test -[ 1 ] [ 1 over push-back 2 over push-back dup [ 1 = ] delete-node-if drop dequeue-length ] unit-test -[ 2 ] [ 1 over push-back 2 over push-back 3 over push-back dup [ 1 = ] delete-node-if drop dequeue-length ] unit-test -[ 2 ] [ 1 over push-back 2 over push-back 3 over push-back dup [ 2 = ] delete-node-if drop dequeue-length ] unit-test -[ 2 ] [ 1 over push-back 2 over push-back 3 over push-back dup [ 3 = ] delete-node-if drop dequeue-length ] unit-test +[ t ] [ 1 over push-back dup [ 1 = ] delete-node-if drop deque-empty? ] unit-test +[ t ] [ 1 over push-back dup [ 1 = ] delete-node-if drop deque-empty? ] unit-test +[ 0 ] [ 1 over push-back dup [ 1 = ] delete-node-if drop deque-length ] unit-test +[ 1 ] [ 1 over push-back 2 over push-back dup [ 1 = ] delete-node-if drop deque-length ] unit-test +[ 2 ] [ 1 over push-back 2 over push-back 3 over push-back dup [ 1 = ] delete-node-if drop deque-length ] unit-test +[ 2 ] [ 1 over push-back 2 over push-back 3 over push-back dup [ 2 = ] delete-node-if drop deque-length ] unit-test +[ 2 ] [ 1 over push-back 2 over push-back 3 over push-back dup [ 3 = ] delete-node-if drop deque-length ] unit-test -[ 0 ] [ dequeue-length ] unit-test -[ 1 ] [ 1 over push-front dequeue-length ] unit-test -[ 0 ] [ 1 over push-front dup pop-front* dequeue-length ] unit-test +[ 0 ] [ deque-length ] unit-test +[ 1 ] [ 1 over push-front deque-length ] unit-test +[ 0 ] [ 1 over push-front dup pop-front* deque-length ] unit-test [ t ] [ 4 over push-back 5 over push-back [ obj>> 4 = ] dlist-find-node drop class dlist-node = ] unit-test [ t ] [ 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 [ pop-front ] [ empty-dlist? ] must-fail-with [ pop-back ] [ empty-dlist? ] must-fail-with -[ t ] [ 3 over push-front 4 over push-back 3 swap dequeue-member? ] unit-test +[ t ] [ 3 over push-front 4 over push-back 3 swap deque-member? ] unit-test -[ f ] [ 3 over push-front 4 over push-back -1 swap dequeue-member? ] unit-test +[ f ] [ 3 over push-front 4 over push-back -1 swap deque-member? ] unit-test -[ f ] [ 0 swap dequeue-member? ] unit-test +[ f ] [ 0 swap deque-member? ] unit-test diff --git a/basis/dlists/dlists.factor b/basis/dlists/dlists.factor index 91a5f610ad..3b3cae2820 100755 --- a/basis/dlists/dlists.factor +++ b/basis/dlists/dlists.factor @@ -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>> ; > ] 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 ) [ push-front ] keep ; -INSTANCE: dlist dequeue +INSTANCE: dlist deque diff --git a/basis/generator/generator.factor b/basis/generator/generator.factor index e646010c4c..a5443a6e8c 100755 --- a/basis/generator/generator.factor +++ b/basis/generator/generator.factor @@ -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 diff --git a/basis/help/handbook/handbook.factor b/basis/help/handbook/handbook.factor index fc0d00e94d..e44ba441ea 100755 --- a/basis/help/handbook/handbook.factor +++ b/basis/help/handbook/handbook.factor @@ -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 index 0000000000..1901f27a24 --- /dev/null +++ b/basis/search-deques/authors.txt @@ -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 index 0000000000..fef770b0f8 --- /dev/null +++ b/basis/search-deques/search-deques-docs.factor @@ -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 } +"Default implementation:" +{ $subsection } ; + +ABOUT: "search-deques" + +HELP: ( assoc deque -- search-deque ) +{ $values { "assoc" assoc } { "deque" deque } { "search-deque" search-deque } } +{ $description "Creates a new " { $link search-deque } "." } ; + +HELP: ( -- 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 index 0000000000..cf2837a84c --- /dev/null +++ b/basis/search-deques/search-deques-tests.factor @@ -0,0 +1,35 @@ +IN: search-deques.tests +USING: search-deques tools.test namespaces +kernel sequences words deques vocabs ; + + "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 + +[ ] [ + + [ 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 index 0000000000..8e5506090c --- /dev/null +++ b/basis/search-deques/search-deques.factor @@ -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 ) + 0 ; + +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 index 0000000000..9102bf2d58 --- /dev/null +++ b/basis/search-deques/summary.txt @@ -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 index 0000000000..42d711b32b --- /dev/null +++ b/basis/search-deques/tags.txt @@ -0,0 +1 @@ +collections diff --git a/basis/threads/threads-docs.factor b/basis/threads/threads-docs.factor index 944526e05c..da308f5abf 100755 --- a/basis/threads/threads-docs.factor +++ b/basis/threads/threads-docs.factor @@ -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 } } diff --git a/basis/threads/threads.factor b/basis/threads/threads.factor index c406d0db12..e6ffbf9857 100755 --- a/basis/threads/threads.factor +++ b/basis/threads/threads.factor @@ -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 index 0000000000..875e3ad24f --- /dev/null +++ b/checksums.txt @@ -0,0 +1,4 @@ +boot.x86.32.image 07cd1d5506e508e8054d22f03cd0e63b +boot.x86.64.image 4e99cd0902df35bbef4d1ad30559d911 +boot.linux-ppc.image 2188d87eb2920b7f34b5c6f2ddf7bd27 +boot.macosx-ppc.image 37e05c8b04df0386032959bdbd9dc9cc diff --git a/extra/io/paths/paths.factor b/extra/io/paths/paths.factor index 98cf3e5769..fb4f6d3a6d 100755 --- a/extra/io/paths/paths.factor +++ b/extra/io/paths/paths.factor @@ -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 ; diff --git a/extra/ui/gadgets/gadgets-tests.factor b/extra/ui/gadgets/gadgets-tests.factor index 1a2555d538..0bce366fcc 100755 --- a/extra/ui/gadgets/gadgets-tests.factor +++ b/extra/ui/gadgets/gadgets-tests.factor @@ -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* [ \ graft-queue [ [ ] [ dup queue-graft unqueue-graft ] unit-test - [ t ] [ graft-queue dequeue-empty? ] unit-test + [ t ] [ graft-queue deque-empty? ] unit-test ] with-variable \ graft-queue [ - [ t ] [ graft-queue dequeue-empty? ] unit-test + [ t ] [ graft-queue deque-empty? ] unit-test "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 ; diff --git a/extra/ui/gadgets/gadgets.factor b/extra/ui/gadgets/gadgets.factor index 90eea255e8..15a28801d6 100755 --- a/extra/ui/gadgets/gadgets.factor +++ b/extra/ui/gadgets/gadgets.factor @@ -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 diff --git a/extra/ui/ui.factor b/extra/ui/ui.factor index 29d1d16642..0e00627cb9 100755 --- a/extra/ui/ui.factor +++ b/extra/ui/ui.factor @@ -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 ; From 7e098265ef01ab95416946f9903ccdd982495b04 Mon Sep 17 00:00:00 2001 From: Daniel Ehrenberg Date: Thu, 21 Aug 2008 22:11:28 +0200 Subject: [PATCH 3/3] Final changes for deques rename --- basis/dequeues/authors.txt | 1 - basis/dequeues/dequeues-docs.factor | 89 ------------------- basis/dequeues/dequeues.factor | 43 --------- basis/dequeues/summary.txt | 1 - basis/dequeues/tags.txt | 1 - basis/persistent/deques/deques-docs.factor | 30 +++---- basis/search-dequeues/authors.txt | 1 - .../search-dequeues-docs.factor | 21 ----- .../search-dequeues-tests.factor | 35 -------- basis/search-dequeues/search-dequeues.factor | 53 ----------- basis/search-dequeues/summary.txt | 1 - basis/search-dequeues/tags.txt | 1 - 12 files changed, 15 insertions(+), 262 deletions(-) delete mode 100644 basis/dequeues/authors.txt delete mode 100644 basis/dequeues/dequeues-docs.factor delete mode 100644 basis/dequeues/dequeues.factor delete mode 100644 basis/dequeues/summary.txt delete mode 100644 basis/dequeues/tags.txt delete mode 100644 basis/search-dequeues/authors.txt delete mode 100644 basis/search-dequeues/search-dequeues-docs.factor delete mode 100644 basis/search-dequeues/search-dequeues-tests.factor delete mode 100644 basis/search-dequeues/search-dequeues.factor delete mode 100644 basis/search-dequeues/summary.txt delete mode 100644 basis/search-dequeues/tags.txt diff --git a/basis/dequeues/authors.txt b/basis/dequeues/authors.txt deleted file mode 100644 index 1901f27a24..0000000000 --- a/basis/dequeues/authors.txt +++ /dev/null @@ -1 +0,0 @@ -Slava Pestov diff --git a/basis/dequeues/dequeues-docs.factor b/basis/dequeues/dequeues-docs.factor deleted file mode 100644 index 25cc969ff2..0000000000 --- a/basis/dequeues/dequeues-docs.factor +++ /dev/null @@ -1,89 +0,0 @@ -IN: dequeues -USING: help.markup help.syntax kernel ; - -ARTICLE: "dequeues" "Dequeues" -"A dequeue is a data structure with constant-time insertion and removal of elements at both ends. Dequeue operations are defined in the " { $vocab-link "dequeues" } " vocabulary." -$nl -"Dequeues must be instances of a mixin class:" -{ $subsection dequeue } -"Dequeues must implement a protocol." -$nl -"Querying the dequeue:" -{ $subsection peek-front } -{ $subsection peek-back } -{ $subsection dequeue-length } -{ $subsection dequeue-member? } -"Adding and removing elements:" -{ $subsection push-front* } -{ $subsection push-back* } -{ $subsection pop-front* } -{ $subsection pop-back* } -{ $subsection clear-dequeue } -"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 dequeue-empty? } -{ $subsection push-front } -{ $subsection push-all-front } -{ $subsection push-back } -{ $subsection push-all-back } -{ $subsection pop-front } -{ $subsection pop-back } -{ $subsection slurp-dequeue } -"When using a dequeue as a queue, the convention is to queue elements with " { $link push-front } " and dequeue them with " { $link pop-back } "." ; - -ABOUT: "dequeues" - -HELP: dequeue-empty? -{ $values { "dequeue" { $link dequeue } } { "?" "a boolean" } } -{ $description "Returns true if a dequeue is empty." } -{ $notes "This operation is O(1)." } ; - -HELP: push-front -{ $values { "obj" object } { "dequeue" dequeue } } -{ $description "Push the object onto the front of the dequeue." } -{ $notes "This operation is O(1)." } ; - -HELP: push-front* -{ $values { "obj" object } { "dequeue" dequeue } { "node" "a node" } } -{ $description "Push the object onto the front of the dequeue and return the newly created node." } -{ $notes "This operation is O(1)." } ; - -HELP: push-back -{ $values { "obj" object } { "dequeue" dequeue } } -{ $description "Push the object onto the back of the dequeue." } -{ $notes "This operation is O(1)." } ; - -HELP: push-back* -{ $values { "obj" object } { "dequeue" dequeue } { "node" "a node" } } -{ $description "Push the object onto the back of the dequeue and return the newly created node." } -{ $notes "This operation is O(1)." } ; - -HELP: peek-front -{ $values { "dequeue" dequeue } { "obj" object } } -{ $description "Returns the object at the front of the dequeue." } ; - -HELP: pop-front -{ $values { "dequeue" dequeue } { "obj" object } } -{ $description "Pop the object off the front of the dequeue and return the object." } -{ $notes "This operation is O(1)." } ; - -HELP: pop-front* -{ $values { "dequeue" dequeue } } -{ $description "Pop the object off the front of the dequeue." } -{ $notes "This operation is O(1)." } ; - -HELP: peek-back -{ $values { "dequeue" dequeue } { "obj" object } } -{ $description "Returns the object at the back of the dequeue." } ; - -HELP: pop-back -{ $values { "dequeue" dequeue } { "obj" object } } -{ $description "Pop the object off the back of the dequeue and return the object." } -{ $notes "This operation is O(1)." } ; - -HELP: pop-back* -{ $values { "dequeue" dequeue } } -{ $description "Pop the object off the back of the dequeue." } -{ $notes "This operation is O(1)." } ; diff --git a/basis/dequeues/dequeues.factor b/basis/dequeues/dequeues.factor deleted file mode 100644 index ae55c57fe5..0000000000 --- a/basis/dequeues/dequeues.factor +++ /dev/null @@ -1,43 +0,0 @@ -! Copyright (C) 2008 Slava Pestov. -! See http://factorcode.org/license.txt for BSD license. -USING: kernel sequences math ; -IN: dequeues - -GENERIC: push-front* ( obj dequeue -- node ) -GENERIC: push-back* ( obj dequeue -- node ) -GENERIC: peek-front ( dequeue -- obj ) -GENERIC: peek-back ( dequeue -- obj ) -GENERIC: pop-front* ( dequeue -- ) -GENERIC: pop-back* ( dequeue -- ) -GENERIC: delete-node ( node dequeue -- ) -GENERIC: dequeue-length ( dequeue -- n ) -GENERIC: dequeue-member? ( value dequeue -- ? ) -GENERIC: clear-dequeue ( dequeue -- ) -GENERIC: node-value ( node -- value ) - -: dequeue-empty? ( dequeue -- ? ) - dequeue-length zero? ; - -: push-front ( obj dequeue -- ) - push-front* drop ; - -: push-all-front ( seq dequeue -- ) - [ push-front ] curry each ; - -: push-back ( obj dequeue -- ) - push-back* drop ; - -: push-all-back ( seq dequeue -- ) - [ push-back ] curry each ; - -: pop-front ( dequeue -- obj ) - [ peek-front ] [ pop-front* ] bi ; - -: pop-back ( dequeue -- obj ) - [ peek-back ] [ pop-back* ] bi ; - -: slurp-dequeue ( dequeue quot -- ) - [ drop [ dequeue-empty? not ] curry ] - [ [ pop-back ] prepose curry ] 2bi [ ] while ; inline - -MIXIN: dequeue diff --git a/basis/dequeues/summary.txt b/basis/dequeues/summary.txt deleted file mode 100644 index 2f348ebb05..0000000000 --- a/basis/dequeues/summary.txt +++ /dev/null @@ -1 +0,0 @@ -Double-ended queue protocol and common operations diff --git a/basis/dequeues/tags.txt b/basis/dequeues/tags.txt deleted file mode 100644 index 42d711b32b..0000000000 --- a/basis/dequeues/tags.txt +++ /dev/null @@ -1 +0,0 @@ -collections diff --git a/basis/persistent/deques/deques-docs.factor b/basis/persistent/deques/deques-docs.factor index 56ee46a6a9..43018bed16 100644 --- a/basis/persistent/deques/deques-docs.factor +++ b/basis/persistent/deques/deques-docs.factor @@ -2,7 +2,7 @@ USING: help.markup help.syntax kernel sequences ; IN: persistent.deques ARTICLE: "persistent.deques" "Persistent deques" -"A deque is a data structure that can be used as both a queue and a stack. That is, there are two ends, the left and the right, and values can be pushed onto and popped off of both ends. These operations take O(1) amortized time and space in a normal usage pattern." +"A deque is a data structure that can be used as both a queue and a stack. That is, there are two ends, the front and the back, and values can be pushed onto and popped off of both ends. These operations take O(1) amortized time and space in a normal usage pattern." $nl "This vocabulary provides a deque implementation which is persistent and purely functional: old versions of deques are not modified by operations. Instead, each push and pop operation creates a new deque based off the old one." $nl @@ -14,10 +14,10 @@ $nl "To test if a deque is empty:" { $subsection deque-empty? } "To manipulate deques:" -{ $subsection push-left } -{ $subsection push-right } -{ $subsection pop-left } -{ $subsection pop-right } +{ $subsection push-front } +{ $subsection push-back } +{ $subsection pop-front } +{ $subsection pop-back } { $subsection deque>sequence } ; HELP: deque @@ -29,28 +29,28 @@ HELP: HELP: sequence>deque { $values { "sequence" sequence } { "deque" deque } } -{ $description "Given a sequence, creates a deque containing those elements in the order such that the beginning of the sequence is on the left and the end is on the right." } ; +{ $description "Given a sequence, creates a deque containing those elements in the order such that the beginning of the sequence is on the front and the end is on the back." } ; HELP: deque>sequence { $values { "deque" deque } { "sequence" sequence } } -{ $description "Given a deque, creates a sequence containing those elements, such that the left side of the deque is the beginning of the sequence." } ; +{ $description "Given a deque, creates a sequence containing those elements, such that the front side of the deque is the beginning of the sequence." } ; HELP: deque-empty? { $values { "deque" deque } { "?" "t/f" } } { $description "Returns true if the deque is empty. This takes constant time." } ; -HELP: push-left +HELP: push-front { $values { "deque" deque } { "item" object } { "newdeque" deque } } -{ $description "Creates a new deque with the given object pushed onto the left side. This takes constant time." } ; +{ $description "Creates a new deque with the given object pushed onto the front side. This takes constant time." } ; -HELP: push-right +HELP: push-back { $values { "deque" deque } { "item" object } { "newdeque" deque } } -{ $description "Creates a new deque with the given object pushed onto the right side. This takes constant time." } ; +{ $description "Creates a new deque with the given object pushed onto the back side. This takes constant time." } ; -HELP: pop-left +HELP: pop-front { $values { "deque" object } { "item" object } { "newdeque" deque } } -{ $description "Creates a new deque with the leftmost item removed. This takes amortized constant time with single-threaded access." } ; +{ $description "Creates a new deque with the frontmost item removed. This takes amortized constant time with single-threaded access." } ; -HELP: pop-right +HELP: pop-back { $values { "deque" object } { "item" object } { "newdeque" deque } } -{ $description "Creates a new deque with the rightmost item removed. This takes amortized constant time with single-threaded access." } ; +{ $description "Creates a new deque with the backmost item removed. This takes amortized constant time with single-threaded access." } ; diff --git a/basis/search-dequeues/authors.txt b/basis/search-dequeues/authors.txt deleted file mode 100644 index 1901f27a24..0000000000 --- a/basis/search-dequeues/authors.txt +++ /dev/null @@ -1 +0,0 @@ -Slava Pestov diff --git a/basis/search-dequeues/search-dequeues-docs.factor b/basis/search-dequeues/search-dequeues-docs.factor deleted file mode 100644 index de9e9f0084..0000000000 --- a/basis/search-dequeues/search-dequeues-docs.factor +++ /dev/null @@ -1,21 +0,0 @@ -IN: search-dequeues -USING: help.markup help.syntax kernel dlists hashtables -dequeues assocs ; - -ARTICLE: "search-dequeues" "Search dequeues" -"A search dequeue 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 dequeues implement all dequeue operations in terms of an underlying dequeue, and membership testing with " { $link dequeue-member? } " is implemented with an underlying assoc. Search dequeues are defined in the " { $vocab-link "search-dequeues" } " vocabulary." -$nl -"Creating a search dequeue:" -{ $subsection } -"Default implementation:" -{ $subsection } ; - -ABOUT: "search-dequeues" - -HELP: ( assoc dequeue -- search-dequeue ) -{ $values { "assoc" assoc } { "dequeue" dequeue } { "search-dequeue" search-dequeue } } -{ $description "Creates a new " { $link search-dequeue } "." } ; - -HELP: ( -- search-dequeue ) -{ $values { "search-dequeue" search-dequeue } } -{ $description "Creates a new " { $link search-dequeue } " backed by a " { $link dlist } ", with a " { $link hashtable } " for fast membership tests." } ; diff --git a/basis/search-dequeues/search-dequeues-tests.factor b/basis/search-dequeues/search-dequeues-tests.factor deleted file mode 100644 index acf929de46..0000000000 --- a/basis/search-dequeues/search-dequeues-tests.factor +++ /dev/null @@ -1,35 +0,0 @@ -IN: search-dequeues.tests -USING: search-dequeues tools.test namespaces -kernel sequences words dequeues vocabs ; - - "h" set - -[ t ] [ "h" get dequeue-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 dequeue-length ] unit-test -[ t ] [ 7 "h" get dequeue-member? ] unit-test - -[ 3 ] [ "1" get node-value ] unit-test -[ ] [ "1" get "h" get delete-node ] unit-test - -[ 2 ] [ "h" get dequeue-length ] unit-test -[ 1 ] [ "h" get pop-back ] unit-test -[ 7 ] [ "h" get pop-back ] unit-test - -[ f ] [ 7 "h" get dequeue-member? ] unit-test - -[ ] [ - - [ all-words swap [ push-front ] curry each ] - [ [ drop ] slurp-dequeue ] - bi -] unit-test diff --git a/basis/search-dequeues/search-dequeues.factor b/basis/search-dequeues/search-dequeues.factor deleted file mode 100644 index 87c997a3ac..0000000000 --- a/basis/search-dequeues/search-dequeues.factor +++ /dev/null @@ -1,53 +0,0 @@ -! Copyright (C) 2008 Slava Pestov. -! See http://factorcode.org/license.txt for BSD license. -USING: accessors kernel assocs dequeues dlists hashtables ; -IN: search-dequeues - -TUPLE: search-dequeue assoc dequeue ; - -C: search-dequeue - -: ( -- search-dequeue ) - 0 ; - -M: search-dequeue dequeue-length dequeue>> dequeue-length ; - -M: search-dequeue peek-front dequeue>> peek-front ; - -M: search-dequeue peek-back dequeue>> peek-back ; - -M: search-dequeue push-front* - 2dup assoc>> at* [ 2nip ] [ - drop - [ dequeue>> push-front* ] [ assoc>> ] 2bi - [ 2drop ] [ set-at ] 3bi - ] if ; - -M: search-dequeue push-back* - 2dup assoc>> at* [ 2nip ] [ - drop - [ dequeue>> push-back* ] [ assoc>> ] 2bi - [ 2drop ] [ set-at ] 3bi - ] if ; - -M: search-dequeue pop-front* - [ [ dequeue>> peek-front ] [ assoc>> ] bi delete-at ] - [ dequeue>> pop-front* ] - bi ; - -M: search-dequeue pop-back* - [ [ dequeue>> peek-back ] [ assoc>> ] bi delete-at ] - [ dequeue>> pop-back* ] - bi ; - -M: search-dequeue delete-node - [ dequeue>> delete-node ] - [ [ node-value ] [ assoc>> ] bi* delete-at ] 2bi ; - -M: search-dequeue clear-dequeue - [ dequeue>> clear-dequeue ] [ assoc>> clear-assoc ] bi ; - -M: search-dequeue dequeue-member? - assoc>> key? ; - -INSTANCE: search-dequeue dequeue diff --git a/basis/search-dequeues/summary.txt b/basis/search-dequeues/summary.txt deleted file mode 100644 index 9102bf2d58..0000000000 --- a/basis/search-dequeues/summary.txt +++ /dev/null @@ -1 +0,0 @@ -Double-ended queues with sub-linear membership testing diff --git a/basis/search-dequeues/tags.txt b/basis/search-dequeues/tags.txt deleted file mode 100644 index 42d711b32b..0000000000 --- a/basis/search-dequeues/tags.txt +++ /dev/null @@ -1 +0,0 @@ -collections