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 | |
| parent | crossterm support (#331) (diff) | |
| download | atuin-2672f78dda0bc98c9fac8d63bd1e00bafbb76ef4.zip | |
make update_needed check lazy (#706)
| -rw-r--r-- | Cargo.lock | 13 | ||||
| -rw-r--r-- | Cargo.toml | 1 | ||||
| -rw-r--r-- | src/command/client/search/interactive.rs | 29 |
3 files changed, 34 insertions, 9 deletions
@@ -89,6 +89,7 @@ dependencies = [ "env_logger", "eyre", "fs-err", + "futures-util", "indicatif", "interim", "itertools", @@ -738,6 +739,17 @@ dependencies = [ ] [[package]] +name = "futures-macro" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42cd15d1c7456c04dbdf7e88bcd69760d74f3a798d6444e16974b505b0e62f17" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] name = "futures-sink" version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -756,6 +768,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44fb6cb1be61cc1d2e43b262516aafcf63b241cffdb1d3fa115f91d9c7b09c90" dependencies = [ "futures-core", + "futures-macro", "futures-sink", "futures-task", "pin-project-lite", @@ -73,6 +73,7 @@ rpassword = "7.0" semver = "1.0.14" runtime-format = "0.1.2" tiny-bip39 = "1" +futures-util = "0.3" # from tui bitflags = "1.3" 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 { |
