Example 1: Accumulate total duration mouse held down over time
( StackBlitz )
// RxJS v6+import { fromEvent, interval } from 'rxjs';import { mergeScan, take, takeUntil, map, scan } from 'rxjs/operators';// referenceconst durationElem = document.getElementById('duration');// streamsconst mouseDown$ = fromEvent(document, 'mousedown');const mouseUp$ = fromEvent(document, 'mouseup');// accumulate time mouse held down over timemouseDown$.pipe(mergeScan((acc, curr) => {return interval(1000).pipe(scan((a, _) => ++a, 0),map((val: any) => val + acc),takeUntil(mouseUp$));}, 0)// output: 1s...2s...3s...4s...).subscribe(val => (durationElem.innerHTML = `${val}s`));
pluck 📰 -
Official docs
📁 Source Code: https://github.com/ReactiveX/rxjs/blob/master/src/internal/operators/mergeScan.ts