From: Ian Jackson Date: Fri, 29 Apr 2022 22:49:16 +0000 (+0100) Subject: Change type of UnpreparedPreparedUpdates X-Git-Tag: otter-1.1.0~422 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=cac9f5b0893957f31cd9e0381a85f141d8160ce9;p=otter.git Change type of UnpreparedPreparedUpdates We're going to want to compose this in an additional place. And all this Option and None is awkward. Signed-off-by: Ian Jackson --- diff --git a/daemon/api.rs b/daemon/api.rs index 7c4c2b35..dd7756a9 100644 --- a/daemon/api.rs +++ b/daemon/api.rs @@ -178,7 +178,7 @@ fn api_piece_op(form: Json>) buf.piece_update(piece, &by_client, ops); buf.log_updates(log); - if let Some(unprepared) = unprepared { unprepared(&mut buf); } + buf.add_unprepared(unprepared); debug!("api_piece_op OK: {:?}", &form); } diff --git a/daemon/cmdlistener.rs b/daemon/cmdlistener.rs index 3bd816be..e40ef154 100644 --- a/daemon/cmdlistener.rs +++ b/daemon/cmdlistener.rs @@ -1059,11 +1059,11 @@ fn execute_game_insn<'cs, 'igr, 'ig: 'igr>( raw: None }, Fine, if xupdates.len() != 0 { - Some( + vec![ Box::new(move |prepub: &mut PrepareUpdatesBuffer| prepub.piece_updates(xupdates, &None)) as SomeUnpreparedUpdates - ) + ] } else { default() }, vec![], ig_g) diff --git a/src/clock.rs b/src/clock.rs index 00f53ae8..0743db7d 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -395,10 +395,10 @@ const OUTLINE: RectShape = RectShape { xy: PosC::new(W as f64, H as f64) }; // ==================== piece management, loading, etc. ==================== fn unprepared_update(piece: PieceId) -> UnpreparedUpdates { - Some(Box::new(move |buf: &mut PrepareUpdatesBuffer| { + vec![Box::new(move |buf: &mut PrepareUpdatesBuffer| { buf.piece_update_image(piece, &None) .unwrap_or_else(|e| error!("failed to prep clock: {:?}", e)); - })) + })] } #[typetag::serde(name="ChessClock")] diff --git a/src/hidden.rs b/src/hidden.rs index 5f523201..02133949 100644 --- a/src/hidden.rs +++ b/src/hidden.rs @@ -837,8 +837,7 @@ mod recompute { impl Debug for Implemented { #[throws(fmt::Error)] fn fmt(&self, f: &mut Formatter) { - write!(f, "Implemented({})", - if self.0.is_some() { "Some(..)" } else { "None" })?; + write!(f, "Implemented({})", self.0.len())?; } } @@ -862,30 +861,16 @@ mod recompute { if let Some(occ) = goccults.occults.get_mut(occid) { vpid::permute(occid, occ, gplayers, gpieces, ipieces); if let Some(ipc) = ipieces.get(occ.occulter) { - if let Some(uu) = { - ipc + let uu = ipc .direct_trait_access() - .occultation_notify_hook(occ.occulter) - } { - unprepared.push(uu) - } + .occultation_notify_hook(occ.occulter); + unprepared.extend(uu); } } } consistency_check(gplayers, gpieces, goccults); - let unprepared = if unprepared.is_empty() { - None - } else { - Some(Box::new( - move |updates: &mut PrepareUpdatesBuffer| { - for p in unprepared.into_iter() { p(updates) } - } - ) as SomeUnpreparedUpdates - ) - }; - Implemented(unprepared) } } diff --git a/src/ui.rs b/src/ui.rs index b5196fb6..39e9e690 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -72,12 +72,12 @@ pub fn player_dasharray(gplayers: &GPlayers, player: PlayerId) -> Html { pub fn occultation_notify_update_image(piece: PieceId) -> UnpreparedUpdates { - Some(Box::new( + vec![Box::new( move |updates: &mut PrepareUpdatesBuffer| { updates.piece_update_image(piece, &None) .unwrap_or_else(|e| error!("unable to send update! {:?}", e)) } - )) + )] } impl PresentationLayout { diff --git a/src/updates.rs b/src/updates.rs index ec2ab6bf..6e7acd3d 100644 --- a/src/updates.rs +++ b/src/updates.rs @@ -27,7 +27,7 @@ pub type RawClientSequence = u64; #[serde(transparent)] pub struct ClientSequence(RawClientSequence); -pub type UnpreparedUpdates = Option; +pub type UnpreparedUpdates = Vec; pub type SomeUnpreparedUpdates = Box< dyn for<'r> FnOnce(&'r mut PrepareUpdatesBuffer) >; @@ -820,9 +820,7 @@ impl<'r> PrepareUpdatesBuffer<'r> { } pub fn add_unprepared(&mut self, unprepared: UnpreparedUpdates) { - if let Some(unprepared) = unprepared { - unprepared(self); - } + for suu in unprepared { suu(self); } } pub fn only_unprepared(ig: &'r mut Instance, unprepared: UnpreparedUpdates) { @@ -834,7 +832,7 @@ impl<'r> PrepareUpdatesBuffer<'r> { pub fn only_unprepared_with<'i,F,E>(unprepared: UnpreparedUpdates, igf: F) where F: FnOnce() -> Result<&'i mut Instance, E> { - if unprepared.is_some() { + if unprepared.len() != 0 { let ig = igf()?; let mut prepub = PrepareUpdatesBuffer::new(ig, None); prepub.add_unprepared(unprepared); @@ -1018,10 +1016,10 @@ impl PreparedUpdate { impl Vec<(PieceId, PieceUpdateOps)> { fn into_unprepared(self, by_client: IsResponseToClientOp) -> UnpreparedUpdates { - Some(Box::new( + vec![Box::new( move |buf: &mut PrepareUpdatesBuffer| { buf.piece_updates(self, &by_client) - })) + })] } }