26 lines
		
	
	
		
			700 B
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			26 lines
		
	
	
		
			700 B
		
	
	
	
		
			Factor
		
	
	
|  | ! Copyright (C) 2005, 2008 Chris Double, Slava Pestov. | ||
|  | ! See http://factorcode.org/license.txt for BSD license. | ||
|  | USING: concurrency.mailboxes kernel continuations ;
 | ||
|  | IN: concurrency.promises | ||
|  | 
 | ||
|  | TUPLE: promise mailbox ;
 | ||
|  | 
 | ||
|  | : <promise> ( -- promise )
 | ||
|  |     <mailbox> promise boa ;
 | ||
|  | 
 | ||
|  | : promise-fulfilled? ( promise -- ? )
 | ||
|  |     promise-mailbox mailbox-empty? not ;
 | ||
|  | 
 | ||
|  | : fulfill ( value promise -- )
 | ||
|  |     dup promise-fulfilled? [  | ||
|  |         "Promise already fulfilled" throw
 | ||
|  |     ] [ | ||
|  |         promise-mailbox mailbox-put | ||
|  |     ] if ;
 | ||
|  | 
 | ||
|  | : ?promise-timeout ( promise timeout -- result )
 | ||
|  |     >r promise-mailbox r> block-if-empty mailbox-peek ;
 | ||
|  | 
 | ||
|  | : ?promise ( promise -- result )
 | ||
|  |     f ?promise-timeout ;
 |