diff --git a/package-lock.json b/package-lock.json index 808fabb..01e7a94 100644 --- a/package-lock.json +++ b/package-lock.json @@ -979,6 +979,12 @@ "integrity": "sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg==", "dev": true }, + "command-exists": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.6.tgz", + "integrity": "sha512-Qst/zUUNmS/z3WziPxyqjrcz09pm+2Knbs5mAZL4VAE0sSrNY1/w8+/YxeHcoBTsO6iojA6BW7eFf27Eg2MRuw==", + "dev": true + }, "commander": { "version": "2.20.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", @@ -1090,6 +1096,12 @@ "which": "^1.2.9" } }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -4125,6 +4137,12 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, + "p-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-debounce/-/p-debounce-1.0.0.tgz", + "integrity": "sha1-y38svu/YegnrqGHhErZ1J+Yh4v0=", + "dev": true + }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -5520,6 +5538,22 @@ } } }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true + }, + "tempy": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.2.1.tgz", + "integrity": "sha512-LB83o9bfZGrntdqPuRdanIVCPReam9SOZKW0fOy5I9X3A854GGWi0tjCqoXEk84XIEYBc/x9Hq3EFop/H5wJaw==", + "dev": true, + "requires": { + "temp-dir": "^1.0.0", + "unique-string": "^1.0.0" + } + }, "test-exclude": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", @@ -5769,6 +5803,21 @@ "integrity": "sha1-uk99si2RU0oZKdkACdzhYety/T8=", "dev": true }, + "typescript-language-server": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/typescript-language-server/-/typescript-language-server-0.3.8.tgz", + "integrity": "sha512-ohi+libVtaJ0F8asuXeqYlrPV84AkbcpWsp5kBeO6XnCrilwQS+elDrJ+jPu2tfVy3CIUpUbUYUmg4Bq3CA/XQ==", + "dev": true, + "requires": { + "command-exists": "1.2.6", + "commander": "^2.11.0", + "fs-extra": "^7.0.0", + "p-debounce": "^1.0.0", + "tempy": "^0.2.1", + "vscode-languageserver": "^4.4.0", + "vscode-uri": "^1.0.5" + } + }, "uglify-js": { "version": "3.4.10", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", @@ -5869,6 +5918,15 @@ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", "dev": true }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" + } + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -5970,6 +6028,44 @@ "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", "dev": true }, + "vscode-jsonrpc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", + "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==", + "dev": true + }, + "vscode-languageserver": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-4.4.2.tgz", + "integrity": "sha512-61y8Raevi9EigDgg9NelvT9cUAohiEbUl1LOwQQgOCAaNX62yKny/ddi0uC+FUTm4CzsjhBu+06R+vYgfCYReA==", + "dev": true, + "requires": { + "vscode-languageserver-protocol": "^3.10.3", + "vscode-uri": "^1.0.5" + } + }, + "vscode-languageserver-protocol": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz", + "integrity": "sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g==", + "dev": true, + "requires": { + "vscode-jsonrpc": "^4.0.0", + "vscode-languageserver-types": "3.14.0" + } + }, + "vscode-languageserver-types": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", + "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==", + "dev": true + }, + "vscode-uri": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.8.tgz", + "integrity": "sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ==", + "dev": true + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", diff --git a/package.json b/package.json index 1c4f26d..ba9a96e 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "standard": "^12.0.1", "ts-node": "^8.3.0", "typescript": "^3.5.2", + "typescript-language-server": "^0.3.8", "uglify-js": "^3.1.1" }, "dependencies": { diff --git a/src/index.ts b/src/index.ts index 34d2dc5..baab018 100644 --- a/src/index.ts +++ b/src/index.ts @@ -13,7 +13,7 @@ class Hold extends MulticastSource implements Stream, Disposable, Sink< private task?: ScheduledTask = undefined run (sink: Sink, scheduler: Scheduler): Disposable { - if (this._shouldScheduleFlush()) { + if (this._hasValue()) { this._scheduleFlush(sink, scheduler) } @@ -59,13 +59,13 @@ class Hold extends MulticastSource implements Stream, Disposable, Sink< return this.held !== undefined } - private _hasSinks (): boolean { - return this.sinks.length > 0 - } + // private _hasSinks (): boolean { + // return this.sinks.length > 0 + // } - private _shouldScheduleFlush (): boolean { - return this._hasValue() && this._hasSinks() - } + // private _shouldScheduleFlush (): boolean { + // return this._hasValue() && this._hasSinks() + // } private _scheduleFlush (sink: Sink, scheduler: Scheduler): void { this.pendingSinks.push(sink) diff --git a/test/index-test.ts b/test/index-test.ts index 7e55e17..a48ef79 100644 --- a/test/index-test.ts +++ b/test/index-test.ts @@ -6,6 +6,7 @@ import { hold } from '../src' import { Scheduler, Sink, Stream, Time } from '@most/types' import { at, + combineArray, mergeArray, merge, join, @@ -13,6 +14,7 @@ import { periodic, runEffects, scan, + switchLatest, take, tap, propagateEventTask @@ -25,7 +27,12 @@ const collect = (stream: Stream, scheduler: Scheduler): Promise eventValues) } -const verifyHold = (f: (stream: Stream, scheduler: Scheduler) => Promise): Promise<[ReadonlyArray, A]> => { +const verifyHold = ( + f: ( + stream: Stream, + scheduler: Scheduler + ) => Promise +): Promise<[ReadonlyArray, A]> => { const scheduler = newDefaultScheduler() const s = hold(mergeArray([at(0, 0), at(10, 1), at(20, 2)])) @@ -73,7 +80,7 @@ describe('hold', () => { return asap(propagateEventTask('foo', sink), scheduler) } return { - dispose () {} + dispose () {} // asap(propagateEndTask(sink), scheduler) } } } @@ -101,6 +108,31 @@ describe('hold', () => { it('should emit two events with hold for two observers', () => { return test(hold(new Source()), ['foo', 'foo']) }) + + it('shall pass', () => { + const hos: Stream[]> = scan( + (acc: Stream[], _s: void) => acc.concat([ + hold(new Source()) + ]), + [], + take(2, periodic(3)) + ) + + const flat: Stream = take(2, switchLatest( + map( + arr => combineArray( + (...a: string[]) => a.join(), + arr + ), + hos + ) + )) + + const scheduler = newDefaultScheduler() + return collect(flat, scheduler).then( + events => eq(['foo', 'foo,foo'], events) + ) + }) }) it(`should not propagate held event during the same tick as run`, () => {