| 
									
										
										
										
											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. | 
					
						
							| 
									
										
										
										
											2010-08-13 22:28:44 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | USING: accessors arrays assocs combinators fry io kernel locals | 
					
						
							|  |  |  | make math math.order namespaces sequences sorting strings | 
					
						
							|  |  |  | unicode.case unicode.categories unicode.data vectors vocabs | 
					
						
							|  |  |  | vocabs.hierarchy words ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-26 00:17:08 -04:00
										 |  |  | IN: tools.completion | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-13 12:13:02 -04:00
										 |  |  | <PRIVATE
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : smart-index-from ( obj i seq -- n/f )
 | 
					
						
							|  |  |  |     rot [ ch>lower ] [ ch>upper ] bi
 | 
					
						
							|  |  |  |     [ eq? ] bi-curry@ [ bi or ] 2curry find-from drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-13 12:22:57 -04:00
										 |  |  | PRIVATE>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-04-18 22:53:22 -04:00
										 |  |  | :: (fuzzy) ( accum i full ch -- accum i full ? )
 | 
					
						
							| 
									
										
										
										
											2011-09-13 12:13:02 -04:00
										 |  |  |     ch i full smart-index-from [ | 
					
						
							| 
									
										
										
										
											2009-04-18 22:53:22 -04:00
										 |  |  |         :> 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
 | 
					
						
							| 
									
										
										
										
											2010-05-17 23:20:46 -04:00
										 |  |  |     values ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : 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 )
 | 
					
						
							| 
									
										
										
										
											2011-09-13 12:13:02 -04:00
										 |  |  |     [ second swap complete ] keep 2array ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-13 22:28:44 -04:00
										 |  |  | : completion, ( short candidate -- )
 | 
					
						
							|  |  |  |     completion dup first 0 > [ , ] [ drop ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | : completions ( short candidates -- seq )
 | 
					
						
							| 
									
										
										
										
											2010-08-13 22:28:44 -04:00
										 |  |  |     [ ] [ | 
					
						
							| 
									
										
										
										
											2011-09-13 12:13:02 -04:00
										 |  |  |         [ [ completion, ] with each ] { } make | 
					
						
							| 
									
										
										
										
											2010-08-13 22:28:44 -04:00
										 |  |  |         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 ;
 | 
					
						
							| 
									
										
										
										
											2010-08-13 22:28:44 -04:00
										 |  |  | 
 |