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 } }