work = {
const result = []
const queue = _.difference(nodes, _.map(dependencies, 1))
let edges = [...dependencies]
let workers = []
const time = part => 60 + part.charCodeAt(0) - 64
function getWork() {
while (workers.length < 5 && queue.length) {
const part = queue.shift()
workers.push({ part, remaining: time(part), i: workers.length })
}
}
getWork()
let t = 0
while (workers.length) {
const done = workers.filter(worker => {
worker.remaining--
return worker.remaining <= 0
})
for (const { part } of done) {
const [ resolved, remaining ] = _.partition(edges, d => d[0] === part)
const next = _.difference(_.map(resolved, 1), _.map(edges = remaining, 1))
queue.push(...next)
}
if (done.length) {
workers = _.difference(workers, done)
getWork()
}
t++
for (const worker of workers) {
result.push({ t, worker: {...worker} })
}
}
return result
}