| 
									
										
										
										
											2010-07-28 00:49:26 -04:00
										 |  |  | ! Copyright (C) 2008, 2010 Slava Pestov. | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2014-12-13 19:10:21 -05:00
										 |  |  | USING: accessors assocs combinators combinators.short-circuit | 
					
						
							|  |  |  | compiler.tree compiler.utilities kernel locals namespaces | 
					
						
							|  |  |  | sequences stack-checker.inlining ;
 | 
					
						
							| 
									
										
										
										
											2008-07-20 05:24:37 -04:00
										 |  |  | IN: compiler.tree.combinators | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-28 00:49:26 -04:00
										 |  |  | :: each-node ( ... nodes quot: ( ... node -- ... ) -- ... )
 | 
					
						
							|  |  |  |     nodes [ | 
					
						
							|  |  |  |         quot | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 { [ dup #branch? ] [ children>> [ quot each-node ] each ] } | 
					
						
							|  |  |  |                 { [ dup #recursive? ] [ child>> quot each-node ] } | 
					
						
							|  |  |  |                 { [ dup #alien-callback? ] [ child>> quot each-node ] } | 
					
						
							|  |  |  |                 [ drop ] | 
					
						
							|  |  |  |             } cond
 | 
					
						
							| 
									
										
										
										
											2008-07-27 21:25:42 -04:00
										 |  |  |         ] bi
 | 
					
						
							| 
									
										
										
										
											2008-07-30 04:38:10 -04:00
										 |  |  |     ] each ; inline recursive
 | 
					
						
							| 
									
										
										
										
											2008-07-27 23:47:40 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-28 00:49:26 -04:00
										 |  |  | :: map-nodes ( ... nodes quot: ( ... node -- ... node' ) -- ... nodes )
 | 
					
						
							|  |  |  |     nodes [ | 
					
						
							|  |  |  |         quot call
 | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             { [ dup #branch? ] [ [ [ quot map-nodes ] map ] change-children ] } | 
					
						
							|  |  |  |             { [ dup #recursive? ] [ [ quot map-nodes ] change-child ] } | 
					
						
							|  |  |  |             { [ dup #alien-callback? ] [ [ quot map-nodes ] change-child ] } | 
					
						
							|  |  |  |             [ ] | 
					
						
							|  |  |  |         } cond
 | 
					
						
							| 
									
										
										
										
											2008-12-06 12:17:19 -05:00
										 |  |  |     ] map-flat ; inline recursive
 | 
					
						
							| 
									
										
										
										
											2008-07-30 04:38:10 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-28 00:49:26 -04:00
										 |  |  | :: contains-node? ( ... nodes quot: ( ... node -- ... ? ) -- ... ? )
 | 
					
						
							|  |  |  |     nodes [ | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             quot | 
					
						
							|  |  |  |             [ | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     { [ dup #branch? ] [ children>> [ quot contains-node? ] any? ] } | 
					
						
							|  |  |  |                     { [ dup #recursive? ] [ child>> quot contains-node? ] } | 
					
						
							|  |  |  |                     { [ dup #alien-callback? ] [ child>> quot contains-node? ] } | 
					
						
							|  |  |  |                     [ drop f ] | 
					
						
							|  |  |  |                 } cond
 | 
					
						
							|  |  |  |             ] | 
					
						
							|  |  |  |         } 1|| | 
					
						
							| 
									
										
										
										
											2009-01-29 23:19:07 -05:00
										 |  |  |     ] any? ; inline recursive
 | 
					
						
							| 
									
										
										
										
											2008-07-30 04:38:10 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : select-children ( seq flags -- seq' )
 | 
					
						
							|  |  |  |     [ [ drop f ] unless ] 2map ;
 | 
					
						
							| 
									
										
										
										
											2008-08-01 21:04:36 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-19 22:48:08 -04:00
										 |  |  | : sift-children ( seq flags -- seq' )
 | 
					
						
							| 
									
										
										
										
											2012-08-24 01:36:10 -04:00
										 |  |  |     zip sift-values keys ;
 | 
					
						
							| 
									
										
										
										
											2008-08-19 22:48:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-09 02:38:10 -05:00
										 |  |  | : until-fixed-point ( ... #recursive quot: ( ... node -- ... ) -- ... )
 | 
					
						
							| 
									
										
										
										
											2008-08-02 00:31:43 -04:00
										 |  |  |     over label>> t >>fixed-point drop
 | 
					
						
							|  |  |  |     [ with-scope ] 2keep
 | 
					
						
							| 
									
										
										
										
											2015-08-10 13:55:27 -04:00
										 |  |  |     over label>> fixed-point>> | 
					
						
							|  |  |  |     [ 2drop ] [ until-fixed-point ] if ; inline recursive
 |