function macrotile_descendants(macrokey, size = 2, parents = 2) {
if (descendant_cache.has(macrokey)) {
return descendant_cache.get(macrokey);
}
const parent_tiles = [[macrokey]];
while (parent_tiles.length < parents) {
parent_tiles.unshift(parent_tiles[0].map(children).flat());
}
const sibling_tiles = [parent_tiles[0].map(children).flat()];
while (sibling_tiles.length < size) {
sibling_tiles.unshift(sibling_tiles[0].map(children).flat());
}
sibling_tiles.reverse();
const descendants = sibling_tiles.flat();
descendant_cache.set(macrokey, descendants);
return descendants;
}