57 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Factor
		
	
	
		
		
			
		
	
	
			57 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Factor
		
	
	
|  | ! Copyright (C) 2008 Alex Chapman | ||
|  | ! See http://factorcode.org/license.txt for BSD license. | ||
|  | USING: kernel semantic-db sequences sequences.lib splitting ;
 | ||
|  | IN: tangle.path | ||
|  | 
 | ||
|  | RELATION: has-filename | ||
|  | RELATION: in-directory | ||
|  | 
 | ||
|  | : create-root ( -- node ) "" create-node ;
 | ||
|  | 
 | ||
|  | : get-root ( -- node )
 | ||
|  |     in-directory-relation ultimate-objects ?1node-result ;
 | ||
|  | 
 | ||
|  | : ensure-root ( -- node ) get-root [ create-root ] unless* ;
 | ||
|  | 
 | ||
|  | : create-file ( parent name -- node )
 | ||
|  |     create-node swap dupd in-directory ;
 | ||
|  | 
 | ||
|  | : files-in-directory ( node -- nodes ) in-directory-subjects ;
 | ||
|  | 
 | ||
|  | : file-in-directory ( name node -- node )
 | ||
|  |     in-directory-relation subjects-with-cor ?1node-result ;
 | ||
|  | 
 | ||
|  | : parent-directory ( file-node -- dir-node )
 | ||
|  |     in-directory-objects ?first ;
 | ||
|  | 
 | ||
|  | : (path>node) ( node name -- node )
 | ||
|  |     swap [ file-in-directory ] [ drop f ] if* ;
 | ||
|  | 
 | ||
|  | : path>node ( path -- node )
 | ||
|  |     ensure-root swap [ (path>node) ] each ;
 | ||
|  | 
 | ||
|  | : path>file ( path -- file )
 | ||
|  |     path>node [ has-filename-subjects ?first ] [ f ] if* ;
 | ||
|  | 
 | ||
|  | : (node>path) ( root seq node -- seq )
 | ||
|  |     pick over node= [ | ||
|  |         drop nip
 | ||
|  |     ] [ | ||
|  |         dup node-content pick push
 | ||
|  |         parent-directory [ | ||
|  |             (node>path) | ||
|  |         ] [ | ||
|  |             2drop f
 | ||
|  |         ] if*
 | ||
|  |     ] if ;
 | ||
|  | 
 | ||
|  | : node>path* ( root node -- path )
 | ||
|  |     V{ } clone swap (node>path) dup empty?
 | ||
|  |     [ drop f ] [ <reversed> ] if ;
 | ||
|  | 
 | ||
|  | : node>path ( node -- path )
 | ||
|  |     ensure-root swap node>path* ;
 | ||
|  | 
 | ||
|  | : file>path ( node -- path )
 | ||
|  |     has-filename-objects ?first [ node>path ] [ f ] if* ;
 |