#if LITMOTION_SUPPORT_UNITASK
using System.Threading;
using Cysharp.Threading.Tasks;
namespace LitMotion
{
    /// 
    /// Provides extension methods for UniTask integration.
    /// 
    public static class LitMotionUniTaskExtensions
    {
        /// 
        /// Convert motion handle to UniTask.
        /// 
        /// This motion handle
        /// CancellationToken
        /// 
        public static UniTask ToUniTask(this MotionHandle handle, CancellationToken cancellationToken = default)
        {
            if (!handle.IsActive()) return UniTask.CompletedTask;
            return new UniTask(UniTaskMotionConfiguredSource.Create(handle, CancelBehaviour.CancelAndCancelAwait, cancellationToken, out var token), token);
        }
        /// 
        /// Convert motion handle to UniTask.
        /// 
        /// This motion handle
        /// Behavior when canceling
        /// CancellationToken
        /// 
        public static UniTask ToUniTask(this MotionHandle handle, CancelBehaviour cancelBehaviour, CancellationToken cancellationToken = default)
        {
            if (!handle.IsActive()) return UniTask.CompletedTask;
            return new UniTask(UniTaskMotionConfiguredSource.Create(handle, cancelBehaviour, cancellationToken, out var token), token);
        }
        /// 
        /// Create a motion data and bind it to AsyncReactiveProperty.
        /// 
        /// The type of value to animate
        /// The type of special parameters given to the motion data
        /// The type of adapter that support value animation
        /// This builder
        /// Target object that implements IProgress
        /// Handle of the created motion data.
        public static MotionHandle BindToAsyncReactiveProperty(this MotionBuilder builder, AsyncReactiveProperty reactiveProperty)
            where TValue : unmanaged
            where TOptions : unmanaged, IMotionOptions
            where TAdapter : unmanaged, IMotionAdapter
        {
            Error.IsNull(reactiveProperty);
            return builder.BindWithState(reactiveProperty, static (x, target) =>
            {
                target.Value = x;
            });
        }
    }
}
#endif