]> gitweb.factorcode.org Git - factor.git/blob - extra/forestdb/paths/paths.factor
core, basis, extra: Remove DOS line endings from files.
[factor.git] / extra / forestdb / paths / paths.factor
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 ;
6 QUALIFIED: sets
7 IN: forestdb.paths
8
9 CONSTANT: fdb-filename-base "fq"
10
11 : fdb-filename? ( path -- ? )
12     "." split {
13         [ length 3 = ]
14         [ second fdb-filename-base = ]
15         [ first string>number ]
16         [ third string>number ]
17     } 1&& ;
18
19 ERROR: not-an-fdb-filename string ;
20
21 : ensure-fdb-filename ( string -- string )
22     dup fdb-filename? [ not-an-fdb-filename ] unless ;
23
24 ERROR: not-a-string-number string ;
25
26 : ?string>number ( string -- n )
27     dup string>number dup [ nip ] [ not-a-string-number ] if ;
28
29 : change-string-number ( string quot -- string' )
30     [ [ string>number ] dip call number>string ] 2keep drop
31     length CHAR: 0 pad-head ; inline
32
33 : next-vnode-name ( string -- string' )
34     [
35         "." split
36         first [ 1 + ] change-string-number
37         "." fdb-filename-base ".0"
38     ] "" append-outputs-as ;
39
40 : trim-head-zeros ( string -- string' )
41     [ CHAR: 0 = ] trim-head 1 CHAR: 0 pad-head ;
42
43 : canonical-fdb-name ( string -- string' )
44     ensure-fdb-filename
45     "." split first3
46     [ trim-head-zeros ]
47     [ ]
48     [ trim-head-zeros ] tri* 3array "." join ;
49
50 : next-vnode-version-name ( string -- string' )
51     "." split
52     [ but-last "." join ]
53     [ last [ 1 + ] change-string-number ] bi "." glue ;
54
55 : path>next-vnode-path ( path -- path' )
56     dup directory-files
57     [ fdb-filename? ] filter
58     [ human<=> ] sort [
59         fdb-filename-base "0." ".0" surround append-path
60     ] [
61         last "." split first [ 1 + ] change-string-number
62         ".fq.0" append append-path
63     ] if-empty ;
64
65 : path-has-fdb? ( path -- ? )
66     directory-files [ fdb-filename? ] filter length 0 > ;
67
68 : path-only-fdb? ( path -- ? )
69     directory-files
70     [ length ]
71     [ [ fdb-filename? ] filter length ] bi = ;
72
73 : path-fdb-duplicates ( path -- seq )
74     directory-files [ canonical-fdb-name ] map sets:members ;
75
76 : ensure-fdb-directory ( filename -- filename )
77     [ make-directories ] keep ;
78
79 : ensure-fdb-filename-directory ( filename -- filename )
80     [ parent-directory make-directories ] keep ;
81
82 ! : path>next-vnode-version-name ( path -- path' )
83     ! [ file-name ]