import { __extends } from "tslib"; 
 | 
import Eventful from '../core/Eventful.js'; 
 | 
import requestAnimationFrame from './requestAnimationFrame.js'; 
 | 
import Animator from './Animator.js'; 
 | 
export function getTime() { 
 | 
    return new Date().getTime(); 
 | 
} 
 | 
var Animation = (function (_super) { 
 | 
    __extends(Animation, _super); 
 | 
    function Animation(opts) { 
 | 
        var _this = _super.call(this) || this; 
 | 
        _this._running = false; 
 | 
        _this._time = 0; 
 | 
        _this._pausedTime = 0; 
 | 
        _this._pauseStart = 0; 
 | 
        _this._paused = false; 
 | 
        opts = opts || {}; 
 | 
        _this.stage = opts.stage || {}; 
 | 
        return _this; 
 | 
    } 
 | 
    Animation.prototype.addClip = function (clip) { 
 | 
        if (clip.animation) { 
 | 
            this.removeClip(clip); 
 | 
        } 
 | 
        if (!this._head) { 
 | 
            this._head = this._tail = clip; 
 | 
        } 
 | 
        else { 
 | 
            this._tail.next = clip; 
 | 
            clip.prev = this._tail; 
 | 
            clip.next = null; 
 | 
            this._tail = clip; 
 | 
        } 
 | 
        clip.animation = this; 
 | 
    }; 
 | 
    Animation.prototype.addAnimator = function (animator) { 
 | 
        animator.animation = this; 
 | 
        var clip = animator.getClip(); 
 | 
        if (clip) { 
 | 
            this.addClip(clip); 
 | 
        } 
 | 
    }; 
 | 
    Animation.prototype.removeClip = function (clip) { 
 | 
        if (!clip.animation) { 
 | 
            return; 
 | 
        } 
 | 
        var prev = clip.prev; 
 | 
        var next = clip.next; 
 | 
        if (prev) { 
 | 
            prev.next = next; 
 | 
        } 
 | 
        else { 
 | 
            this._head = next; 
 | 
        } 
 | 
        if (next) { 
 | 
            next.prev = prev; 
 | 
        } 
 | 
        else { 
 | 
            this._tail = prev; 
 | 
        } 
 | 
        clip.next = clip.prev = clip.animation = null; 
 | 
    }; 
 | 
    Animation.prototype.removeAnimator = function (animator) { 
 | 
        var clip = animator.getClip(); 
 | 
        if (clip) { 
 | 
            this.removeClip(clip); 
 | 
        } 
 | 
        animator.animation = null; 
 | 
    }; 
 | 
    Animation.prototype.update = function (notTriggerFrameAndStageUpdate) { 
 | 
        var time = getTime() - this._pausedTime; 
 | 
        var delta = time - this._time; 
 | 
        var clip = this._head; 
 | 
        while (clip) { 
 | 
            var nextClip = clip.next; 
 | 
            var finished = clip.step(time, delta); 
 | 
            if (finished) { 
 | 
                clip.ondestroy(); 
 | 
                this.removeClip(clip); 
 | 
                clip = nextClip; 
 | 
            } 
 | 
            else { 
 | 
                clip = nextClip; 
 | 
            } 
 | 
        } 
 | 
        this._time = time; 
 | 
        if (!notTriggerFrameAndStageUpdate) { 
 | 
            this.trigger('frame', delta); 
 | 
            this.stage.update && this.stage.update(); 
 | 
        } 
 | 
    }; 
 | 
    Animation.prototype._startLoop = function () { 
 | 
        var self = this; 
 | 
        this._running = true; 
 | 
        function step() { 
 | 
            if (self._running) { 
 | 
                requestAnimationFrame(step); 
 | 
                !self._paused && self.update(); 
 | 
            } 
 | 
        } 
 | 
        requestAnimationFrame(step); 
 | 
    }; 
 | 
    Animation.prototype.start = function () { 
 | 
        if (this._running) { 
 | 
            return; 
 | 
        } 
 | 
        this._time = getTime(); 
 | 
        this._pausedTime = 0; 
 | 
        this._startLoop(); 
 | 
    }; 
 | 
    Animation.prototype.stop = function () { 
 | 
        this._running = false; 
 | 
    }; 
 | 
    Animation.prototype.pause = function () { 
 | 
        if (!this._paused) { 
 | 
            this._pauseStart = getTime(); 
 | 
            this._paused = true; 
 | 
        } 
 | 
    }; 
 | 
    Animation.prototype.resume = function () { 
 | 
        if (this._paused) { 
 | 
            this._pausedTime += getTime() - this._pauseStart; 
 | 
            this._paused = false; 
 | 
        } 
 | 
    }; 
 | 
    Animation.prototype.clear = function () { 
 | 
        var clip = this._head; 
 | 
        while (clip) { 
 | 
            var nextClip = clip.next; 
 | 
            clip.prev = clip.next = clip.animation = null; 
 | 
            clip = nextClip; 
 | 
        } 
 | 
        this._head = this._tail = null; 
 | 
    }; 
 | 
    Animation.prototype.isFinished = function () { 
 | 
        return this._head == null; 
 | 
    }; 
 | 
    Animation.prototype.animate = function (target, options) { 
 | 
        options = options || {}; 
 | 
        this.start(); 
 | 
        var animator = new Animator(target, options.loop); 
 | 
        this.addAnimator(animator); 
 | 
        return animator; 
 | 
    }; 
 | 
    return Animation; 
 | 
}(Eventful)); 
 | 
export default Animation; 
 |