| 
									
										
										
										
											2008-11-06 20:09:51 -05:00
										 |  |  | ! Copyright (C) 2005 Chris Double, 2007 Clemens Hofreither, 2008 James Cash. | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2008-09-10 23:11:40 -04:00
										 |  |  | USING: kernel hashtables namespaces make continuations quotations | 
					
						
							| 
									
										
										
										
											2008-08-31 03:51:43 -04:00
										 |  |  | accessors ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | IN: coroutines | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SYMBOL: current-coro | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-11-06 20:01:31 -05:00
										 |  |  | TUPLE: coroutine resumecc exitcc originalcc ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : cocreate ( quot -- co )
 | 
					
						
							| 
									
										
										
										
											2008-04-13 16:06:27 -04:00
										 |  |  |   coroutine new
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |   dup current-coro associate | 
					
						
							|  |  |  |   [ swapd , , \ bind ,  | 
					
						
							|  |  |  |     "Coroutine has terminated illegally." , \ throw , | 
					
						
							|  |  |  |   ] [ ] make | 
					
						
							| 
									
										
										
										
											2008-11-06 20:01:31 -05:00
										 |  |  |   [ >>resumecc ] [ >>originalcc ] bi ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : coresume ( v co -- result )
 | 
					
						
							|  |  |  |   [  | 
					
						
							| 
									
										
										
										
											2008-08-31 03:51:43 -04:00
										 |  |  |     >>exitcc | 
					
						
							|  |  |  |     resumecc>> call
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     #! At this point, the coroutine quotation must have terminated | 
					
						
							| 
									
										
										
										
											2008-11-11 02:31:37 -05:00
										 |  |  |     #! normally (without calling coyield, coreset, or coterminate). This shouldn't happen. | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     f over
 | 
					
						
							|  |  |  |   ] callcc1 2nip ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : coresume* ( v co -- ) coresume drop ; inline
 | 
					
						
							|  |  |  | : *coresume ( co -- result ) f swap coresume ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : coyield ( v -- result )
 | 
					
						
							|  |  |  |   current-coro get
 | 
					
						
							|  |  |  |   [   | 
					
						
							|  |  |  |     [ continue-with ] curry
 | 
					
						
							| 
									
										
										
										
											2008-08-31 03:51:43 -04:00
										 |  |  |     >>resumecc | 
					
						
							|  |  |  |     exitcc>> continue-with
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |   ] callcc1 2nip ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : coyield* ( v -- ) coyield drop ; inline
 | 
					
						
							|  |  |  | : *coyield ( -- v ) f coyield ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : coterminate ( v -- )
 | 
					
						
							|  |  |  |   current-coro get
 | 
					
						
							| 
									
										
										
										
											2008-08-31 03:51:43 -04:00
										 |  |  |   [ ] >>resumecc | 
					
						
							|  |  |  |   exitcc>> continue-with ;
 | 
					
						
							| 
									
										
										
										
											2008-11-06 20:01:31 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : coreset ( v --  )
 | 
					
						
							|  |  |  |   current-coro get dup
 | 
					
						
							|  |  |  |   originalcc>> >>resumecc | 
					
						
							|  |  |  |   exitcc>> continue-with ;
 |