]> gitweb.factorcode.org Git - factor.git/blob - extra/concurrency/count-downs/count-downs.factor
Merge branch 'master' of git://factorcode.org/git/factor
[factor.git] / extra / concurrency / count-downs / count-downs.factor
1 ! Copyright (C) 2008 Slava Pestov.\r
2 ! See http://factorcode.org/license.txt for BSD license.\r
3 USING: dlists kernel math concurrency.promises\r
4 concurrency.mailboxes debugger accessors ;\r
5 IN: concurrency.count-downs\r
6 \r
7 ! http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CountDownLatch.html\r
8 \r
9 TUPLE: count-down n promise ;\r
10 \r
11 : count-down-check ( count-down -- )\r
12     dup n>> zero? [ t swap promise>> fulfill ] [ drop ] if ;\r
13 \r
14 : <count-down> ( n -- count-down )\r
15     dup 0 < [ "Invalid count for count down" throw ] when\r
16     <promise> \ count-down boa\r
17     dup count-down-check ;\r
18 \r
19 : count-down ( count-down -- )\r
20     dup n>> dup zero?\r
21     [ "Count down already done" throw ]\r
22     [ 1- >>n count-down-check ] if ;\r
23 \r
24 : await-timeout ( count-down timeout -- )\r
25     >r promise>> r> ?promise-timeout ?linked t assert= ;\r
26 \r
27 : await ( count-down -- )\r
28     f await-timeout ;\r
29 \r
30 : spawn-stage ( quot count-down -- )\r
31     [ [ count-down ] curry compose ] keep\r
32     "Count down stage"\r
33     swap promise>> mailbox>> spawn-linked-to drop ;\r