https://github.com/sauldoescode/datagun
a tiny lighthearted solution to all your event emitting/receiving problems
https://github.com/sauldoescode/datagun
emitter es6-modules event-emitter events module tiny
Last synced: 12 months ago
JSON representation
a tiny lighthearted solution to all your event emitting/receiving problems
- Host: GitHub
- URL: https://github.com/sauldoescode/datagun
- Owner: SaulDoesCode
- Created: 2017-12-15T12:04:29.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2018-07-15T10:21:40.000Z (over 7 years ago)
- Last Synced: 2025-01-04T20:35:24.958Z (about 1 year ago)
- Topics: emitter, es6-modules, event-emitter, events, module, tiny
- Language: JavaScript
- Size: 10.7 KB
- Stars: 2
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# dataGun - a lighthearted tiny solution to all your event emitting/receiving problems
all in less than 24 lines of code
## Usage
```javascript
import dataGun from 'datagun'
const gun = dataGun()
gun(
'final-warning',
msg => console.warn(msg),
true // fire only once
)
gun.fire('final-warning', `Save your selves... It's the end!!!!`)
const toggler = {
toggle (state) { /* some logic/api */ }
}
const listener = gun('remoteTrigger', toggler.toggle)
// fire! ->--pew->-pew-->->
gun.fire('remoteTrigger', true)
// stop listening after 2 minutes
setTimeout(listener.stop, 60000 * 2)
```
## API
* emit - ``(dataGun() -> emitter).fire( eventName, ...data)``
* listen - ``(dataGun() -> emitter)(eventName, func, =runOnce) -> listener``
* stop listening - ``listener.stop()`` or ``emitter.listeners.del(eventName, func)``
#### Extra
* ``dataGun().listeners`` is a listMap
You can check or manipulate listeners via it.
listMap - ``dataGun.listMap() -> {del, has, each}``
**listMap** is just a utility to manage a ``Map`` that contains ``Set``s
```javascript
import dataGun from 'dataGun.mjs'
const lm = dataGun.listMap()
// set
lm('key', 'value0')
lm('key', 'value1')
// get
lm('key') // -> Set{'value0', 'value1'}
// get the base map
lm.map // -> Map{key: Set{...}}
// has
lm.has('key') // -> true
lm.has('key', 'value2') // -> false
// delete a value
lm.del('key', 'value0')
// or
lm('key').delete('value0')
// loop over contents
lm.each('key', value => {
console.log(value)
})
// value0
// value1
// ...
```
#### NOTE: datagun uses ES6 Modules
you might have to run node with ``--experimental-modules``
And no dependencies so no fuss!
##### MIT license
#### The Source:
```javascript
const callAsync = this.requestIdleCallback || this.setImmediate || setTimeout
const dataGun = (listeners = dataGun.listMap()) => Object.assign((evt, fn, one) => {
fn._one = one
fn.stop = listeners.del.bind(null, evt, fn)
listeners(evt, fn)
return fn
}, {
listeners,
fire (evt, ...data) {
callAsync(() => listeners.each(evt, h => {
h(...data)
if (h._one) h.stop()
}))
}
})
dataGun.listMap = (map = new Map()) => Object.assign((key, val) => val != null
? (map.has(key) ? map : map.set(key, new Set())).get(key).add(val) : map.get(key), {
del: (key, val) => (map.has(key) && map.get(key).delete(val).size < 1 && map.delete(key), val),
has: (key, val) => map.has(key) && (val == null || map.get(key).has(val)),
each (key, fn) { map.has(key) && map.get(key).forEach(fn) }
})
export default dataGun
```