package xapi.event.api;
import xapi.collect.api.IntTo;
import xapi.util.api.RemovalHandler;
import static xapi.collect.X_Collect.newSet;
import static xapi.util.api.SerializableWrapper.serializableId;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* Created by James X. Nelson (james @wetheinter.net) on 7/16/16.
*/
public class RemovableEventHandler <Source, Event extends IsEvent<Source>> implements EventHandler<Source, Event>,
Serializable, RemovalHandler {
private final EventHandler<Source, Event> lambda;
private final IntTo<RemovalHandler> removers;
private final Serializable id;
public RemovableEventHandler(@NotNull EventHandler<Source, Event> lambda) {
this(lambda, lambda);
}
public RemovableEventHandler(@NotNull Serializable id, @NotNull EventHandler<Source, Event> lambda) {
this.lambda = lambda;
this.id = serializableId(id);
removers = newSet(RemovalHandler.class);
}
@Override
public boolean handleEvent(Event e) {
return lambda.handleEvent(e);
}
@Override
public void storeRemover(RemovalHandler remover) {
removers.add(remover);
}
public void remove() {
removers.removeAll(RemovalHandler::remove);
}
@Override
public boolean equals(Object o) {
if (this == o)
return true;
if (!(o instanceof RemovableEventHandler))
return false;
final RemovableEventHandler<?, ?> that = (RemovableEventHandler<?, ?>) o;
return id.equals(that.id);
}
@Override
public int hashCode() {
return id.hashCode();
}
}