public static SimpleCoroutineAwaiter <T> GetAwaiter <T>(this IEnumerator <T> coroutine)
    {
        var awaiter = new SimpleCoroutineAwaiter <T>();

        UnityScheduler.Run(() => AsyncCoroutineRunner.Instance.StartCoroutine(
                               new CoroutineWrapper <T>(coroutine, awaiter).Run()));
        return(awaiter);
    }
    public static SimpleCoroutineAwaiter <UnityEngine.Object> GetAwaiter(this AssetBundleRequest instruction)
    {
        var awaiter = new SimpleCoroutineAwaiter <UnityEngine.Object>();

        UnityScheduler.Run(() => AsyncCoroutineRunner.Instance.StartCoroutine(
                               InstructionWrappers.AssetBundleRequest(awaiter, instruction)));
        return(awaiter);
    }
    static SimpleCoroutineAwaiter <T> GetAwaiterReturnSelf <T>(T instruction)
    {
        var awaiter = new SimpleCoroutineAwaiter <T>();

        UnityScheduler.Run(() => AsyncCoroutineRunner.Instance.StartCoroutine(
                               InstructionWrappers.ReturnSelf(awaiter, instruction)));
        return(awaiter);
    }
        public void Complete(T result, Exception e)
        {
            Assert(!_isDone);

            _isDone    = true;
            _exception = e;
            _result    = result;

            // Always trigger the continuation on the unity thread when awaiting on unity yield
            // instructions
            if (_continuation != null)
            {
                UnityScheduler.Run(_continuation);
            }
        }