1
- use fuse_rust:: SearchResult ;
1
+ use either:: Either ;
2
+ use fuse_rust:: { Fuse , SearchResult } ;
2
3
3
4
use crate :: draw:: ListItem ;
4
5
use crate :: input:: KeyPress ;
5
6
use crate :: mode:: Mode ;
6
7
8
+ struct Preprocessed ( Either < Vec < SearchResult > , usize > ) ;
9
+
10
+ impl Preprocessed {
11
+ fn processed ( processed : Vec < SearchResult > ) -> Self {
12
+ Self ( Either :: Left ( processed) )
13
+ }
14
+
15
+ fn unfiltred ( len : usize ) -> Self {
16
+ Self ( Either :: Right ( len) )
17
+ }
18
+
19
+ fn len ( & self ) -> usize {
20
+ match self {
21
+ Self ( Either :: Left ( x) ) => x. len ( ) ,
22
+ Self ( Either :: Right ( x) ) => * x,
23
+ }
24
+ }
25
+
26
+ fn index ( & self , selected_item : usize ) -> usize {
27
+ if selected_item >= self . len ( ) {
28
+ panic ! ( "Internal error: selected_item overflow" ) ;
29
+ }
30
+
31
+ match self {
32
+ Self ( Either :: Left ( x) ) => x[ selected_item] . index ,
33
+ Self ( Either :: Right ( _) ) => selected_item,
34
+ }
35
+ }
36
+
37
+ fn list_items < ' s , ' m : ' s > ( & ' s self , mode : & ' m Mode ) -> impl Iterator < Item = ListItem < ' _ > > + ' _ {
38
+ match self {
39
+ Self ( Either :: Left ( x) ) => Either :: Left ( x. iter ( ) . map ( move |r| mode. list_item ( r. index ) ) ) ,
40
+ Self ( Either :: Right ( x) ) => Either :: Right ( ( 0 ..* x) . map ( move |i| mode. list_item ( i) ) ) ,
41
+ }
42
+ . into_iter ( )
43
+ }
44
+ }
45
+
7
46
pub struct State {
8
47
input_buf : String ,
9
48
selected_item : usize ,
10
- processed_entries : Vec < SearchResult > ,
49
+ preprocessed : Preprocessed ,
11
50
inner : Mode ,
12
51
}
13
52
@@ -16,7 +55,7 @@ impl State {
16
55
Self {
17
56
input_buf : String :: new ( ) ,
18
57
selected_item : 0 ,
19
- processed_entries : vec ! [ ] ,
58
+ preprocessed : Preprocessed :: unfiltred ( inner . entries_len ( ) ) ,
20
59
inner,
21
60
}
22
61
}
@@ -47,11 +86,7 @@ impl State {
47
86
keysym : keysyms:: XKB_KEY_Return ,
48
87
..
49
88
} => {
50
- if self . selected_item >= self . processed_entries . len ( ) {
51
- panic ! ( "Internal error: selected_item overflow" ) ;
52
- }
53
- self . inner
54
- . eval ( self . processed_entries [ self . selected_item ] . index ) ;
89
+ self . inner . eval ( self . preprocessed . index ( self . selected_item ) ) ;
55
90
}
56
91
KeyPress {
57
92
keysym : keysyms:: XKB_KEY_bracketright ,
@@ -75,17 +110,21 @@ impl State {
75
110
}
76
111
77
112
pub fn processed_entries ( & self ) -> impl Iterator < Item = ListItem < ' _ > > {
78
- self . processed_entries
79
- . iter ( )
80
- . map ( move |r| self . inner . list_item ( r. index ) )
113
+ self . preprocessed . list_items ( & self . inner )
81
114
}
82
115
83
116
pub fn process_entries ( & mut self ) {
84
- self . processed_entries = fuse_rust:: Fuse :: default ( )
85
- . search_text_in_iterable ( & self . input_buf , self . inner . text_entries ( ) ) ;
117
+ if self . input_buf . is_empty ( ) {
118
+ self . preprocessed = Preprocessed :: unfiltred ( self . inner . entries_len ( ) ) ;
119
+ return ;
120
+ }
121
+
122
+ self . preprocessed = Preprocessed :: processed (
123
+ Fuse :: default ( ) . search_text_in_iterable ( & self . input_buf , self . inner . text_entries ( ) ) ,
124
+ ) ;
86
125
87
126
self . selected_item = self
88
- . processed_entries
127
+ . preprocessed
89
128
. len ( )
90
129
. saturating_sub ( 1 )
91
130
. min ( self . selected_item ) ;
0 commit comments