1 ! Copyright (C) 2014 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: arrays combinators.short-circuit combinators.smart
4 io.directories io.pathnames kernel math math.parser sequences
5 sorting sorting.human splitting ;
9 CONSTANT: fdb-filename-base "fq"
11 : fdb-filename? ( path -- ? )
14 [ second fdb-filename-base = ]
15 [ first string>number ]
16 [ third string>number ]
19 ERROR: not-an-fdb-filename string ;
21 : ensure-fdb-filename ( string -- string )
22 dup fdb-filename? [ not-an-fdb-filename ] unless ;
24 ERROR: not-a-string-number string ;
26 : ?string>number ( string -- n )
27 dup string>number dup [ nip ] [ not-a-string-number ] if ;
29 : change-string-number ( string quot -- string' )
30 [ [ string>number ] dip call number>string ] 2keep drop
31 length CHAR: 0 pad-head ; inline
33 : next-vnode-name ( string -- string' )
36 first [ 1 + ] change-string-number
37 "." fdb-filename-base ".0"
38 ] "" append-outputs-as ;
40 : trim-head-zeros ( string -- string' )
41 [ CHAR: 0 = ] trim-head 1 CHAR: 0 pad-head ;
43 : canonical-fdb-name ( string -- string' )
48 [ trim-head-zeros ] tri* 3array "." join ;
50 : next-vnode-version-name ( string -- string' )
53 [ last [ 1 + ] change-string-number ] bi "." glue ;
55 : path>next-vnode-path ( path -- path' )
57 [ fdb-filename? ] filter
59 fdb-filename-base "0." ".0" surround append-path
61 last "." split first [ 1 + ] change-string-number
62 ".fq.0" append append-path
65 : path-has-fdb? ( path -- ? )
66 directory-files [ fdb-filename? ] filter length 0 > ;
68 : path-only-fdb? ( path -- ? )
71 [ [ fdb-filename? ] filter length ] bi = ;
73 : path-fdb-duplicates ( path -- seq )
74 directory-files [ canonical-fdb-name ] map sets:members ;
76 : ensure-fdb-directory ( filename -- filename )
77 [ make-directories ] keep ;
79 : ensure-fdb-filename-directory ( filename -- filename )
80 [ parent-directory make-directories ] keep ;
82 ! : path>next-vnode-version-name ( path -- path' )