From a756f0b4b282d532c5fb0ff6fd54c0bb3dea975a Mon Sep 17 00:00:00 2001 From: Stephen Seo Date: Tue, 1 Mar 2022 11:04:49 +0900 Subject: [PATCH] Have SharedState use an array of Rc's Having each array element be an Rc> enables sharing Rc's with the Slot subelement. --- front_end/src/main.rs | 188 +++++++++++++++++++++++++++--------------- 1 file changed, 121 insertions(+), 67 deletions(-) diff --git a/front_end/src/main.rs b/front_end/src/main.rs index 9a55e16..abbdd35 100644 --- a/front_end/src/main.rs +++ b/front_end/src/main.rs @@ -1,4 +1,4 @@ -use std::cell::{Cell, RefCell}; +use std::cell::Cell; use std::rc::Rc; use yew::prelude::*; @@ -20,13 +20,71 @@ impl Default for BoardState { #[derive(Clone, Debug, PartialEq, Eq)] struct SharedState { - board: Rc>, + board: [Rc>; 56], } impl Default for SharedState { fn default() -> Self { Self { - board: Rc::new(RefCell::new([BoardState::default(); 56])), + // cannot use [; 56] because Rc does not impl Copy + board: [ + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + Rc::new(Cell::new(BoardState::default())), + ], } } } @@ -75,22 +133,18 @@ impl Component for Slot { .link() .context::(Callback::noop()) .expect("shared to be set"); - let value_at_idx = shared.board.as_ref().borrow()[idx as usize]; + let value_at_idx = shared.board[idx as usize].get(); match value_at_idx { BoardState::Empty => { - shared.board.as_ref().borrow_mut()[idx as usize] = BoardState::Cyan + shared.board[idx as usize].replace(BoardState::Cyan); } BoardState::Cyan => { - shared.board.as_ref().borrow_mut()[idx as usize] = BoardState::Magenta + shared.board[idx as usize].replace(BoardState::Magenta); } BoardState::Magenta => { - shared.board.as_ref().borrow_mut()[idx as usize] = BoardState::Empty + shared.board[idx as usize].replace(BoardState::Empty); } } - ctx.props() - .state - .as_ref() - .replace(shared.board.as_ref().borrow()[idx as usize]); } } true @@ -114,62 +168,62 @@ impl Component for Wrapper { .expect("state to be set"); html! {
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
// wrapper } }