Files
zed/crates/text/src/subscription.rs
T
Mohamad KhaniandClaude Fable 5 46c7879954 logiguard fork v2: patched GPUI on verified 8c74db0 tree
Rebuilt from the exact zed-industries/zed @ 8c74db00c4053d6c0a9037863d7bd048658da4ca
tree (previous orphan was based on a stale/wrong fetch). Same 3-file patch:
  - serial.rs: add SerialKind::KeyboardEnter
  - client.rs: store wl_keyboard.enter serial; add latest_serial_of()
  - window.rs: activate() uses keyboard-enter serial (Mutter focus gate)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-14 01:44:22 +03:30

68 lines
1.7 KiB
Rust

use crate::{Edit, Patch};
use parking_lot::Mutex;
use std::{
mem,
sync::{Arc, Weak},
};
#[derive(Default)]
pub struct Topic<T>(Mutex<Vec<Weak<Mutex<Patch<T>>>>>);
pub struct Subscription<T>(Arc<Mutex<Patch<T>>>);
impl<T: Default, TDelta> Topic<T>
where
T: 'static
+ Copy
+ Ord
+ std::ops::Sub<T, Output = TDelta>
+ std::ops::Add<TDelta, Output = T>
+ std::ops::AddAssign<TDelta>
+ Default,
TDelta: Ord + Copy,
{
pub fn subscribe(&mut self) -> Subscription<T> {
let subscription = Subscription(Default::default());
self.0.get_mut().push(Arc::downgrade(&subscription.0));
subscription
}
pub fn publish(&self, edits: impl Clone + IntoIterator<Item = Edit<T>>) {
publish(&mut self.0.lock(), edits);
}
pub fn publish_mut(&mut self, edits: impl Clone + IntoIterator<Item = Edit<T>>) {
publish(self.0.get_mut(), edits);
}
}
impl<T: Default> Subscription<T> {
pub fn consume(&self) -> Patch<T> {
mem::take(&mut *self.0.lock())
}
}
fn publish<T, TDelta>(
subscriptions: &mut Vec<Weak<Mutex<Patch<T>>>>,
edits: impl Clone + IntoIterator<Item = Edit<T>>,
) where
T: 'static
+ Copy
+ Ord
+ std::ops::Sub<T, Output = TDelta>
+ std::ops::Add<TDelta, Output = T>
+ std::ops::AddAssign<TDelta>
+ Default,
TDelta: Ord + Copy,
{
subscriptions.retain(|subscription| {
if let Some(subscription) = subscription.upgrade() {
let mut patch = subscription.lock();
*patch = patch.compose(edits.clone());
true
} else {
false
}
});
}