1 ! Copyright (C) 2007, 2009 Slava Pestov.
\r
2 ! See http://factorcode.org/license.txt for BSD license.
\r
3 USING: arrays assocs combinators.short-circuit fry
\r
4 io.directories io.files io.files.info io.pathnames kernel make
\r
5 memoize namespaces sequences sorting splitting vocabs sets
\r
6 vocabs.loader vocabs.metadata vocabs.errors ;
\r
11 : vocab-subdirs ( dir -- dirs )
\r
14 { [ link-info directory? ] [ "." head? not ] } 1&&
\r
16 ] with-directory-files natural-sort ;
\r
18 : (all-child-vocabs) ( root name -- vocabs )
\r
20 vocab-dir append-path dup exists?
\r
21 [ vocab-subdirs ] [ drop { } ] if
\r
23 [ '[ [ _ "." ] dip 3append ] map ] unless-empty ;
\r
25 : vocab-dir? ( root name -- ? )
\r
27 [ ".factor" vocab-dir+ append-path exists? ]
\r
31 : vocabs-in-dir ( root name -- )
\r
32 dupd (all-child-vocabs) [
\r
33 2dup vocab-dir? [ dup >vocab-link , ] when
\r
39 : all-vocabs ( -- assoc )
\r
41 dup [ "" vocabs-in-dir ] { } make
\r
44 : all-vocabs-under ( prefix -- vocabs )
\r
46 [ vocab-roots get ] dip '[ _ vocabs-in-dir ] each
\r
49 MEMO: all-vocabs-seq ( -- seq )
\r
50 "" all-vocabs-under ;
\r
54 : unrooted-child-vocabs ( prefix -- seq )
\r
55 dup empty? [ CHAR: . suffix ] unless
\r
57 [ find-vocab-root not ] filter
\r
59 vocab-name swap ?head CHAR: . rot member? not and
\r
65 : all-child-vocabs ( prefix -- assoc )
\r
67 dup pick (all-child-vocabs) [ >vocab-link ] map
\r
69 swap unrooted-child-vocabs f swap 2array suffix ;
\r
71 : all-child-vocabs-seq ( prefix -- assoc )
\r
72 vocab-roots get swap '[
\r
73 dup _ (all-child-vocabs)
\r
74 [ vocab-dir? ] with filter
\r
79 : filter-unportable ( seq -- seq' )
\r
80 [ vocab-name unportable? not ] filter ;
\r
84 : (load) ( prefix -- failures )
\r
89 : load ( prefix -- )
\r
90 (load) load-failures. ;
\r
95 MEMO: all-tags ( -- seq )
\r
96 all-vocabs-seq [ vocab-tags ] gather natural-sort ;
\r
98 MEMO: all-authors ( -- seq )
\r
99 all-vocabs-seq [ vocab-authors ] gather natural-sort ;