using UnityEngine;

namespace pdinklag
{
    /// <summary>
    /// Describes a value in the future.
    /// </summary>
    /// <typeparam name="T">the value type</typeparam>
    public class Future<T>
    {
        /// <summary>
        /// Tests whether a value is available.
        /// </summary>
        public bool HasValue { get; private set; }

        private T _value;

        /// <summary>
        /// Gets or sets the value.
        /// 
        /// Getting the value is only valid if HasValue returns true.
        /// If the value is set, HasValue is set to true.
        /// </summary>
        public T Value
        {
            get
            {
                if (!HasValue)
                {
                    Debug.LogError("reading value from a future that does not yet have a value");
                }
                return _value;
            }

            set
            {
                _value = value;
                HasValue = true;
            }
        }

        /// <summary>
        /// Constructs a future.
        /// </summary>
        public Future()
        {
            Reset();
        }

        /// <summary>
        /// Resets the future.
        /// It is then considered to have no value.
        /// </summary>
        public void Reset()
        {
            HasValue = false;
            _value = default(T);
        }
    }
}
