package com.project.shared.client.utils;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.project.shared.client.events.SimpleEvent.Handler;
import com.project.shared.data.funcs.AsyncFunc;
import com.project.shared.data.funcs.Func;
import com.project.shared.data.funcs.Func.Action;
public class HandlerUtils {
private static final Handler<Object> EMPTY_HANDLER = new Handler<Object>() {
@Override
public void onFire(Object arg) {
}
};
@SuppressWarnings("unchecked")
public static final <T> Handler<T> emptyHandler()
{
return (Handler<T>)HandlerUtils.EMPTY_HANDLER;
}
public static <T> Handler<T> chain(final Handler<T> a, final Handler<T> b) {
return new Handler<T>(){
@Override
public void onFire(T arg)
{
a.onFire(arg);
b.onFire(arg);
}};
}
public static <A,B> Handler<A> fromFunc(final Func<A, B> func) {
return new Handler<A>(){
@Override
public void onFire(A arg)
{
func.apply(arg);
}
};
}
public static <A,B> Handler<A> fromAsyncFunc(final AsyncFunc<A, B> func) {
return new Handler<A>(){
@Override
public void onFire(A arg)
{
func.run(arg);
}
};
}
public static <A> Func<A, Void> toFunc(final Handler<A> handler) {
return new Action<A>() {
@Override
public void exec(A arg)
{
handler.onFire(arg);
}
};
}
public static <A> AsyncFunc<A, Void> toAsyncFunc(final Handler<A> handler) {
return AsyncFunc.fromFunc(HandlerUtils.toFunc(handler));
}
public static <T> void fireDeferred(final Handler<T> handler, final T arg) {
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute()
{
handler.onFire(arg);
}
});
}
public static ClickHandler asClickHandler(final Handler<Void> handler) {
return new ClickHandler(){
@Override
public void onClick(ClickEvent event) {
handler.onFire(null);
}};
}
}