]> gitweb.factorcode.org Git - factor.git/blob - extra/readline-listener/readline-listener.factor
core/basis: Rename words dealing with vocabs to loaded-vocabs or disk-vocabs because...
[factor.git] / extra / readline-listener / readline-listener.factor
1 ! Copyright (C) 2011 Erik Charlebois.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs colors.constants combinators fry io
4 kernel listener readline sequences splitting system threads
5 tools.completion unicode.data vocabs vocabs.hierarchy ;
6 IN: readline-listener
7
8 <PRIVATE
9
10 SYMBOL: completions
11
12 TUPLE: readline-reader { prompt initial: f } ;
13 INSTANCE: readline-reader input-stream
14
15 M: readline-reader stream-readln
16     flush [ prompt>> dup [ " " append ] [ ] if readline ]
17     keep f >>prompt drop ;
18
19 M: readline-reader prompt.
20     >>prompt drop ;
21
22 : clear-completions ( -- )
23     f completions tset ;
24
25 : prefixed ( prefix seq -- seq' )
26     swap '[ _ head? ] filter ;
27
28 : prefixed-words ( prefix -- words )
29     all-words [ name>> ] map! prefixed ;
30
31 : prefixed-vocabs ( prefix -- vocabs )
32     disk-vocabs-recursive filter-vocabs [ name>> ] map! prefixed ;
33
34 : prefixed-colors ( prefix -- colors )
35     named-colors prefixed ;
36
37 : prefixed-chars ( prefix -- chars )
38     name-map keys prefixed ;
39
40 : get-completions ( prefix -- completions )
41     completions tget [ nip ] [
42         completion-line " \r\n" split {
43             { [ dup complete-vocab? ] [ drop prefixed-vocabs ] }
44             { [ dup complete-char? ] [ drop prefixed-chars ] }
45             { [ dup complete-color? ] [ drop prefixed-colors ] }
46             [ drop prefixed-words ]
47         } cond dup completions tset
48     ] if* ;
49
50 PRIVATE>
51
52 : readline-listener ( -- )
53     [
54         swap get-completions ?nth
55         [ clear-completions f ] unless*
56     ] set-completion
57     readline-reader new [ listener ] with-input-stream* ;
58
59 : readline-listener-main ( -- )
60     version-info print flush readline-listener ;
61
62 MAIN: readline-listener-main