2009-01-09 18:58:13 -05:00
|
|
|
! Copyright (C) 2005, 2009 Slava Pestov.
|
2007-09-20 18:09:08 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2009-05-04 07:44:17 -04:00
|
|
|
USING: accessors kernel arrays sequences math namespaces strings io
|
|
|
|
fry vectors words assocs combinators sorting unicode.case
|
|
|
|
unicode.categories math.order vocabs vocabs.hierarchy unicode.data
|
|
|
|
locals ;
|
2008-04-26 00:17:08 -04:00
|
|
|
IN: tools.completion
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-04-18 22:53:22 -04:00
|
|
|
:: (fuzzy) ( accum i full ch -- accum i full ? )
|
|
|
|
ch i full index-from [
|
|
|
|
:> i i accum push
|
2009-08-13 20:21:44 -04:00
|
|
|
accum i 1 + full t
|
2007-09-20 18:09:08 -04:00
|
|
|
] [
|
2009-04-18 22:53:22 -04:00
|
|
|
f -1 full f
|
2007-09-20 18:09:08 -04:00
|
|
|
] if* ;
|
|
|
|
|
|
|
|
: fuzzy ( full short -- indices )
|
2009-04-18 22:53:22 -04:00
|
|
|
dup [ length <vector> 0 ] curry 2dip
|
|
|
|
[ (fuzzy) ] all? 3drop ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: (runs) ( runs n seq -- runs n )
|
|
|
|
[
|
|
|
|
[
|
|
|
|
2dup number=
|
|
|
|
[ drop ] [ nip V{ } clone pick push ] if
|
2009-08-13 20:21:44 -04:00
|
|
|
1 +
|
2009-05-25 17:38:33 -04:00
|
|
|
] keep pick last push
|
2007-09-20 18:09:08 -04:00
|
|
|
] each ;
|
|
|
|
|
|
|
|
: runs ( seq -- newseq )
|
|
|
|
V{ V{ } } [ clone ] map over first rot (runs) drop ;
|
|
|
|
|
|
|
|
: score-1 ( i full -- n )
|
|
|
|
{
|
|
|
|
{ [ over zero? ] [ 2drop 10 ] }
|
2009-08-13 20:21:44 -04:00
|
|
|
{ [ 2dup length 1 - number= ] [ 2drop 4 ] }
|
|
|
|
{ [ 2dup [ 1 - ] dip nth Letter? not ] [ 2drop 10 ] }
|
|
|
|
{ [ 2dup [ 1 + ] dip nth Letter? not ] [ 2drop 4 ] }
|
2008-04-11 13:57:43 -04:00
|
|
|
[ 2drop 1 ]
|
2007-09-20 18:09:08 -04:00
|
|
|
} cond ;
|
|
|
|
|
|
|
|
: score ( full fuzzy -- n )
|
|
|
|
dup [
|
2008-03-29 21:36:58 -04:00
|
|
|
[ [ length ] bi@ - 15 swap [-] 3 /f ] 2keep
|
2007-09-20 18:09:08 -04:00
|
|
|
runs [
|
|
|
|
[ 0 [ pick score-1 max ] reduce nip ] keep
|
|
|
|
length * +
|
2008-01-09 17:36:30 -05:00
|
|
|
] with each
|
2007-09-20 18:09:08 -04:00
|
|
|
] [
|
|
|
|
2drop 0
|
|
|
|
] if ;
|
|
|
|
|
|
|
|
: rank-completions ( results -- newresults )
|
|
|
|
sort-keys <reversed>
|
2007-10-27 14:43:30 -04:00
|
|
|
[ 0 [ first max ] reduce 3 /f ] keep
|
2008-04-26 00:17:08 -04:00
|
|
|
[ first < ] with filter
|
2007-09-20 18:09:08 -04:00
|
|
|
[ second ] map ;
|
|
|
|
|
|
|
|
: complete ( full short -- score )
|
|
|
|
[ dupd fuzzy score ] 2keep
|
2008-03-29 21:36:58 -04:00
|
|
|
[ <reversed> ] bi@
|
2007-09-20 18:09:08 -04:00
|
|
|
dupd fuzzy score max ;
|
|
|
|
|
|
|
|
: completion ( short candidate -- result )
|
2008-12-11 17:47:38 -05:00
|
|
|
[ second >lower swap complete ] keep 2array ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: completions ( short candidates -- seq )
|
2009-02-02 14:43:54 -05:00
|
|
|
[ ] [ [ >lower ] dip [ completion ] with map rank-completions ]
|
|
|
|
bi-curry if-empty ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-01-12 20:25:18 -05:00
|
|
|
: name-completions ( str seq -- seq' )
|
|
|
|
[ dup name>> ] { } map>assoc completions ;
|
|
|
|
|
2009-01-09 18:58:13 -05:00
|
|
|
: words-matching ( str -- seq )
|
2009-01-12 20:25:18 -05:00
|
|
|
all-words name-completions ;
|
2009-01-09 18:58:13 -05:00
|
|
|
|
|
|
|
: vocabs-matching ( str -- seq )
|
2009-07-06 05:55:23 -04:00
|
|
|
all-vocabs-recursive no-roots no-prefixes name-completions ;
|
2009-02-02 16:58:09 -05:00
|
|
|
|
|
|
|
: chars-matching ( str -- seq )
|
2009-05-25 17:38:33 -04:00
|
|
|
name-map keys dup zip completions ;
|