function pubsubber() {
const subscribers = []
return {
subscribe,
once,
publish
}
function subscribe(subscriber) {
subscribers.push(subscriber)
return unsubscribe.bind(null, subscriber)
}
function once(subscriber) {
const unsub = subscribe((...args) => {
subscriber(...args)
unsub()
})
return unsub
}
function publish(...args) {
subscribers.forEach(subscriber => subscriber(...args))
}
function unsubscribe(fn) {
const idx = subscribers.indexOf(fn)
if (idx) {
subscribers.splice(idx, 1)
}
}
}
const pubsub = pubsubber()
const unsubscribe = pubsub.subscribe(value => {
console.log('every', value)
})
pubsub.once(value => {
console.log('once', value)
})
pubsub.publish('Hello')
// => 'every Hello'
// => 'once Hello'
pubsub.publish('World')
// => 'every World'
unsubscribe()
pubsub.publish('Something')
// Nothing