From 9c53bb4faffee0a06046de64325f0b4ddeedd3a0 Mon Sep 17 00:00:00 2001 From: Karsten Schmidt Date: Sun, 14 Jun 2020 16:29:26 +0100 Subject: [PATCH] feat(rstream): add debounce() sub & tests --- packages/rstream/src/index.ts | 1 + packages/rstream/src/subs/debounce.ts | 19 +++++++++++++++ packages/rstream/test/debounce.ts | 35 +++++++++++++++++++++++++++ 3 files changed, 55 insertions(+) create mode 100644 packages/rstream/src/subs/debounce.ts create mode 100644 packages/rstream/test/debounce.ts diff --git a/packages/rstream/src/index.ts b/packages/rstream/src/index.ts index 50d9b11fd4..49f299cb1a 100644 --- a/packages/rstream/src/index.ts +++ b/packages/rstream/src/index.ts @@ -22,6 +22,7 @@ export * from "./from/worker"; export * from "./subs/asidechain"; export * from "./subs/bisect"; +export * from "./subs/debounce"; export * from "./subs/post-worker"; export * from "./subs/resolve"; export * from "./subs/sidechain-partition"; diff --git a/packages/rstream/src/subs/debounce.ts b/packages/rstream/src/subs/debounce.ts new file mode 100644 index 0000000000..3d3ccc0230 --- /dev/null +++ b/packages/rstream/src/subs/debounce.ts @@ -0,0 +1,19 @@ +import { fromIterable } from "../from/iterable"; +import { metaStream, MetaStreamOpts } from "../metastream"; + +/** + * Returns a subscription which ignores any intermediate inputs arriving + * faster than given `delay` time period. + * + * @example + * ```ts + * + * ``` + * + * @param delay + */ +export const debounce = (delay: number, opts?: Partial) => + metaStream((x: T) => fromIterable([x], { delay }), { + emitLast: true, + ...opts, + }); diff --git a/packages/rstream/test/debounce.ts b/packages/rstream/test/debounce.ts new file mode 100644 index 0000000000..55ca6065d7 --- /dev/null +++ b/packages/rstream/test/debounce.ts @@ -0,0 +1,35 @@ +import * as assert from "assert"; +import { debounce, fromIterable } from "../src/index"; +import { TIMEOUT } from "./config"; + +describe("debounce", () => { + it("basic", (done) => { + const acc: number[] = []; + fromIterable([1, 2, 3], { delay: TIMEOUT }) + .subscribe(debounce(TIMEOUT * 1.5)) + .subscribe({ + next(x) { + acc.push(x); + }, + }); + setTimeout(() => { + assert.deepEqual(acc, [3]); + done(); + }, TIMEOUT * 5); + }); + + it("no last", (done) => { + const acc: number[] = []; + fromIterable([1, 2, 3], { delay: TIMEOUT }) + .subscribe(debounce(TIMEOUT * 1.5, { emitLast: false })) + .subscribe({ + next(x) { + acc.push(x); + }, + }); + setTimeout(() => { + assert.deepEqual(acc, []); + done(); + }, TIMEOUT * 5); + }); +});