| 
									
										
										
										
											2010-01-30 23:39:43 -05:00
										 |  |  | ! Copyright (C) 2008 Slava Pestov. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2013-11-21 17:52:38 -05:00
										 |  |  | USING: arrays assocs combinators concurrency.count-downs | 
					
						
							| 
									
										
										
										
											2013-10-12 14:03:46 -04:00
										 |  |  | concurrency.futures fry generalizations kernel macros sequences | 
					
						
							|  |  |  | sequences.private sequences.product ;
 | 
					
						
							| 
									
										
										
										
											2010-01-30 23:39:43 -05:00
										 |  |  | IN: concurrency.combinators | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (parallel-each) ( n quot -- )
 | 
					
						
							|  |  |  |     [ <count-down> ] dip keep await ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 13:45:15 -04:00
										 |  |  | : parallel-each ( seq quot: ( elt -- ) -- )
 | 
					
						
							| 
									
										
										
										
											2010-01-30 23:39:43 -05:00
										 |  |  |     over length [ | 
					
						
							|  |  |  |         '[ _ curry _ spawn-stage ] each
 | 
					
						
							|  |  |  |     ] (parallel-each) ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 13:45:15 -04:00
										 |  |  | : 2parallel-each ( seq1 seq2 quot: ( elt1 elt2 -- ) -- )
 | 
					
						
							| 
									
										
										
										
											2010-01-30 23:39:43 -05:00
										 |  |  |     2over min-length [ | 
					
						
							|  |  |  |         '[ _ 2curry _ spawn-stage ] 2each
 | 
					
						
							|  |  |  |     ] (parallel-each) ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 14:03:46 -04:00
										 |  |  | : parallel-product-each ( seq quot: ( elt -- ) -- )
 | 
					
						
							|  |  |  |     [ <product-sequence> ] dip parallel-each ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : parallel-cartesian-each ( seq1 seq2 quot: ( elt1 elt2 -- ) -- )
 | 
					
						
							|  |  |  |     [ 2array ] dip [ first2-unsafe ] prepose parallel-product-each ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 13:45:15 -04:00
										 |  |  | : parallel-filter ( seq quot: ( elt -- ? ) -- newseq )
 | 
					
						
							| 
									
										
										
										
											2010-01-30 23:39:43 -05:00
										 |  |  |     over [ selector [ parallel-each ] dip ] dip like ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : [future] ( quot -- quot' ) '[ _ curry future ] ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : future-values ( futures -- futures )
 | 
					
						
							|  |  |  |     [ ?future ] map! ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 13:45:15 -04:00
										 |  |  | : parallel-map ( seq quot: ( elt -- newelt ) -- newseq )
 | 
					
						
							| 
									
										
										
										
											2010-01-30 23:39:43 -05:00
										 |  |  |     [future] map future-values ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-21 17:52:38 -05:00
										 |  |  | : parallel-assoc-map-as ( assoc quot: ( key value -- newkey newvalue ) exemplar -- newassoc )
 | 
					
						
							|  |  |  |     [ | 
					
						
							|  |  |  |         [ 2array ] compose '[ _ 2curry future ] { } assoc>map future-values | 
					
						
							|  |  |  |     ] dip assoc-like ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : parallel-assoc-map ( assoc quot: ( key value -- newkey newvalue ) -- newassoc )
 | 
					
						
							|  |  |  |     over parallel-assoc-map-as ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 14:03:46 -04:00
										 |  |  | : 2parallel-map ( seq1 seq2 quot: ( elt1 elt2 -- newelt ) -- newseq )
 | 
					
						
							|  |  |  |     '[ _ 2curry future ] 2map future-values ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 13:45:15 -04:00
										 |  |  | : parallel-product-map ( seq quot: ( elt -- newelt ) -- newseq )
 | 
					
						
							|  |  |  |     [ <product-sequence> ] dip parallel-map ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-12 14:03:46 -04:00
										 |  |  | : parallel-cartesian-map ( seq1 seq2 quot: ( elt1 elt2 -- newelt ) -- newseq )
 | 
					
						
							|  |  |  |     [ 2array ] dip [ first2-unsafe ] prepose parallel-product-map ;
 | 
					
						
							| 
									
										
										
										
											2010-01-30 23:39:43 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (parallel-spread) ( n -- spread-array )
 | 
					
						
							|  |  |  |     [ ?future ] <repetition> ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (parallel-cleave) ( quots -- quot-array spread-array )
 | 
					
						
							|  |  |  |     [ [future] ] map dup length (parallel-spread) ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-19 01:16:11 -04:00
										 |  |  | MACRO: parallel-cleave ( quots -- quot )
 | 
					
						
							| 
									
										
										
										
											2010-01-30 23:39:43 -05:00
										 |  |  |     (parallel-cleave) '[ _ cleave _ spread ] ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-19 01:16:11 -04:00
										 |  |  | MACRO: parallel-spread ( quots -- quot )
 | 
					
						
							| 
									
										
										
										
											2010-01-30 23:39:43 -05:00
										 |  |  |     (parallel-cleave) '[ _ spread _ spread ] ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-19 01:16:11 -04:00
										 |  |  | MACRO: parallel-napply ( quot n -- quot )
 | 
					
						
							| 
									
										
										
										
											2010-01-30 23:39:43 -05:00
										 |  |  |     [ [future] ] dip dup (parallel-spread) '[ _ _ napply _ spread ] ;
 |