Skip to content

Instantly share code, notes, and snippets.

@cameronbourke
Last active December 4, 2015 01:29
Show Gist options
  • Save cameronbourke/a053e622221f63c9ca0d to your computer and use it in GitHub Desktop.
Save cameronbourke/a053e622221f63c9ca0d to your computer and use it in GitHub Desktop.
const heyListen = (() => {
let listeners = {
once: {},
on: {}
}
const _assignListener = (target, name, listener) => {
if(target[name]) {
target[name].push(listener);
} else {
target[name] = [listener];
}
};
const _executeListeners = (name, type, data) => {
if(listeners[type][name]) {
listeners[type][name].forEach((listener) => listener(data));
}
}
const getListeners = (name, type) => listeners[type || 'on'][name];
const removeListeners = (name, type) => listeners[type || 'on'][name] = [];
const on = (name, listener) => {
_assignListener(listeners.on, name, listener);
return () => {
listeners.on[name] = listeners.on[name].filter((l) => l !== listener);
};
};
const once = (name, listener) => {
_assignListener(listeners.once, name, listener);
};
const emit = (name, data) => {
_executeListeners(name, 'on', data);
_executeListeners(name, 'once', data);
listeners.once[name] = [];
};
return {
getListeners,
removeListeners,
on,
once,
emit
};
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment