1 ! Copyright (C) 2011 Erik Charlebois.
2 ! See https://factorcode.org/license.txt for BSD license.
4 USING: accessors assocs colors combinators io kernel listener
5 readline sequences sets splitting threads tools.completion
6 unicode.data vocabs vocabs.hierarchy ;
14 TUPLE: readline-reader { prompt initial: f } ;
15 INSTANCE: readline-reader input-stream
17 M: readline-reader stream-readln
19 [ dup [ " " append ] when readline f ] change-prompt
22 M: readline-reader prompt.
25 : clear-completions ( -- )
28 : prefixed ( prefix seq -- seq' )
29 swap '[ _ head? ] filter ;
31 : prefixed-words ( prefix -- words )
32 all-words [ name>> ] map! prefixed members ;
34 : prefixed-vocabs ( prefix -- vocabs )
35 all-disk-vocabs-recursive filter-vocabs [ name>> ] map! prefixed ;
37 : prefixed-vocab-words ( prefix vocab-name -- words )
38 vocab-words [ name>> ] map! prefixed ;
40 : prefixed-colors ( prefix -- colors )
41 named-colors prefixed ;
43 : prefixed-chars ( prefix -- chars )
44 name-map keys prefixed ;
46 : prefixed-paths ( prefix -- paths )
47 dup paths-matching keys prefixed ;
49 : get-completions ( prefix -- completions )
50 completions tget [ nip ] [
51 completion-line " \r\n" split {
52 { [ dup complete-vocab? ] [ drop prefixed-vocabs ] }
53 { [ dup complete-char? ] [ drop prefixed-chars ] }
54 { [ dup complete-color? ] [ drop prefixed-colors ] }
55 { [ dup complete-pathname? ] [ drop prefixed-paths ] }
56 { [ dup complete-vocab-words? ] [ harvest second prefixed-vocab-words ] }
57 [ drop prefixed-words ]
58 } cond dup completions tset
63 : readline-listener ( -- )
65 swap get-completions ?nth
66 [ clear-completions f ] unless*
68 readline-reader new [ listener-main ] with-input-stream* ;
70 : ?readline-listener ( -- )
71 has-readline? [ readline-listener ] [ listener ] if ;
73 MAIN: readline-listener