-
Notifications
You must be signed in to change notification settings - Fork 37
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
docs: improve multiset_delta()
docs
#830
base: main
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,30 +5,54 @@ use super::{ | |
WriteContextArgs, RANGE_0, RANGE_1, | ||
}; | ||
|
||
// TODO(mingwei): more doc | ||
/// Multiset delta from the previous tick. | ||
/// The multiset inverse of [`persist()`](#persist). | ||
/// | ||
/// > 1 input stream of `T`, 1 output stream of `T`, where `T: Eq + Hash` | ||
/// | ||
/// For set semantics, [`unique()`](#unique) can be thought of as a "delta" operator, the inverse | ||
/// of [`persist()`](#persist). In `persist`, new items come in, and all items are repeatedly | ||
/// released out. Conversely, `unique` take repeated items in, and only releases the new ones out. | ||
/// | ||
/// This operator does a similar inversion but for multiset semantics, with some caveats. When it | ||
/// receives duplicate items, instead of ignoring them, it "subtracts" them from the items received | ||
/// in the previous tick: i.e. if we received `k` copies of an item in the previous tick, and we | ||
/// receive `l > k` copies in the current tick, we output `l - k` copies of the item. | ||
/// However unlike `unique`, this count is only maintained for the previous tick, not over all time. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Given the proposed rewording above, maybe rephrase to match. I'm actually confused as to whether it remembers the MAX number of copies over time, or just the last tick number? If it's MAX, then we should probably implement a generic There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It is only the previous tick. The semantics become weird if it's not somewhere after a |
||
/// | ||
/// In the example below, in the second tick two 'a's are removed because two 'a's were received in | ||
/// the previous tick. The third 'a' is released though. | ||
/// | ||
/// ```rustbook | ||
/// let (input_send, input_recv) = hydroflow::util::unbounded_channel::<u32>(); | ||
/// let (input_send, input_recv) = hydroflow::util::unbounded_channel::<char>(); | ||
/// let mut flow = hydroflow::hydroflow_syntax! { | ||
/// source_stream(input_recv) | ||
/// -> multiset_delta() | ||
/// -> for_each(|n| println!("{}", n)); | ||
/// }; | ||
/// | ||
/// input_send.send(3).unwrap(); | ||
/// input_send.send(4).unwrap(); | ||
/// input_send.send(3).unwrap(); | ||
/// input_send.send('a').unwrap(); | ||
/// input_send.send('b').unwrap(); | ||
/// input_send.send('a').unwrap(); | ||
/// flow.run_tick(); | ||
/// // 'a', 'b', 'a' | ||
/// | ||
/// input_send.send('a').unwrap(); | ||
/// input_send.send('c').unwrap(); | ||
/// input_send.send('a').unwrap(); | ||
/// input_send.send('a').unwrap(); | ||
/// flow.run_tick(); | ||
/// // 3, 4, | ||
/// // 'c', 'a' | ||
/// // First two 'a's are removed due to previous tick. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Give an example of the 3rd tick to clarify what confuses me above about MAX over all time vs last tick? |
||
/// | ||
/// input_send.send(3).unwrap(); | ||
/// input_send.send(5).unwrap(); | ||
/// input_send.send(3).unwrap(); | ||
/// input_send.send(3).unwrap(); | ||
/// input_send.send('b').unwrap(); | ||
/// input_send.send('c').unwrap(); | ||
/// input_send.send('a').unwrap(); | ||
/// input_send.send('a').unwrap(); | ||
/// input_send.send('a').unwrap(); | ||
/// input_send.send('a').unwrap(); | ||
/// flow.run_tick(); | ||
/// // 5, 3 | ||
/// // First two "3"s are removed due to previous tick. | ||
/// // 'b', 'a' | ||
/// // 3 'a's and the 'c' are removed due to previous tick. | ||
/// ``` | ||
pub const MULTISET_DELTA: OperatorConstraints = OperatorConstraints { | ||
name: "multiset_delta", | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
"subtracts" is confusing. Why not say "if we received
k
copies of an item in the previous tick, and we receivel > k
copies in the current tick, we outputl - k
copies of the item."