1 ! Copyright (C) 2007, 2009 Slava Pestov.
\r
2 ! See http://factorcode.org/license.txt for BSD license.
\r
3 USING: accessors arrays assocs combinators.short-circuit fry
\r
4 io.directories io.files io.files.types io.pathnames kernel make
\r
5 memoize namespaces sequences sorting splitting vocabs sets
\r
6 vocabs.loader vocabs.metadata vocabs.errors ;
\r
9 TUPLE: vocab-prefix name ;
\r
11 C: <vocab-prefix> vocab-prefix
\r
13 M: vocab-prefix vocab-name name>> ;
\r
17 : visible-dirs ( seq -- seq' )
\r
20 [ type>> +directory+ = ]
\r
21 [ name>> "." head? not ]
\r
25 : vocab-subdirs ( dir -- dirs )
\r
26 directory-entries visible-dirs [ name>> ] map! natural-sort ;
\r
28 : vocab-dir? ( root name -- ? )
\r
30 [ ".factor" append-vocab-dir append-path exists? ]
\r
34 ERROR: vocab-root-required root ;
\r
36 : ensure-vocab-root ( root -- root )
\r
37 dup vocab-roots get member? [ vocab-root-required ] unless ;
\r
39 : ensure-vocab-root/prefix ( root prefix -- root prefix )
\r
40 [ ensure-vocab-root ] [ check-vocab-name ] bi* ;
\r
42 : (disk-vocab-children) ( root prefix -- vocabs )
\r
44 [ vocab-dir append-path dup exists? [ vocab-subdirs ] [ drop { } ] if ]
\r
45 [ nip [ "." append '[ _ prepend ] map! ] unless-empty ]
\r
46 [ drop '[ _ over vocab-dir? [ >vocab-link ] [ <vocab-prefix> ] if ] map! ]
\r
49 : ((disk-vocabs-recursive)) ( root prefix -- )
\r
50 dupd vocab-name (disk-vocab-children) [ % ] keep
\r
51 [ ((disk-vocabs-recursive)) ] with each ;
\r
53 : (disk-vocabs-recursive) ( root prefix -- seq )
\r
54 [ ensure-vocab-root ] dip
\r
55 [ ((disk-vocabs-recursive)) ] { } make ;
\r
57 : no-rooted ( seq -- seq' ) [ find-vocab-root ] reject ;
\r
59 : one-level-only? ( name prefix -- ? )
\r
60 ?head [ "." split1 nip not ] [ drop f ] if ;
\r
62 : unrooted-disk-vocabs ( prefix -- seq )
\r
63 [ loaded-vocab-names no-rooted ] dip
\r
64 dup empty? [ CHAR: . suffix ] unless
\r
65 '[ vocab-name _ one-level-only? ] filter ;
\r
67 : unrooted-disk-vocabs-recursive ( prefix -- seq )
\r
68 loaded-child-vocab-names no-rooted ;
\r
72 : no-prefixes ( seq -- seq' ) [ vocab-prefix? ] reject ;
\r
74 : convert-prefixes ( seq -- seq' )
\r
75 [ dup vocab-prefix? [ name>> <vocab-link> ] when ] map ;
\r
77 : remove-redundant-prefixes ( seq -- seq' )
\r
79 [ vocab-prefix? ] partition
\r
81 [ vocab-name ] map fast-set
\r
82 '[ name>> _ in? ] reject
\r
87 : no-roots ( assoc -- seq ) values concat ;
\r
89 : filter-vocabs ( assoc -- seq )
\r
90 no-roots no-prefixes members ;
\r
92 : disk-vocabs-for-prefix ( prefix -- assoc )
\r
93 [ [ vocab-roots get ] dip '[ dup _ (disk-vocab-children) ] { } map>assoc ]
\r
94 [ unrooted-disk-vocabs [ lookup-vocab ] map! f swap 2array ]
\r
97 : all-disk-vocabs-by-root ( -- assoc )
\r
98 "" disk-vocabs-for-prefix ;
\r
100 : disk-vocabs-recursive-for-prefix ( prefix -- assoc )
\r
101 [ [ vocab-roots get ] dip '[ dup _ (disk-vocabs-recursive) ] { } map>assoc ]
\r
102 [ unrooted-disk-vocabs-recursive [ lookup-vocab ] map! f swap 2array ]
\r
105 MEMO: all-disk-vocabs-recursive ( -- assoc )
\r
106 "" disk-vocabs-recursive-for-prefix ;
\r
108 : all-disk-vocab-names ( -- seq )
\r
109 all-disk-vocabs-recursive filter-vocabs [ vocab-name ] map! ;
\r
111 : disk-child-vocab-names ( prefix -- seq )
\r
112 disk-vocabs-for-prefix filter-vocabs [ vocab-name ] map! ;
\r
116 : collect-vocabs ( quot -- seq )
\r
117 [ all-disk-vocabs-recursive filter-vocabs ] dip
\r
118 gather natural-sort ; inline
\r
120 : maybe-include-root/prefix ( root prefix -- vocab-link/f )
\r
122 [ find-vocab-root = ] keep swap
\r
124 nip dup find-vocab-root
\r
125 ] if [ >vocab-link ] [ drop f ] if ;
\r
129 : disk-vocabs-in-root/prefix ( root prefix -- seq )
\r
130 [ (disk-vocabs-recursive) ]
\r
131 [ maybe-include-root/prefix [ prefix ] when* ] 2bi ;
\r
133 : disk-vocabs-in-root ( root -- seq )
\r
134 "" disk-vocabs-in-root/prefix ;
\r
136 : (load-from-root) ( root prefix -- failures )
\r
137 disk-vocabs-in-root/prefix
\r
138 [ don't-load? ] reject no-prefixes
\r
141 : load-from-root ( root prefix -- )
\r
142 (load-from-root) load-failures. ;
\r
144 : load-root ( root -- )
\r
145 "" load-from-root ;
\r
147 : (load) ( prefix -- failures )
\r
148 [ vocab-roots get ] dip '[ _ (load-from-root) ] map concat ;
\r
150 : load ( prefix -- )
\r
151 (load) load-failures. ;
\r
156 MEMO: all-tags ( -- seq ) [ vocab-tags ] collect-vocabs ;
\r
158 MEMO: all-authors ( -- seq ) [ vocab-authors ] collect-vocabs ;
\r