loop-grid
Version:
An observable collection of looped event sequences shaped to a grid.
53 lines (43 loc) • 1.24 kB
JavaScript
var Observ = require('observ')
var ArrayGrid = require('array-grid')
module.exports = function (loopGrid) {
var scheduler = loopGrid.context.scheduler
var grid = loopGrid.grid
var loopLength = loopGrid.loopLength
var obs = Observ(ArrayGrid([], grid().shape, grid().stride))
var lastTriggeredAt = obs.lastTriggeredAt = {}
var recording = {}
var releaseScheduler = scheduler.onSchedule(onSchedule)
var removeWatcher = loopGrid.onEvent(function (data) {
lastTriggeredAt[data.id] = data.position
})
obs.destroy = function () {
releaseScheduler()
removeWatcher()
}
return obs
// / scoped
function onSchedule (schedule) {
var changed = false
Object.keys(lastTriggeredAt).forEach(function (key) {
var value = (lastTriggeredAt[key] > schedule.to - (loopLength() || 8))
if (value !== recording[key]) {
recording[key] = value
changed = true
}
})
if (changed) {
var data = []
grid().data.forEach(applyTrueIfLookup, {
lookup: recording,
target: data
})
obs.set(ArrayGrid(data, grid().shape))
}
}
}
function applyTrueIfLookup (value, index) {
if (this.lookup[value]) {
this.target[index] = true
}
}