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