Skip to content

Instantly share code, notes, and snippets.

@thiagoa
Last active July 20, 2017 03:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save thiagoa/3db617fd341cf26abc765471c842e3ec to your computer and use it in GitHub Desktop.
Save thiagoa/3db617fd341cf26abc765471c842e3ec to your computer and use it in GitHub Desktop.
const test = require('tape');
function resolver(deps) {
function directDeps(className) {
return deps[className] || [];
}
function transitiveDeps(className) {
return directDeps(className).reduce((set, className) => {
[className, ...transitiveDeps(className)].forEach((v) => set.add(v));
return set;
}, new Set());
}
function resolve(className) {
return [...transitiveDeps(className)].sort();
}
function resolveAll() {
return Object.keys(deps).reduce((transitiveDeps, className) => {
transitiveDeps[className] = resolve(className);
return transitiveDeps;
}, {});
}
return { resolveAll };
}
test('resolves dependencies for any given class', (assert) => {
deps = resolver({
A: ['B', 'C'],
B: ['C', 'E'],
C: ['G'],
D: ['A', 'F'],
E: ['F'],
F: ['H']
});
assert.deepEqual(deps.resolveAll(), {
A: ['B', 'C', 'E', 'F', 'G', 'H'],
B: ['C', 'E', 'F', 'G', 'H'],
C: ['G'],
D: ['A', 'B', 'C', 'E', 'F', 'G', 'H'],
E: ['F', 'H'],
F: ['H']
});
assert.end();
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment