package xapi.event.impl;
import xapi.event.api.HasBeforeAfter;
import xapi.event.api.IsEvent;
import xapi.event.api.IsEventType;
import xapi.fu.Out3;
import static xapi.fu.Out3.out3;
/**
* Created by James X. Nelson (james @wetheinter.net) on 7/16/16.
*/
public interface ChangeEvent<Source, Type> extends IsEvent<Source>, HasBeforeAfter<Type> {
Out3<Source, Type, Type> values();
@Override
default Source getSource() {
return values().out1();
}
@Override
default Type getBefore() {
return values().out2();
}
@Override
default Type getAfter() {
return values().out3();
}
default UndoEvent<Source, Type> toUndo() {
return UndoEvent.undo(getSource(), getAfter(), getBefore());
}
@Override
default IsEventType getType() {
return EventTypes.Change;
}
static <S, T> ChangeEvent<S, T> change(S source, T before, T after) {
return () -> out3(source, before, after);
}
}