Skip to content

Commit

Permalink
🍬 diabetes
Browse files Browse the repository at this point in the history
  • Loading branch information
vovchisko committed Sep 7, 2022
1 parent 548120d commit 028d8e6
Show file tree
Hide file tree
Showing 10 changed files with 156 additions and 8 deletions.
46 changes: 43 additions & 3 deletions src/signal.js
Original file line number Diff line number Diff line change
Expand Up @@ -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`
*/
Expand Down Expand Up @@ -83,7 +123,7 @@ export default class Signal {

/**
* Emit signal with any arguments
* @param {*} arguments
* @param {...[*]} arguments
*/
emit () {
this.stopped = false
Expand Down
7 changes: 6 additions & 1 deletion test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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' },
Expand All @@ -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!'))
4 changes: 2 additions & 2 deletions tests/_setup.js
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion tests/bm-extracted.js
Original file line number Diff line number Diff line change
Expand Up @@ -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++))
}
Expand Down
25 changes: 25 additions & 0 deletions tests/extracted-all.js
Original file line number Diff line number Diff line change
@@ -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')
})
22 changes: 22 additions & 0 deletions tests/extracted-emit.js
Original file line number Diff line number Diff line change
@@ -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')
})
2 changes: 1 addition & 1 deletion tests/extracted-on.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'))

Expand Down
22 changes: 22 additions & 0 deletions tests/extracted-once.js
Original file line number Diff line number Diff line change
@@ -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')
})
17 changes: 17 additions & 0 deletions tests/wait-timeout.js
Original file line number Diff line number Diff line change
@@ -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')
})
17 changes: 17 additions & 0 deletions tests/wait.js
Original file line number Diff line number Diff line change
@@ -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')
})

0 comments on commit 028d8e6

Please sign in to comment.