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

/**
 * Interfejs reprezentujący strategię łączenia wielu zdarzeń, w jedno grupowe.
 * Idea złączania wielu następujących po sobie zdarzeń zbliżonego rodzaju jest 
 * między innymi intensywnie używana w blibliotece AWT oraz Swing - gdzie pozwala
 * uniknąć wielokrotnego przerysowywania tego samego elementu, albo wykonać
 * jedną operację przerysowania większego obszaru, zamiast dużej ilości odrysowań
 * "po kawałku".
 * 
 * <p>Złączanie ma realne zastosowanie wszędzie tam, gdzie można pominąć 
 * (albo złączyć) wiele kroków pośrednich, bo konsument jest zainteresowany
 * jedynie jak najszybszym powiadomieniem o osiągnięciu/otrzymaniu efektu końcowego.</p>
 * @author ranides
 */
public interface EventJoiner {
    
    /**
     * Sprawdza, czy dwa następujące po sobie zdarzenia można złączyć w jedno
     * @param first
     * @param second
     * @return
     */
    boolean isJoinable(Event first, Event second);
    
    /**
     * Łączy dwa podane komunikaty i zwraca wynik złączenia jako nowe - jedno - zdarzenie.
     * @param first
     * @param second
     * @return
     */
    Event join(Event first, Event second);
    
}
