djembe
Version:
A rhythm maker which emits any data with the given rhythm periodically
83 lines (62 loc) • 1.58 kB
JavaScript
import { epicles } from 'epicles';
const DEFAULT_OPTIONS = {
steps: 32,
steppers: 7,
ticks: [],
};
export function Djembe(opts = {}) {
let subscribers = [];
const options = {
...DEFAULT_OPTIONS,
...opts,
};
const {
steps,
steppers,
initialState,
} = options;
let { ticks } = options;
const epicle = epicles({
steps,
steppers,
initialState,
});
epicle.subscribe(handleTickEvents);
function handleTickEvents(events) {
const emittedTicks = ticks.filter((tick) => {
const shouldBeEmitted = !!events.find((event) => {
return (event.step === tick.step) && (event.stepper === tick.stepper);
});
return shouldBeEmitted;
});
const state = epicle.getState();
emit(emittedTicks, state);
}
function emit(ticks, state) {
subscribers.forEach((subscriber) => {
subscriber({
ticks,
state,
});
});
}
function tick() {
epicle.tick();
}
function subscribe(callback) {
if (subscribers.find(callback)) return;
subscribers.push(callback);
const unsubscribe = function () {
subscribers = subscribers.filter((subscriber) => subscriber !== callback);
};
return unsubscribe;
}
function setTicks (nextTicks) {
ticks = nextTicks;
}
return {
subscribe,
tick,
setTicks,
};
}