In Supply§
See primary documentation in context for method stable.
method stable(Supply:D: $time, :$scheduler = $*SCHEDULER --> Supply:D)
Creates a new supply that only passes on a value flowing through the given supply if it wasn't superseded by another value in the given $time (in seconds). Optionally uses another scheduler than the default scheduler, using the :scheduler parameter.
To clarify the above, if, during the timeout $time, additional values are emitted to the Supplier all but the last one will be thrown away. Each time an additional value is emitted to the Supplier, during the timeout, $time is reset.
This method can be quite useful when handling UI input, where it is not desired to perform an operation until the user has stopped typing for a while rather than on every keystroke.
my $supplier = Supplier.new; my $supply1 = $supplier.Supply; $supply1.tap(-> $v { say "Supply1 got: $v" }); $supplier.emit(42); my Supply $supply2 = $supply1.stable(5); $supply2.tap(-> $v { say "Supply2 got: $v" }); sleep(3); $supplier.emit(43); # will not be seen by $supply2 but will reset $time $supplier.emit(44); sleep(10); # OUTPUT: «Supply1 got: 42Supply1 got: 43Supply1 got: 44Supply2 got: 44»
As can be seen above, $supply1 received all values emitted to the Supplier while $supply2 only received one value. The 43 was thrown away because it was followed by another 'last' value 44 which was retained and sent to $supply2 after approximately eight seconds, this due to the fact that the timeout $time was reset after three seconds.