From a35ba24a1333eb5193f1bcaff38df653125dd333 Mon Sep 17 00:00:00 2001 From: Mark Date: Mon, 4 Mar 2024 18:39:59 -0800 Subject: [PATCH] Clippy --- src/agents/diffuse.rs | 13 +++--- src/agents/player.rs | 17 ++++++-- src/board/board.rs | 93 ++++++++++++++++--------------------------- src/board/mod.rs | 1 + src/board/tree.rs | 6 +-- src/util.rs | 5 +-- 6 files changed, 56 insertions(+), 79 deletions(-) diff --git a/src/agents/diffuse.rs b/src/agents/diffuse.rs index b637dbe..284c95b 100644 --- a/src/agents/diffuse.rs +++ b/src/agents/diffuse.rs @@ -50,8 +50,8 @@ impl DiffuseAgent { let mut max_dist = *dist.iter().max().unwrap(); loop { - for pos in 0..11 { - if dist[pos] >= max_dist { + for (pos, d) in dist.iter().enumerate() { + if *d >= max_dist { let action = PlayerAction { symb, pos }; if board.can_play(&action) { return action; @@ -72,14 +72,13 @@ impl MinimizerAgent for DiffuseAgent { fn step_min(&mut self, board: &Board) -> Result { let symb = [Symb::Minus, Symb::Times, Symb::Plus, Symb::Div] .iter() - .filter(|x| !board.contains(**x)) - .next(); + .find(|x| !board.contains(**x)); - if symb.is_none() { + if let Some(symb) = symb { + Ok(self.step_symb(board, *symb)) + } else { // No symbols available, play a random number RandomAgent {}.step_min(board) - } else { - Ok(self.step_symb(board, *symb.unwrap())) } } } diff --git a/src/agents/player.rs b/src/agents/player.rs index 39cff2d..1503901 100644 --- a/src/agents/player.rs +++ b/src/agents/player.rs @@ -92,7 +92,7 @@ impl PlayerAgent { self.symbol_selector.check(board); // Ask for input until we get a valid move - 'outer: loop { + loop { print!( "\r{}{}{} ╙{}{}{}{}{}╜", // Goal @@ -119,14 +119,22 @@ impl PlayerAgent { Key::Char('q') => bail!("player ended game"), Key::Right => { self.cursor = cursor_max.min(self.cursor + 1); + break; } Key::Left => { if self.cursor != 0 { self.cursor -= 1; } + break; + } + Key::Up => { + self.symbol_selector.up(board); + break; + } + Key::Down => { + self.symbol_selector.down(board); + break; } - Key::Up => self.symbol_selector.up(board), - Key::Down => self.symbol_selector.down(board), Key::Char('\n') => { let symb = Symb::from_char(self.symbol_selector.current()); if let Some(symb) = symb { @@ -138,6 +146,7 @@ impl PlayerAgent { return Ok(action); } } + break; } Key::Char(c) => { let symb = Symb::from_char(c); @@ -150,10 +159,10 @@ impl PlayerAgent { return Ok(action); } } + break; } _ => {} }; - continue 'outer; } } } diff --git a/src/board/board.rs b/src/board/board.rs index 0693019..0f220a6 100644 --- a/src/board/board.rs +++ b/src/board/board.rs @@ -5,11 +5,38 @@ use termion::color; use super::{PlayerAction, TreeElement}; use crate::util::{Player, Symb}; +#[derive(Debug)] enum InterTreeElement { Unprocessed(Token), Processed(TreeElement), } +impl InterTreeElement { + fn to_value(&self) -> TreeElement { + match self { + InterTreeElement::Processed(x) => x.clone(), + InterTreeElement::Unprocessed(Token::Value(s)) => { + if let Some(s) = s.strip_prefix('-') { + TreeElement::Neg { + r: { + if s.contains('_') { + Box::new(TreeElement::Partial(s.to_string())) + } else { + Box::new(TreeElement::Number(s.parse().unwrap())) + } + }, + } + } else if s.contains('_') { + TreeElement::Partial(s.to_string()) + } else { + TreeElement::Number(s.parse().unwrap()) + } + } + _ => unreachable!(), + } + } +} + #[derive(Debug, PartialEq, Clone)] enum Token { Value(String), @@ -71,11 +98,9 @@ impl Board { } pub fn contains(&self, s: Symb) -> bool { - for i in &self.board { - if let Some(i) = i { - if i.0 == s { - return true; - } + for i in self.board.iter().flatten() { + if i.0 == s { + return true; } } @@ -233,56 +258,8 @@ impl Board { _ => false, } { did_something = true; - let l = &tree[i - 1]; - let r = &tree[i + 1]; - - let l = match l { - InterTreeElement::Processed(x) => x.clone(), - InterTreeElement::Unprocessed(Token::Value(s)) => { - if s.starts_with('-') { - TreeElement::Neg { - r: { - if s.contains('_') { - Box::new(TreeElement::Partial(s[1..].to_string())) - } else { - Box::new(TreeElement::Number(s[1..].parse().unwrap())) - } - }, - } - } else { - if s.contains('_') { - TreeElement::Partial(s.to_string()) - } else { - TreeElement::Number(s.parse().unwrap()) - } - } - } - _ => unreachable!(), - }; - - let r = match r { - InterTreeElement::Processed(x) => x.clone(), - InterTreeElement::Unprocessed(Token::Value(s)) => { - if s.starts_with('-') { - TreeElement::Neg { - r: { - if s.contains('_') { - Box::new(TreeElement::Partial(s[1..].to_string())) - } else { - Box::new(TreeElement::Number(s[1..].parse().unwrap())) - } - }, - } - } else { - if s.contains('_') { - TreeElement::Partial(s.to_string()) - } else { - TreeElement::Number(s.parse().unwrap()) - } - } - } - _ => unreachable!(), - }; + let l = tree[i - 1].to_value(); + let r = tree[i + 1].to_value(); let v = match tree[i] { InterTreeElement::Unprocessed(Token::OpAdd) => TreeElement::Add { @@ -318,7 +295,7 @@ impl Board { match tree.into_iter().next().unwrap() { InterTreeElement::Processed(x) => x, - _ => unreachable!(), + x => x.to_value(), } } @@ -337,10 +314,8 @@ impl Board { .filter_map(|c| { if c == '_' { Some(None) - } else if let Some(symb) = Symb::from_char(c) { - Some(Some((symb, current_player))) } else { - None + Symb::from_char(c).map(|s| Some((s, current_player))) } }) .collect::>(); diff --git a/src/board/mod.rs b/src/board/mod.rs index aabb28c..ecedd96 100644 --- a/src/board/mod.rs +++ b/src/board/mod.rs @@ -1,3 +1,4 @@ +#[allow(clippy::module_inception)] mod board; mod tree; diff --git a/src/board/tree.rs b/src/board/tree.rs index 8152766..b6ba662 100644 --- a/src/board/tree.rs +++ b/src/board/tree.rs @@ -132,11 +132,7 @@ impl TreeElement { } Self::Neg { r } => { let r = r.evaluate(); - if let Some(r) = r { - Some(-r) - } else { - None - } + r.map(|r| -r) } } } diff --git a/src/util.rs b/src/util.rs index 9256a43..76f36b4 100644 --- a/src/util.rs +++ b/src/util.rs @@ -62,10 +62,7 @@ impl Debug for Symb { impl Symb { /// Is this symbol a plain binary operator? pub fn is_op(&self) -> bool { - match self { - Symb::Div | Symb::Plus | Symb::Times | Symb::Minus => true, - _ => false, - } + matches!(self, Symb::Div | Symb::Plus | Symb::Times | Symb::Minus) } pub fn is_minus(&self) -> bool {