.keyBy() for independent partitions or .globally() for one shared partition. Locally closed inputs contribute no occurrence.
funnel()
funnel(signal, options) applies one durable timing and output policy to each source partition.
Timing options accept type-checked compact strings, millisecond numbers, or compatible signals.
End-triggered funnels require
minQuietPeriod or maxBurstDuration. Start and both-edge funnels may instead use minGap. Start-only funnels emit the first occurrence immediately and ignore the remainder of that burst, so they do not accept select or buffer. End and both-edge funnels may select one trailing occurrence or buffer all trailing occurrences.
A selecting funnel preserves the source’s keyed or global partition. A buffered funnel returns an ordinary Signal<T[]>.
debounce()
debounce(signal, duration) emits the latest occurrence after that partition remains quiet for the duration. It is the selecting funnel preset { minQuietPeriod: duration } and preserves the source’s keyed or global partition.
.globally() only when every occurrence should reset the same timer.
window()
window(signal, duration, options?) opens a fixed-duration window with the first occurrence and emits every admitted occurrence before its deadline. It always includes the opening occurrence.
window is the buffered funnel preset { buffer: true, maxBurstDuration: duration } and returns an ordinary Signal<T[]>. The last parent supplies otherwise ambiguous inherited values by default; pass { inheritConflictingValuesFrom: "first" } to choose the first.
See collect for count-bounded batches and delay for timing one continuation.