public static ITweenPromise Ease(float duration, Func <float, float> easing, MonoBehaviour owner = null)
        {
            var promise = new TweenPromise();

            if (owner == null)
            {
                owner = GetOrCacheTweenRunner();
            }
            owner.StartCoroutine(TweenCoroutine(duration, easing, promise));
            return(promise);
        }
        private static IEnumerator TweenCoroutine(float duration, Func <float, float> easing, TweenPromise tweenPromise)
        {
            float elapsed = 0;

            do
            {
                yield return(null);

                var progress   = Mathf.Min(1, elapsed / duration);
                var tweenValue = easing(progress);
                tweenPromise.ReportUpdate(tweenValue);
                elapsed += Time.deltaTime;
            } while (tweenPromise.CurState == RSG.PromiseState.Pending && elapsed < duration && !tweenPromise.StopRequested);
            if (tweenPromise.CurState == RSG.PromiseState.Pending)
            {
                tweenPromise.Resolve();
            }
        }