Deque name change

db4
Daniel Ehrenberg 2008-08-19 21:06:20 +02:00
parent 87610f24dc
commit 1c13a6a4b9
28 changed files with 314 additions and 63 deletions

View File

@ -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 ;

View File

@ -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

View File

@ -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 -- ? )

View File

@ -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 ]

View File

@ -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" ] [
[

1
basis/deques/authors.txt Normal file
View File

@ -0,0 +1 @@
Slava Pestov

View File

@ -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)." } ;

View File

@ -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

1
basis/deques/summary.txt Normal file
View File

@ -0,0 +1 @@
Double-ended queue protocol and common operations

1
basis/deques/tags.txt Normal file
View File

@ -0,0 +1 @@
collections

View File

@ -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 }

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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" }

View File

@ -0,0 +1 @@
Slava Pestov

View File

@ -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." } ;

View File

@ -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

View File

@ -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

View File

@ -0,0 +1 @@
Double-ended queues with sub-linear membership testing

View File

@ -0,0 +1 @@
collections

View File

@ -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 } }

View File

@ -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)

4
checksums.txt Normal file
View File

@ -0,0 +1,4 @@
boot.x86.32.image 07cd1d5506e508e8054d22f03cd0e63b
boot.x86.64.image 4e99cd0902df35bbef4d1ad30559d911
boot.linux-ppc.image 2188d87eb2920b7f34b5c6f2ddf7bd27
boot.macosx-ppc.image 37e05c8b04df0386032959bdbd9dc9cc

View File

@ -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 ;

View File

@ -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 ;

View File

@ -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

View File

@ -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 ;