using System;

namespace KYFramework
{
    public interface IAwakeSystem
    {
        Type Type();
    }

    public interface IAwake
    {
        void Run(object o);
    }

    public interface IAwake<A>
    {
        void Run(object o, A a);
    }

    public interface IAwake<A, B>
    {
        void Run(object o, A a, B b);
    }

    public interface IAwake<A, B, C>
    {
        void Run(object o, A a, B b, C c);
    }

    public abstract class AwakeSystem<T> : IAwakeSystem, IAwake
    {
        public Type Type()
        {
            return typeof(T);
        }

        public void Run(object o)
        {
            this.Awake((T)o);
        }

        public abstract void Awake(T self);
    }

    public abstract class AwakeSystem<T, A> : IAwakeSystem, IAwake<A>
    {
        public Type Type()
        {
            return typeof(T);
        }

        public void Run(object o, A a)
        {
            this.Awake((T)o, a);
        }

        public abstract void Awake(T self, A worldInitSo);
    }

    public abstract class AwakeSystem<T, A, B> : IAwakeSystem, IAwake<A, B>
    {
        public Type Type()
        {
            return typeof(T);
        }

        public void Run(object o, A a, B b)
        {
            this.Awake((T)o, a, b);
        }

        public abstract void Awake(T self, A a, B b);
    }

    public abstract class AwakeSystem<T, A, B, C> : IAwakeSystem, IAwake<A, B, C>
    {
        public Type Type()
        {
            return typeof(T);
        }

        public void Run(object o, A a, B b, C c)
        {
            this.Awake((T)o, a, b, c);
        }

        public abstract void Awake(T self, A a, B b, C c);
    }
}