package de.accso.flexinale.common.api.eventbus;

import de.accso.flexinale.common.api.event.Event;

@SuppressWarnings("unused")
public interface EventPublisher<E1 extends Event> {

    String getName();

    void post(Class<E1> eventType, E1 event);

    interface EventPublisher2<E1 extends Event, E2 extends Event>
            extends EventPublisher<E1> {
        void post2(Class<E2> eventType, E2 event);
    }

    interface EventPublisher3<E1 extends Event, E2 extends Event, E3 extends Event>
            extends EventPublisher2<E1, E2> {
        void post3(Class<E3> eventType, E3 event);
    }

    interface EventPublisher4<E1 extends Event, E2 extends Event, E3 extends Event, E4 extends Event>
            extends EventPublisher3<E1, E2, E3> {
        void post4(Class<E4> eventType, E4 event);
    }

    interface EventPublisher5<E1 extends Event, E2 extends Event, E3 extends Event, E4 extends Event,
            E5 extends Event>
            extends EventPublisher4<E1, E2, E3, E4> {
        void post5(Class<E5> eventType, E5 event);
    }

    interface EventPublisher6<E1 extends Event, E2 extends Event, E3 extends Event, E4 extends Event,
            E5 extends Event, E6 extends Event>
            extends EventPublisher5<E1, E2, E3, E4, E5> {
        void post6(Class<E6> eventType, E6 event);
    }

    interface EventPublisher7<E1 extends Event, E2 extends Event, E3 extends Event, E4 extends Event,
            E5 extends Event, E6 extends Event, E7 extends Event>
            extends EventPublisher6<E1, E2, E3, E4, E5, E6> {
        void post7(Class<E7> eventType, E7 event);
    }

    interface EventPublisher8<E1 extends Event, E2 extends Event, E3 extends Event, E4 extends Event,
            E5 extends Event, E6 extends Event, E7 extends Event, E8 extends Event>
            extends EventPublisher7<E1, E2, E3, E4, E5, E6, E7> {
        void post8(Class<E8> eventType, E8 event);
    }

    interface EventPublisher9<E1 extends Event, E2 extends Event, E3 extends Event, E4 extends Event,
            E5 extends Event, E6 extends Event, E7 extends Event, E8 extends Event, E9 extends Event>
            extends EventPublisher8<E1, E2, E3, E4, E5, E6, E7, E8> {
        void post9(Class<E9> eventType, E9 event);
    }
}