diff options
| author | Ellie Huxtable <ellie@elliehuxtable.com> | 2023-02-10 18:14:48 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-02-10 18:14:48 +0000 |
| commit | 2672f78dda0bc98c9fac8d63bd1e00bafbb76ef4 (patch) | |
| tree | 1300abbd14272a5f2f8df2e4622684c968d65f17 /src/command/client/search/interactive.rs | |
| parent | crossterm support (#331) (diff) | |
| download | atuin-2672f78dda0bc98c9fac8d63bd1e00bafbb76ef4.zip | |
make update_needed check lazy (#706)
Diffstat (limited to '')
| -rw-r--r-- | src/command/client/search/interactive.rs | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/src/command/client/search/interactive.rs b/src/command/client/search/interactive.rs index c8ceab58..903c3362 100644 --- a/src/command/client/search/interactive.rs +++ b/src/command/client/search/interactive.rs @@ -16,6 +16,7 @@ use crossterm::{ execute, terminal, }; use eyre::Result; +use futures_util::FutureExt; use semver::Version; use unicode_width::UnicodeWidthStr; @@ -393,7 +394,8 @@ pub async fn history( // Put the cursor at the end of the query by default input.end(); - let update_needed = settings.needs_update().await; + let update_needed = settings.needs_update().fuse(); + tokio::pin!(update_needed); let mut app = State { history_count: db.history_count().await?, @@ -405,7 +407,7 @@ pub async fn history( } else { settings.filter_mode }, - update_needed, + update_needed: None, }; let mut results = app.query_results(settings.search_mode, db).await?; @@ -427,15 +429,24 @@ pub async fn history( let initial_input = app.input.as_str().to_owned(); let initial_filter_mode = app.filter_mode; - if event::poll(Duration::from_millis(250))? { - loop { - if let Some(i) = app.handle_input(settings, &event::read()?, results.len()) { - break 'render i; - } - if !event::poll(Duration::ZERO)? { - break; + let event_ready = tokio::task::spawn_blocking(|| event::poll(Duration::from_millis(250))); + + tokio::select! { + event_ready = event_ready => { + if event_ready?? { + loop { + if let Some(i) = app.handle_input(settings, &event::read()?, results.len()) { + break 'render i; + } + if !event::poll(Duration::ZERO)? { + break; + } + } } } + update_needed = &mut update_needed => { + app.update_needed = update_needed; + } } if initial_input != app.input.as_str() || initial_filter_mode != app.filter_mode { |
