batching-toposort
Version:
Efficiently sort interdependent tasks into a sequence of concurrently-executable batches.
27 lines (23 loc) • 654 B
JavaScript
const countInDegrees = dag => {
const counts = {}
Object.entries(dag).forEach(([vx, dependents]) => {
counts[vx] = counts[vx] || 0
dependents.forEach(dependent => {
counts[dependent] = counts[dependent] || 0
counts[dependent]++
})
})
return counts
}
const filterByDegree = predicate => counts =>
Object.entries(counts)
.filter(([_, deg]) => predicate(deg))
.map(([id, _]) => id)
const getRoots = filterByDegree(deg => deg === 0)
const getNonRoots = filterByDegree(deg => deg !== 0)
module.exports = {
countInDegrees,
getRoots,
getNonRoots,
}