package org.ntlab.radishforandroidstudio.framework.subject;

import android.view.InputEvent;

import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;

import org.ntlab.radishforandroidstudio.framework.event.MyEvent;
import org.ntlab.radishforandroidstudio.framework.listener.MyListener;

/**
 * Listenerへイベントを通知するクラス
 *
 * @author s.iwatani
 * @param <ListenerType> リスナの型
 * @param <EventType> イベントを保存する型
 */
public abstract class MySubject<ListenerType extends MyListener, EventType extends MyEvent> {
    protected Set<ListenerType> listenerSet = new CopyOnWriteArraySet<>();

    public MySubject() {}

    /**
     * リスナを追加する
     *
     * @author s.iwatani
     * @param listener
     */
    public void addListener(ListenerType listener) {
        listenerSet.add(listener);
    }

    /**
     * 指定したリスナを削除する
     *
     * @author s.iwatani
     * @param listener
     */
    public void removeListener(ListenerType listener) { listenerSet.remove(listener); };

    /**
     * リスナをすべて削除する
     *
     * @author s.iwatani
     */
    public void clearListener() { listenerSet.clear(); };

    /**
     * イベントを通知する
     *
     * @author s.iwatani
     * @param event イベントの情報を保存したもの
     */
    public void notifyListeners(EventType event) {
        for (ListenerType listener : listenerSet) {
            listener.onEvent(event);
        }
    }
}
