function normalize(anims, offset = 0) {
let offsetKeyframe = ([tag, id, attribs, duration], offset = 0) => {
let delayWithOffset = (duration.delay || 0) + offset;
duration.delay = delayWithOffset;
return [[tag, id, attribs, duration], delayWithOffset + duration.duration];
}
function offsetSeq(tree, initOffset) {
let [result, sum] = tree.reduce(([acc, offset], next) => {
let [result, sum] = offsetDelays(next, offset);
let netOffset = sum;
acc.push(result);
return [acc, netOffset];
}, [[], initOffset]);
return [["seq", ...result], sum];
};
const offsetGroup = (contents, offset) => {
let grpResults = contents.map(val => offsetDelays(val, offset));
let newAnims = grpResults.map(x => x[0]);
let newOffset = grpResults.map(x => x[1]).reduce((x, y) => Math.max(x, y));
return [["grp", ...newAnims], newOffset];
};
let offsetDelays = (anims, offset) => {
let [tag, ...contents] = anims;
if(tag == "kf") return offsetKeyframe(anims, offset);
else if(tag == "grp") return offsetGroup(contents, offset);
else if(tag == "seq") { return offsetSeq(contents, offset); }
else throw Error("Unknown element passed");
};
let result = offsetDelays(anims, offset);
return result[0];
}