public static IUniTaskSource <U> Create(T target, Func <T, U> monitorFunction, IEqualityComparer <U> equalityComparer, PlayerLoopTiming timing, CancellationToken cancellationToken, out short token)
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    return(AutoResetUniTaskCompletionSource <U> .CreateFromCanceled(cancellationToken, out token));
                }

                if (!pool.TryPop(out var result))
                {
                    result = new WaitUntilValueChangedUnityObjectPromise <T, U>();
                }

                result.target = target;
                result.targetAsUnityObject = target as UnityEngine.Object;
                result.monitorFunction     = monitorFunction;
                result.currentValue        = monitorFunction(target);
                result.equalityComparer    = equalityComparer ?? UnityEqualityComparer.GetDefault <U>();
                result.cancellationToken   = cancellationToken;

                TaskTracker.TrackActiveTask(result, 3);

                PlayerLoopHelper.AddAction(timing, result);

                token = result.core.Version;
                return(result);
            }
        public static UniTask <U> WaitUntilValueChanged <T, U>(T target, Func <T, U> monitorFunction, PlayerLoopTiming monitorTiming = PlayerLoopTiming.Update, IEqualityComparer <U> equalityComparer = null, CancellationToken cancellationToken = default(CancellationToken))
            where T : class
        {
            var unityObject   = target as UnityEngine.Object;
            var isUnityObject = target is UnityEngine.Object; // don't use (unityObject == null)

            return(new UniTask <U>(isUnityObject
                ? WaitUntilValueChangedUnityObjectPromise <T, U> .Create(target, monitorFunction, equalityComparer, monitorTiming, cancellationToken, out var token)
                : WaitUntilValueChangedStandardObjectPromise <T, U> .Create(target, monitorFunction, equalityComparer, monitorTiming, cancellationToken, out token), token));
        }