| 
									
										
										
										
											2008-03-07 18:05:33 -05:00
										 |  |  | ! Copyright (C) 2008 Alex Chapman | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2008-03-20 16:30:59 -04:00
										 |  |  | USING: accessors assocs kernel sequences vectors ;
 | 
					
						
							| 
									
										
										
										
											2008-03-07 01:29:30 -05:00
										 |  |  | IN: digraphs | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | TUPLE: digraph ;
 | 
					
						
							|  |  |  | TUPLE: vertex value edges ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : <digraph> ( -- digraph )
 | 
					
						
							| 
									
										
										
										
											2008-04-13 16:06:27 -04:00
										 |  |  |     digraph new H{ } clone over set-delegate ;
 | 
					
						
							| 
									
										
										
										
											2008-03-07 01:29:30 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : <vertex> ( value -- vertex )
 | 
					
						
							| 
									
										
										
										
											2008-04-13 16:06:27 -04:00
										 |  |  |     V{ } clone vertex boa ;
 | 
					
						
							| 
									
										
										
										
											2008-03-07 01:29:30 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : add-vertex ( key value digraph -- )
 | 
					
						
							|  |  |  |     >r <vertex> swap r> set-at ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : children ( key digraph -- seq )
 | 
					
						
							|  |  |  |     at edges>> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : @edges ( from to digraph -- to edges ) swapd at edges>> ;
 | 
					
						
							|  |  |  | : add-edge ( from to digraph -- ) @edges push ;
 | 
					
						
							|  |  |  | : delete-edge ( from to digraph -- ) @edges delete ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : delete-to-edges ( to digraph -- )
 | 
					
						
							|  |  |  |     [ nip dupd edges>> delete ] assoc-each drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : delete-vertex ( key digraph -- )
 | 
					
						
							|  |  |  |     2dup delete-at delete-to-edges ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : unvisited? ( unvisited key -- ? ) swap key? ;
 | 
					
						
							|  |  |  | : visited ( unvisited key -- ) swap delete-at ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DEFER: (topological-sort) | 
					
						
							|  |  |  | : visit-children ( seq unvisited key -- seq unvisited )
 | 
					
						
							|  |  |  |     over children [ (topological-sort) ] each ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (topological-sort) ( seq unvisited key -- seq unvisited )
 | 
					
						
							|  |  |  |     2dup unvisited? [ | 
					
						
							|  |  |  |         [ visit-children ] keep 2dup visited pick push
 | 
					
						
							|  |  |  |     ] [ | 
					
						
							|  |  |  |         drop
 | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : topological-sort ( digraph -- seq )
 | 
					
						
							|  |  |  |     dup clone V{ } clone spin | 
					
						
							|  |  |  |     [ drop (topological-sort) ] assoc-each drop reverse ;
 | 
					
						
							| 
									
										
										
										
											2008-03-07 18:05:33 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : topological-sorted-values ( digraph -- seq )
 | 
					
						
							|  |  |  |     dup topological-sort swap [ at value>> ] curry map ;
 |