Deque name change
parent
87610f24dc
commit
1c13a6a4b9
|
@ -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 ;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 -- ? )
|
||||
|
|
|
@ -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 ;
|
|||
<dlist> <dlist> f mailbox boa ;
|
||||
|
||||
: mailbox-empty? ( mailbox -- bool )
|
||||
data>> dequeue-empty? ;
|
||||
data>> deque-empty? ;
|
||||
|
||||
: mailbox-put ( obj mailbox -- )
|
||||
[ data>> push-front ]
|
||||
|
|
|
@ -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" ] [
|
||||
[
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Slava Pestov
|
|
@ -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)." } ;
|
|
@ -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
|
|
@ -0,0 +1 @@
|
|||
Double-ended queue protocol and common operations
|
|
@ -0,0 +1 @@
|
|||
collections
|
|
@ -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 }
|
||||
|
|
|
@ -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
|
||||
[ 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> 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
|
||||
[ 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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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" }
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Slava Pestov
|
|
@ -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." } ;
|
|
@ -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
|
|
@ -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
|
|
@ -0,0 +1 @@
|
|||
Double-ended queues with sub-linear membership testing
|
|
@ -0,0 +1 @@
|
|||
collections
|
|
@ -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 } }
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
boot.x86.32.image 07cd1d5506e508e8054d22f03cd0e63b
|
||||
boot.x86.64.image 4e99cd0902df35bbef4d1ad30559d911
|
||||
boot.linux-ppc.image 2188d87eb2920b7f34b5c6f2ddf7bd27
|
||||
boot.macosx-ppc.image 37e05c8b04df0386032959bdbd9dc9cc
|
|
@ -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 ;
|
||||
|
|
|
@ -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 ;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 ;
|
||||
|
|
Loading…
Reference in New Issue