chiark / gitweb /
Change type of UnpreparedPreparedUpdates
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 29 Apr 2022 22:49:16 +0000 (23:49 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 30 Apr 2022 10:02:54 +0000 (11:02 +0100)
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 <ijackson@chiark.greenend.org.uk>
daemon/api.rs
daemon/cmdlistener.rs
src/clock.rs
src/hidden.rs
src/ui.rs
src/updates.rs

index 7c4c2b351b1fe98e301dd2b800c2bcb9ca13900c..dd7756a9c34298068a8a7de08b0c9dd326f41a0a 100644 (file)
@@ -178,7 +178,7 @@ fn api_piece_op<O: op::Complex>(form: Json<ApiPiece<O>>)
 
       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);
     }
index 3bd816be2fceb8fc0fb54252f5e14c564a9d5621..e40ef154047fadf31f4aaa4fff265e80ef2bbd31 100644 (file)
@@ -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)
index 00f53ae82e96b3c3df1cbf923e040abbb9c13d56..0743db7d2d6b683b480f67389a8bf9fbf65b94ea 100644 (file)
@@ -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")]
index 5f5232018668c4129f73739f232baeeb9e6d8e0b..021339492e3bc37aa44c898678877dc374bf359d 100644 (file)
@@ -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)
     }
   }
index b5196fb651b9b24fbfed5a9e93700190c1b86501..39e9e690ba793a513d9403b9a10527edc931f7b0 100644 (file)
--- 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 {
index ec2ab6bf6970710455ee92466301ae1459e43c5d..6e7acd3d18aa723d57e44b4bf8dfd0be27493724 100644 (file)
@@ -27,7 +27,7 @@ pub type RawClientSequence = u64;
 #[serde(transparent)]
 pub struct ClientSequence(RawClientSequence);
 
-pub type UnpreparedUpdates = Option<SomeUnpreparedUpdates>;
+pub type UnpreparedUpdates = Vec<SomeUnpreparedUpdates>;
 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)
-      }))
+      })]
   }
 }