2009-05-04 07:44:17 -04:00
|
|
|
! Copyright (C) 2007, 2009 Slava Pestov.
|
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2009-07-06 05:23:26 -04:00
|
|
|
USING: accessors arrays assocs combinators.short-circuit fry
|
2009-05-04 07:44:17 -04:00
|
|
|
io.directories io.files io.files.info io.pathnames kernel make
|
|
|
|
memoize namespaces sequences sorting splitting vocabs sets
|
|
|
|
vocabs.loader vocabs.metadata vocabs.errors ;
|
2009-07-06 05:23:26 -04:00
|
|
|
RENAME: child-vocabs vocabs => vocabs:child-vocabs
|
2009-05-04 07:44:17 -04:00
|
|
|
IN: vocabs.hierarchy
|
|
|
|
|
2009-07-06 05:23:26 -04:00
|
|
|
TUPLE: vocab-prefix name ;
|
|
|
|
|
|
|
|
C: <vocab-prefix> vocab-prefix
|
|
|
|
|
|
|
|
M: vocab-prefix vocab-name name>> ;
|
|
|
|
|
2009-05-04 07:44:17 -04:00
|
|
|
<PRIVATE
|
|
|
|
|
|
|
|
: vocab-subdirs ( dir -- dirs )
|
|
|
|
[
|
|
|
|
[
|
|
|
|
{ [ link-info directory? ] [ "." head? not ] } 1&&
|
|
|
|
] filter
|
|
|
|
] with-directory-files natural-sort ;
|
|
|
|
|
|
|
|
: vocab-dir? ( root name -- ? )
|
|
|
|
over
|
2011-10-23 20:05:22 -04:00
|
|
|
[ ".factor" append-vocab-dir append-path exists? ]
|
2009-05-04 07:44:17 -04:00
|
|
|
[ 2drop f ]
|
|
|
|
if ;
|
|
|
|
|
2011-10-23 20:05:22 -04:00
|
|
|
ERROR: vocab-root-required root ;
|
|
|
|
|
|
|
|
: ensure-vocab-root ( root -- root )
|
|
|
|
dup vocab-roots get member? [ vocab-root-required ] unless ;
|
|
|
|
|
|
|
|
: ensure-vocab-root/prefix ( root prefix -- root prefix )
|
2011-10-29 02:39:40 -04:00
|
|
|
[ ensure-vocab-root ] [ check-vocab-name ] bi* ;
|
2011-10-23 20:05:22 -04:00
|
|
|
|
2009-07-06 05:23:26 -04:00
|
|
|
: (child-vocabs) ( root prefix -- vocabs )
|
2012-07-15 19:17:29 -04:00
|
|
|
check-vocab-name
|
2012-08-10 18:01:37 -04:00
|
|
|
[
|
|
|
|
dup ".private" tail? [ 2drop { } ] [
|
|
|
|
vocab-dir append-path dup exists?
|
|
|
|
[ vocab-subdirs ] [ drop { } ] if
|
|
|
|
] if
|
|
|
|
]
|
2012-07-15 18:48:39 -04:00
|
|
|
[ nip [ "." append '[ _ prepend ] map! ] unless-empty ]
|
|
|
|
[ drop '[ _ over vocab-dir? [ >vocab-link ] [ <vocab-prefix> ] if ] map! ]
|
2009-07-06 05:23:26 -04:00
|
|
|
2tri ;
|
2009-05-04 07:44:17 -04:00
|
|
|
|
2011-10-23 20:05:22 -04:00
|
|
|
: ((child-vocabs-recursive)) ( root prefix -- )
|
2012-07-15 18:48:39 -04:00
|
|
|
dupd vocab-name (child-vocabs) [ % ] keep
|
|
|
|
[ ((child-vocabs-recursive)) ] with each ;
|
2009-05-04 07:44:17 -04:00
|
|
|
|
2011-10-23 20:05:22 -04:00
|
|
|
: (child-vocabs-recursive) ( root prefix -- seq )
|
2012-07-15 19:17:29 -04:00
|
|
|
[ ensure-vocab-root ] dip
|
2009-07-06 05:23:26 -04:00
|
|
|
[ ((child-vocabs-recursive)) ] { } make ;
|
2009-05-04 07:44:17 -04:00
|
|
|
|
2009-07-06 05:23:26 -04:00
|
|
|
: no-rooted ( seq -- seq' ) [ find-vocab-root not ] filter ;
|
2009-05-04 07:44:17 -04:00
|
|
|
|
2009-07-06 05:23:26 -04:00
|
|
|
: one-level-only? ( name prefix -- ? )
|
2012-07-15 18:48:39 -04:00
|
|
|
?head [ "." split1 nip not ] [ drop f ] if ;
|
2009-05-04 07:44:17 -04:00
|
|
|
|
|
|
|
: unrooted-child-vocabs ( prefix -- seq )
|
2009-07-06 05:23:26 -04:00
|
|
|
[ vocabs no-rooted ] dip
|
2009-05-04 07:44:17 -04:00
|
|
|
dup empty? [ CHAR: . suffix ] unless
|
2009-07-06 05:23:26 -04:00
|
|
|
'[ vocab-name _ one-level-only? ] filter ;
|
|
|
|
|
|
|
|
: unrooted-child-vocabs-recursive ( prefix -- seq )
|
|
|
|
vocabs:child-vocabs no-rooted ;
|
2009-05-04 07:44:17 -04:00
|
|
|
|
|
|
|
PRIVATE>
|
|
|
|
|
2009-07-06 05:23:26 -04:00
|
|
|
: no-prefixes ( seq -- seq' ) [ vocab-prefix? not ] filter ;
|
|
|
|
|
2009-07-06 05:55:23 -04:00
|
|
|
: convert-prefixes ( seq -- seq' )
|
|
|
|
[ dup vocab-prefix? [ name>> vocab-link boa ] when ] map ;
|
|
|
|
|
|
|
|
: remove-redundant-prefixes ( seq -- seq' )
|
|
|
|
#! Hack.
|
|
|
|
[ vocab-prefix? ] partition
|
|
|
|
[
|
2010-02-28 22:55:22 -05:00
|
|
|
[ vocab-name ] map fast-set
|
|
|
|
'[ name>> _ in? not ] filter
|
2009-07-06 05:55:23 -04:00
|
|
|
convert-prefixes
|
|
|
|
] keep
|
|
|
|
append ;
|
|
|
|
|
2009-07-06 05:23:26 -04:00
|
|
|
: no-roots ( assoc -- seq ) values concat ;
|
2009-05-04 07:44:17 -04:00
|
|
|
|
2011-10-23 20:05:22 -04:00
|
|
|
: filter-vocabs ( assoc -- seq )
|
|
|
|
no-roots no-prefixes members ;
|
|
|
|
|
2009-07-06 05:23:26 -04:00
|
|
|
: child-vocabs ( prefix -- assoc )
|
|
|
|
[ [ vocab-roots get ] dip '[ dup _ (child-vocabs) ] { } map>assoc ]
|
2012-07-15 18:48:39 -04:00
|
|
|
[ unrooted-child-vocabs [ lookup-vocab ] map! f swap 2array ]
|
2009-07-06 05:23:26 -04:00
|
|
|
bi suffix ;
|
|
|
|
|
|
|
|
: all-vocabs ( -- assoc )
|
|
|
|
"" child-vocabs ;
|
|
|
|
|
|
|
|
: child-vocabs-recursive ( prefix -- assoc )
|
|
|
|
[ [ vocab-roots get ] dip '[ dup _ (child-vocabs-recursive) ] { } map>assoc ]
|
2012-07-15 18:48:39 -04:00
|
|
|
[ unrooted-child-vocabs-recursive [ lookup-vocab ] map! f swap 2array ]
|
2009-07-06 05:23:26 -04:00
|
|
|
bi suffix ;
|
|
|
|
|
|
|
|
MEMO: all-vocabs-recursive ( -- assoc )
|
|
|
|
"" child-vocabs-recursive ;
|
|
|
|
|
|
|
|
: all-vocab-names ( -- seq )
|
2012-07-15 18:48:39 -04:00
|
|
|
all-vocabs-recursive filter-vocabs [ vocab-name ] map! ;
|
2009-05-04 07:44:17 -04:00
|
|
|
|
2009-07-06 05:55:23 -04:00
|
|
|
: child-vocab-names ( prefix -- seq )
|
2012-07-15 18:48:39 -04:00
|
|
|
child-vocabs filter-vocabs [ vocab-name ] map! ;
|
2009-07-06 05:55:23 -04:00
|
|
|
|
2009-05-04 07:44:17 -04:00
|
|
|
<PRIVATE
|
|
|
|
|
2009-07-06 05:23:26 -04:00
|
|
|
: collect-vocabs ( quot -- seq )
|
2011-10-23 20:05:22 -04:00
|
|
|
[ all-vocabs-recursive filter-vocabs ] dip
|
2009-07-06 05:23:26 -04:00
|
|
|
gather natural-sort ; inline
|
|
|
|
|
2011-10-23 20:05:22 -04:00
|
|
|
: maybe-include-root/prefix ( root prefix -- vocab-link/f )
|
|
|
|
over [
|
|
|
|
[ find-vocab-root = ] keep swap
|
|
|
|
] [
|
|
|
|
nip dup find-vocab-root
|
|
|
|
] if [ >vocab-link ] [ drop f ] if ;
|
|
|
|
|
2009-05-04 07:44:17 -04:00
|
|
|
PRIVATE>
|
|
|
|
|
2011-10-23 20:05:22 -04:00
|
|
|
: vocabs-in-root/prefix ( root prefix -- seq )
|
|
|
|
[ (child-vocabs-recursive) ]
|
|
|
|
[ maybe-include-root/prefix [ prefix ] when* ] 2bi ;
|
|
|
|
|
|
|
|
: vocabs-in-root ( root -- seq )
|
|
|
|
"" vocabs-in-root/prefix ;
|
|
|
|
|
|
|
|
: (load-from-root) ( root prefix -- failures )
|
|
|
|
vocabs-in-root/prefix
|
|
|
|
[ don't-load? not ] filter no-prefixes
|
2009-05-04 07:44:17 -04:00
|
|
|
require-all ;
|
|
|
|
|
2011-10-23 20:05:22 -04:00
|
|
|
: load-from-root ( root prefix -- )
|
|
|
|
(load-from-root) load-failures. ;
|
|
|
|
|
|
|
|
: load-root ( root -- )
|
|
|
|
"" load-from-root ;
|
|
|
|
|
|
|
|
: (load) ( prefix -- failures )
|
|
|
|
[ vocab-roots get ] dip '[ _ (load-from-root) ] map concat ;
|
|
|
|
|
2009-05-04 07:44:17 -04:00
|
|
|
: load ( prefix -- )
|
2011-10-25 17:53:56 -04:00
|
|
|
(load) load-failures. ;
|
2009-05-04 07:44:17 -04:00
|
|
|
|
|
|
|
: load-all ( -- )
|
|
|
|
"" load ;
|
|
|
|
|
2009-07-06 05:23:26 -04:00
|
|
|
MEMO: all-tags ( -- seq ) [ vocab-tags ] collect-vocabs ;
|
2009-05-04 07:44:17 -04:00
|
|
|
|
2009-07-06 05:23:26 -04:00
|
|
|
MEMO: all-authors ( -- seq ) [ vocab-authors ] collect-vocabs ;
|