aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMroik <mroik@delayed.space>2025-01-28 06:46:54 +0100
committerMroik <mroik@delayed.space>2025-02-01 19:33:04 +0100
commitaf86372cb6e55d4875a546be17c011dd97434502 (patch)
tree87bdf9228230e3e97fefa3735a3f509166a91901 /src
parent3a567e125000f658fd0715522598e3480c184c9e (diff)
Remove unnecessary String allocations
Diffstat (limited to 'src')
-rw-r--r--src/app.rs50
-rw-r--r--src/main.rs2
2 files changed, 28 insertions, 24 deletions
diff --git a/src/app.rs b/src/app.rs
index 2cc51c1..6b2d644 100644
--- a/src/app.rs
+++ b/src/app.rs
@@ -26,28 +26,24 @@ use crate::{
pub const TICK_RATE: u64 = 1000 / 20;
-pub struct App {
+pub struct App<'a> {
stdout: Stdout,
pub event_tx: Sender<Event>,
event_rx: Receiver<Event>,
running: bool,
- quote: Vec<String>,
+ quote: Vec<&'a str>,
state: State,
should_render: bool,
start: Option<Instant>,
completed: bool,
}
-impl App {
- pub fn new(quote: String) -> App {
+impl<'a> App<'a> {
+ pub fn new(quote: &str) -> App {
let (event_tx, event_rx): (Sender<Event>, Receiver<Event>) = channel(10);
App {
stdout: stdout(),
- quote: quote
- .split_whitespace()
- .filter(|s| !s.is_empty())
- .map(|s| s.to_string())
- .collect(),
+ quote: quote.split_whitespace().filter(|s| !s.is_empty()).collect(),
event_rx,
event_tx,
running: false,
@@ -116,13 +112,15 @@ impl App {
async fn handle_keypress(&mut self, k: char) -> Result<(), Box<dyn Error>> {
self.state.buffer.push(k);
- let is_word_completed = self
+ let end_offset = self
.state
.buffer
- .chars()
- .take(self.state.buffer.chars().count() - 1)
- .collect::<String>()
- == self.quote[self.state.current];
+ .char_indices()
+ .take(self.state.buffer.chars().count())
+ .last()
+ .unwrap()
+ .0;
+ let is_word_completed = self.state.buffer[0..end_offset] == *self.quote[self.state.current];
let is_text_completed = self.state.buffer == self.quote[self.state.current]
&& self.state.current == self.quote.len() - 1;
@@ -169,7 +167,7 @@ impl App {
cur_loc += 1;
}
- for i in 0..self.state.buffer.len() {
+ for i in 0..self.state.buffer.chars().count() {
if i >= cur_word_size {
break;
}
@@ -186,23 +184,29 @@ impl App {
match (buf_size, cur_word_size) {
(a, b) if a < b => {
self.stdout.queue(SetForegroundColor(Color::Reset)).unwrap();
- let v = &self.quote[self.state.current]
- .chars()
+ let start_offset = self.quote[self.state.current]
+ .char_indices()
.skip(buf_size)
- .collect::<String>();
- self.stdout.queue(Print(&v))?;
+ .nth(0)
+ .unwrap()
+ .0;
+ let v = &self.quote[self.state.current][start_offset..];
+ self.stdout.queue(Print(v))?;
}
(a, b) if a > b => {
self.stdout
.queue(SetForegroundColor(Color::Yellow))
.unwrap();
- let v = &self
+ let start_offset = self
.state
.buffer
- .chars()
+ .char_indices()
.skip(cur_word_size)
- .collect::<String>();
- self.stdout.queue(Print(&v))?;
+ .nth(0)
+ .unwrap()
+ .0;
+ let v = &self.state.buffer[start_offset..];
+ self.stdout.queue(Print(v))?;
}
_ => (),
}
diff --git a/src/main.rs b/src/main.rs
index 017344e..9851ea1 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -45,7 +45,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
drop(quotes);
// TODO Add more options to choose quotes
- let mut app = App::new(quote);
+ let mut app = App::new(&quote);
app.run().await?;
return Ok(());
XMR address: 854DmXNrxULU3ZFJVs4Wc8PFhbq29RhqHhY8W6cdWrtFN3qmooKyyeYPcDzZTNRxphhJ5UzASQfAdEMwSteVqymk28aLhqj