{"version":3,"file":"GroupAnimation.mjs","sources":["../../../src/animation/GroupAnimation.ts"],"sourcesContent":["import { AnimationPlaybackControls, TimelineWithFallback } from \"./types\"\n\ntype PropNames =\n    | \"time\"\n    | \"speed\"\n    | \"duration\"\n    | \"attachTimeline\"\n    | \"startTime\"\n    | \"state\"\n\nexport type AcceptedAnimations = AnimationPlaybackControls\n\nexport type GroupedAnimations = AcceptedAnimations[]\n\nexport class GroupAnimation implements AnimationPlaybackControls {\n    animations: GroupedAnimations\n\n    constructor(animations: Array<AcceptedAnimations | undefined>) {\n        this.animations = animations.filter(Boolean) as GroupedAnimations\n    }\n\n    get finished() {\n        return Promise.all(\n            this.animations.map((animation) => animation.finished)\n        )\n    }\n\n    /**\n     * TODO: Filter out cancelled or stopped animations before returning\n     */\n    private getAll(propName: PropNames) {\n        return this.animations[0][propName] as any\n    }\n\n    private setAll(propName: PropNames, newValue: any) {\n        for (let i = 0; i < this.animations.length; i++) {\n            ;(this.animations[i][propName] as any) = newValue\n        }\n    }\n\n    attachTimeline(timeline: TimelineWithFallback) {\n        const subscriptions = this.animations.map((animation) =>\n            animation.attachTimeline(timeline)\n        )\n\n        return () => {\n            subscriptions.forEach((cancel, i) => {\n                cancel && cancel()\n                this.animations[i].stop()\n            })\n        }\n    }\n\n    get time() {\n        return this.getAll(\"time\")\n    }\n\n    set time(time: number) {\n        this.setAll(\"time\", time)\n    }\n\n    get speed() {\n        return this.getAll(\"speed\")\n    }\n\n    set speed(speed: number) {\n        this.setAll(\"speed\", speed)\n    }\n\n    get state() {\n        return this.getAll(\"state\")\n    }\n\n    get startTime() {\n        return this.getAll(\"startTime\")\n    }\n\n    get duration() {\n        return getMax(this.animations, \"duration\")\n    }\n\n    get iterationDuration() {\n        return getMax(this.animations, \"iterationDuration\")\n    }\n\n    private runAll(\n        methodName: keyof Omit<\n            AnimationPlaybackControls,\n            PropNames | \"then\" | \"finished\" | \"iterationDuration\"\n        >\n    ) {\n        this.animations.forEach((controls) => controls[methodName]())\n    }\n\n    play() {\n        this.runAll(\"play\")\n    }\n\n    pause() {\n        this.runAll(\"pause\")\n    }\n\n    // Bound to accomadate common `return animation.stop` pattern\n    stop = () => this.runAll(\"stop\")\n\n    cancel() {\n        this.runAll(\"cancel\")\n    }\n\n    complete() {\n        this.runAll(\"complete\")\n    }\n}\n\nfunction getMax(\n    animations: GroupedAnimations,\n    propName: \"iterationDuration\" | \"duration\"\n): number {\n    let max = 0\n\n    for (let i = 0; i < animations.length; i++) {\n        const value = animations[i][propName]\n        if (value !== null && value > max) {\n            max = value\n        }\n    }\n    return max\n}\n"],"names":[],"mappings":"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"}