79 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Factor
		
	
	
! Copyright (C) 2008 Doug Coleman.
 | 
						|
! See http://factorcode.org/license.txt for BSD license.
 | 
						|
USING: combinators continuations fry io.backend io.directories
 | 
						|
io.directories.hierarchy io.pathnames kernel locals namespaces
 | 
						|
random.data sequences system vocabs ;
 | 
						|
IN: io.files.unique
 | 
						|
 | 
						|
<PRIVATE
 | 
						|
 | 
						|
HOOK: (touch-unique-file) io-backend ( path -- )
 | 
						|
 | 
						|
PRIVATE>
 | 
						|
 | 
						|
: touch-unique-file ( path -- )
 | 
						|
    normalize-path (touch-unique-file) ;
 | 
						|
 | 
						|
SYMBOL: unique-length
 | 
						|
SYMBOL: unique-retries
 | 
						|
 | 
						|
10 unique-length set-global
 | 
						|
10 unique-retries set-global
 | 
						|
 | 
						|
<PRIVATE
 | 
						|
 | 
						|
: random-file-name ( -- string )
 | 
						|
    unique-length get random-string ;
 | 
						|
 | 
						|
: retry ( quot: ( -- ? ) n -- )
 | 
						|
    iota swap [ drop ] prepose attempt-all ; inline
 | 
						|
 | 
						|
PRIVATE>
 | 
						|
 | 
						|
: unique-file ( prefix suffix -- path )
 | 
						|
    '[
 | 
						|
        _ _ random-file-name glue
 | 
						|
        dup touch-unique-file
 | 
						|
    ] unique-retries get retry absolute-path ;
 | 
						|
 | 
						|
: unique-files ( prefix suffixes -- paths )
 | 
						|
    '[
 | 
						|
        V{ } clone [
 | 
						|
            _ _ random-file-name '[
 | 
						|
                _ glue
 | 
						|
                dup touch-unique-file suffix!
 | 
						|
            ] with each { } like
 | 
						|
        ] [
 | 
						|
            [ [ delete-file ] each ] [ rethrow ] bi*
 | 
						|
        ] recover
 | 
						|
    ] unique-retries get retry [ absolute-path ] map ;
 | 
						|
 | 
						|
:: cleanup-unique-file ( ..a prefix suffix quot: ( ..a path -- ..b ) -- ..b )
 | 
						|
    prefix suffix unique-file :> path
 | 
						|
    [ path quot call ] [ path delete-file ] [ ] cleanup ; inline
 | 
						|
 | 
						|
:: cleanup-unique-files ( ..a prefix suffixes quot: ( ..a paths -- ..b ) -- ..b )
 | 
						|
    prefix suffixes unique-files :> paths
 | 
						|
    [ paths quot call ] [ paths [ delete-file ] each ] [ ] cleanup ; inline
 | 
						|
 | 
						|
: unique-directory ( -- path )
 | 
						|
    [
 | 
						|
        random-file-name
 | 
						|
        dup make-directory
 | 
						|
    ] unique-retries get retry absolute-path ;
 | 
						|
 | 
						|
:: with-unique-directory ( quot -- path )
 | 
						|
    unique-directory :> path
 | 
						|
    path quot with-directory
 | 
						|
    path ; inline
 | 
						|
 | 
						|
:: cleanup-unique-directory ( quot -- )
 | 
						|
    unique-directory :> path
 | 
						|
    [ path quot with-directory ]
 | 
						|
    [ path delete-tree ] [ ] cleanup ; inline
 | 
						|
 | 
						|
{
 | 
						|
    { [ os unix? ] [ "io.files.unique.unix" ] }
 | 
						|
    { [ os windows? ] [ "io.files.unique.windows" ] }
 | 
						|
} cond require
 |