/*
 * @author Ranides Atterwim <ranides@gmail.com>
 * @copyright Ranides Atterwim
 * @license WTFPL
 * @url http://ranides.net/projects/assira
 */
package net.ranides.assira.events;

import java.util.function.Consumer;
import java.util.function.Function;

/**
 * Interfejs reprezentujący obiekt nasłuchujący na wystąpienie zdarzeń określonej
 * klasy (lub klasy pochodnej). 
 * @param <T> typ obsługiwanych zdarzeń
 * @author ranides
 */
public interface EventListener<T extends Event> {

    /**
     * Metoda implementująca reakcję na zdarzenie. Należy zwrócić uwagę, że
     * wątek, w którym metoda zostanie wywołana, może być trudny do ustalenia.
     * <p>Dokładniej rzecz ujmując: o tym, w jakim wątku zostanie wywołana 
     * metoda decyduje {@link EventRouter}, do którego {@code Listener}
     * został podpięty. Jeśli podpięto obiekt do wielu {@code EventRouter}'ów,
     * to każdy może zostać wywołany w zupełnie innym kontekście.</p>
     * @param event
     */
    void handleEvent(T event);
    
    default <R> Consumer<R> consumer(Function<? super R, ? extends T> function) {
        return r -> { handleEvent(function.apply(r)); };
    }
    
}
