From 78a5b9cc3d9d302b93fa5b8e827c09b992a57504 Mon Sep 17 00:00:00 2001 From: Rhys Lloyd Date: Fri, 15 May 2026 08:54:07 -0700 Subject: [PATCH] undo --- README.md | 2 +- src/card_game.rs | 20 ++++++++++++++++---- src/klondike.rs | 4 +++- src/test.rs | 5 ++--- 4 files changed, 22 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index 3c22084..b79b7e6 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ use card_game::klondike::Klondike; // create game session let seed = Rng::default(); let game = Klondike::new(seed.clone(), Default::default()); -let mut session = Session::new(seed, game); +let mut session = Session::new(game); // is winnable let is_winnable = session.is_winnable().is_some(); diff --git a/src/card_game.rs b/src/card_game.rs index 02828b9..8341ab5 100644 --- a/src/card_game.rs +++ b/src/card_game.rs @@ -165,14 +165,17 @@ impl Pile { } pub struct Session { - seed: Rng, + seed: G, state: G, history: Vec, } -impl Session { - pub fn new(seed: Rng, state: G) -> Self { +impl Session +where + G::Instruction: Clone, +{ + pub fn new(state: G) -> Self { Self { - seed, + seed: state.clone(), state, history: Vec::new(), } @@ -183,6 +186,15 @@ impl Session { pub fn is_winnable(&self) -> Option> { None } + pub fn undo(&mut self) { + // replay the entire history of the game except one move + self.history.pop(); + let mut state = self.seed.clone(); + for instruction in self.history() { + state.process_instruction(instruction.clone()); + } + self.state = state; + } } impl Game for Session where diff --git a/src/klondike.rs b/src/klondike.rs index a2f225c..a813302 100644 --- a/src/klondike.rs +++ b/src/klondike.rs @@ -1,6 +1,7 @@ use crate::Rng; use crate::card_game::{Game, Pile, Stack}; +#[derive(Clone, Debug)] pub struct KlondikeConfig {} impl Default for KlondikeConfig { fn default() -> Self { @@ -66,7 +67,7 @@ impl KlondikeInstruction { } } -#[derive(Clone, Hash)] +#[derive(Clone, Debug, Hash)] struct KlondikeState { piles: [Pile; 13], } @@ -157,6 +158,7 @@ impl Iterator for KlondikeIter { } } +#[derive(Clone, Debug)] pub struct Klondike { config: KlondikeConfig, state: KlondikeState, diff --git a/src/test.rs b/src/test.rs index d05b442..f64f27c 100644 --- a/src/test.rs +++ b/src/test.rs @@ -5,9 +5,8 @@ fn test_klondike() { use crate::klondike::Klondike; // create game session - let seed = Rng::default(); - let game = Klondike::new(seed.clone(), Default::default()); - let mut session = Session::new(seed, game); + let game = Klondike::new(Rng::default(), Default::default()); + let mut session = Session::new(game); // is winnable let is_winnable = session.is_winnable().is_some();