processConfig = (config, seed) => {
const shuffler = d3.shuffler(createRandomizer(seed));
const people = Object.entries(config);
const requires = people
.map(([from, config]) => ({ from, to: config?.require }))
.filter((d) => !!d.to);
const resolved = requires.map(({ to, from }) => [to, from]).flat();
const names = people
.map(([name]) => name)
.filter((name) => !resolved.includes(name));
const rest = names
.map((from, i) => removeAtIndex(names, i).map((to) => ({ from, to })))
.map((group, i) => ({
group,
config: config[names[i]]
}))
.map(({ group, config }) =>
group
.filter((d) => (!!config?.require ? d.to === config.require : true))
.filter((d) => !forceArray(config?.exclude).includes(d.to))
)
.reduce((results, group) => {
const used = results.map((d) => d.to);
console.log({ results, used, group });
const options = group.filter((d) => !used.includes(d.to));
const result = shuffler(options)[0];
return [...results, result];
}, []);
return [...requires, ...rest];
}