// --------- AssetBundle extension methods --------- //

        public static IPromise LoadAllAssetsPromise(this AssetBundle bundle)
        {
            var p       = Promise.Create();
            var request = bundle.LoadAllAssetsAsync();

            CoroutineExtensions.WaitUntil(request)
            .ThenDo(() => p.Resolve(request.allAssets));

            return(p);
        }
        public static IPromise LoadAssetPromise(this AssetBundle bundle, string assetName)
        {
            var p       = Promise.Create();
            var request = bundle.LoadAssetAsync(assetName);

            CoroutineExtensions.WaitUntil(request)
            .ThenDo(() => p.Resolve(request.asset));

            return(p);
        }
        public static IPromise WaitForCoroutine(IEnumerator coroutine)
        {
            if (!_instance)
            {
                Init();
            }

            var p = Promise.Create();

            _instance.StartCoroutine(_instance.WaitForCoroutine(coroutine, p));
            return(p);
        }
        // ReSharper disable once UnusedMember.Local
        private static IPromise LoadFromFileAsync(string bundlePath)
        {
            if (!LoadedBundles.ContainsKey(bundlePath))
            {
                LoadedBundles.Add(bundlePath, Promise.Create());
                var path    = Path.Combine(Application.streamingAssetsPath, bundlePath).Replace("\\", "/");
                var request = AssetBundle.LoadFromFileAsync(path);

                CoroutineExtensions.WaitUntil(request)
                .ThenDo(() =>
                {
                    Debug.Log($"Loaded AssetBundle at: {path}");
                    LoadedBundles[bundlePath].Resolve(request.assetBundle);
                });
            }

            return(LoadedBundles[bundlePath]);
        }
        public static IPromise LoadAsync(string path)
        {
#if UNITY_EDITOR
            if (!Application.isPlaying)
            {
                var promise = Promise.Create();
                promise.Resolve(Resources.Load(path));
                return(promise);
            }
#endif

            var p = Promise.Create();
            var resourceRequest = Resources.LoadAsync(path);

            CoroutineExtensions.WaitUntil(resourceRequest)
            .ThenLog("Loaded resource at: " + path)
            .ThenDo(() => p.Resolve(resourceRequest.asset));

            return(p);
        }