using System;

namespace ET
{
	public interface IEvent
	{
		Type Type { get; }
	}
	
	public abstract class AEvent<A>: IEvent where A: struct
	{
		public Type Type
		{
			get
			{
				return typeof (A);
			}
		}

		protected abstract ETTask Run(Scene scene, A a);

		public async ETTask Handle(Scene scene, A a)
		{
			try
			{
				await Run(scene, a);
			}
			catch (Exception e)
			{
				Log.Error(e);
			}
		}
	}

    public abstract class BEvent<A>: IEvent
    {
        public Type Type
        {
            get
            {
                return typeof(A);
            }
        }

        public abstract ETTask OnEvent(A a);
    }
}