diff --git a/src/signal.js b/src/signal.js index 00723b8..53546cd 100644 --- a/src/signal.js +++ b/src/signal.js @@ -18,14 +18,54 @@ export default class Signal { } /** - * Extra-sugar - * Extract `on` into separated function. Called w/o arguments will return a signal object. + * Extract `on` into separated function. * @return {function(function=, number=): Bind} + * @deprecated */ subscriber () { return (fn, priority = 0) => this.on(fn, priority) } + /** + * Extract `on` into separated function. + * @return {function(function=, number=): Bind} + */ + extractOn () { + return (fn, priority = 0) => this.on(fn, priority) + } + + /** + * Extract `once` into separated function. + * @return {function(function=, number=): Bind} + */ + extractOnce () { + return (fn, priority = 0) => this.once(fn, priority) + } + + /** + * Extract `emit` into a separate function + * @returns {function(...[*]): void} + */ + extractEmit () { + return (...args) => this.emit(...args) + } + + + wait (tio = 0) { + return new Promise((resolve, reject) => { + + const _t = tio ? setTimeout(() => { + sub.off() + reject() + }, tio) : null + + const sub = this.once((a) => { + if (_t) clearInterval(_t) + resolve(a) + }) + }) + } + /** * Sort Binds by priority. Automatically called when `prioritized: true` */ @@ -83,7 +123,7 @@ export default class Signal { /** * Emit signal with any arguments - * @param {*} arguments + * @param {...[*]} arguments */ emit () { this.stopped = false diff --git a/test.js b/test.js index 07af67b..a44db42 100644 --- a/test.js +++ b/test.js @@ -5,7 +5,6 @@ runner([ { script: './tests/bm-extracted.js', timeout: 3000 }, { script: './tests/basic.js' }, { script: './tests/once.js' }, - { script: './tests/extracted-on.js' }, { script: './tests/arguments.js' }, { script: './tests/late.js' }, { script: './tests/late-memory.js' }, @@ -14,4 +13,10 @@ runner([ { script: './tests/break.js' }, { script: './tests/bind-off.js' }, { script: './tests/prioritized.js' }, + { script: './tests/extracted-emit.js' }, + { script: './tests/extracted-on.js' }, + { script: './tests/extracted-once.js' }, + { script: './tests/extracted-all.js' }, + { script: './tests/wait.js', timeout: 3000 }, + { script: './tests/wait-timeout.js', timeout: 3000 }, ]).then(() => console.log('bye!')) diff --git a/tests/_setup.js b/tests/_setup.js index 82e636d..603b696 100644 --- a/tests/_setup.js +++ b/tests/_setup.js @@ -1,3 +1,3 @@ -export const BENCH_SIGNALS = 10 -export const BENCH_LISTENERS_PER_SIG = 10 +export const BENCH_SIGNALS = 1 +export const BENCH_LISTENERS_PER_SIG = 500 export const BENCH_EMITS_PER_SIG = 10000 diff --git a/tests/bm-extracted.js b/tests/bm-extracted.js index b5fcc68..d4e301c 100644 --- a/tests/bm-extracted.js +++ b/tests/bm-extracted.js @@ -13,7 +13,7 @@ execute('bench extracted .on()', async (success, fail) => { for (let i = 0; i < BENCH_SIGNALS; i++) { _s = new Signal() - const _sub = _s.subscriber() + const _sub = _s.extractOn() for (let j = 0; j < BENCH_LISTENERS_PER_SIG; j++) { listeners.push(_sub(() => hits++)) } diff --git a/tests/extracted-all.js b/tests/extracted-all.js new file mode 100644 index 0000000..e1ea939 --- /dev/null +++ b/tests/extracted-all.js @@ -0,0 +1,25 @@ +import { execute } from 'test-a-bit' +import Signal from '../src/signal.js' + +execute('extracted all', async (success, fail) => { + const sig = new Signal() + + let calls = 0 + + const emit = sig.extractEmit() + const on = sig.extractOn() + const once = sig.extractOnce() + + on(() => calls++) + once(() => calls++) + + emit() + emit() + emit() + + calls === 4 + ? success('sugar fired 4 times') + : fail('sugar fired ' + calls + ' times instead of 4') + + fail('no signal') +}) diff --git a/tests/extracted-emit.js b/tests/extracted-emit.js new file mode 100644 index 0000000..da59404 --- /dev/null +++ b/tests/extracted-emit.js @@ -0,0 +1,22 @@ +import { execute } from 'test-a-bit' +import Signal from '../src/signal.js' + +execute('extracted .emit()', async (success, fail) => { + const sig = new Signal() + + let calls = 0 + + const emit = sig.extractEmit() + + sig.on(() => calls++) + + emit() + emit() + emit() + + calls === 3 + ? success('sugar fired 3 times') + : fail('sugar fired ' + calls + ' times instead of 3') + + fail('no signal') +}) diff --git a/tests/extracted-on.js b/tests/extracted-on.js index 91d14c3..9efb6bf 100644 --- a/tests/extracted-on.js +++ b/tests/extracted-on.js @@ -4,7 +4,7 @@ import Signal from '../src/signal.js' execute('extracted .on()', async (success, fail) => { const sig = new Signal() - const sugared = sig.subscriber() + const sugared = sig.extractOn() sugared(() => success('signal fired')) diff --git a/tests/extracted-once.js b/tests/extracted-once.js new file mode 100644 index 0000000..3ff0a4f --- /dev/null +++ b/tests/extracted-once.js @@ -0,0 +1,22 @@ +import { execute } from 'test-a-bit' +import Signal from '../src/signal.js' + +execute('extracted .once()', async (success, fail) => { + const sig = new Signal() + + let calls = 0 + + const sugared = sig.extractOnce() + + sugared(() => calls++) + + sig.emit() + sig.emit() + sig.emit() + + calls === 1 + ? success('sugar fired once') + : fail('sugar fired ' + calls + ' times instead of 1') + + fail('no signal') +}) diff --git a/tests/wait-timeout.js b/tests/wait-timeout.js new file mode 100644 index 0000000..8958053 --- /dev/null +++ b/tests/wait-timeout.js @@ -0,0 +1,17 @@ +import { execute } from 'test-a-bit' +import Signal from '../src/signal.js' + +execute(`don't wait 200ms`, async (success, fail) => { + const sig = new Signal() + + setTimeout(() => sig.emit(), 1000) + + try { + await sig.wait(200) + fail(`.wait() won't throw err`) + } catch (err) { + success(`right, wait can't wait`) + } + + fail('no signal') +}) diff --git a/tests/wait.js b/tests/wait.js new file mode 100644 index 0000000..be1e540 --- /dev/null +++ b/tests/wait.js @@ -0,0 +1,17 @@ +import { execute } from 'test-a-bit' +import Signal from '../src/signal.js' + +execute('try wait 200ms', async (success, fail) => { + const sig = new Signal() + + setTimeout(() => sig.emit(), 200) + + try { + await sig.wait() + success('.wait() works') + } catch (err) { + fail('oh, .wait() failed') + } + + fail('no signal') +})