All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.asayama.gwt.angular.client.q.Promise Maven / Gradle / Ivy

package com.asayama.gwt.angular.client.q;

import com.asayama.gwt.jsni.client.Function;
import com.asayama.gwt.jsni.client.JSFunction;
import com.asayama.gwt.jsni.client.JSObject;
import com.google.gwt.core.shared.GWT;


public class Promise extends JSObject {
    
    protected Promise() {
    }

    public static interface Done {
        void call(V value);
    }

    public static interface Continue {
        X call(V value);
    }

    public static interface Fail {
        void call(Throwable cause);
    }

    public static interface Notify {
        void call(Progress progress);
    }

    public final  Promise then(Continue success) {
        return then(success, null, null);
    }

    public final Promise then(Fail fail) {
        return then(null, fail, null);
    }
    
    public final Promise then(Notify notify) {
        return then(null, null, notify);
    }
    
    public final Promise then(final Done success) {
        then(new Continue() {
            @Override
            public Object call(V value) {
                success.call(value);
                return null;
            }
        }, null, null);
        return this;
    }

    public final  Promise then(final Continue success, final Fail fail, final Notify notify) {
        Promise p = _then(
                success == null ? null : JSFunction.create(new Function() {

                    @Override
                    public Object call(Object... args) {
                        try {
                            Object object = (args == null || args.length == 0) ? null : args[0];
                            V value = HostedModeEnvelope.unwrap(object);
                            return HostedModeEnvelope.wrap(success.call(value));
                        } catch (Throwable e) {
                            GWT.log("Exception while calling promise success", e);
                            return null; //FIXME Determine the suitable behavior.
                        }
                    }
                }),
                fail == null ? null : JSFunction.create(new Function() {

                    @Override
                    public Object call(Object... args) {
                        try {
                            Object object = (args == null || args.length == 0) ? null : args[0];
                            Throwable value = HostedModeEnvelope.unwrap(object);
                            fail.call(value);
                            return HostedModeEnvelope.wrap(value);
                        } catch (Throwable e) {
                            GWT.log("Exception while calling promise fail", e);
                            return null; //FIXME Determine the suitable behavior.
                        }
                    }
                }),
                notify == null ? null : JSFunction.create(new Function() {

                    @Override
                    public Object call(Object... args) {
                        try {
                            Object object = (args == null || args.length == 0) ? null : args[0];
                            Progress value = HostedModeEnvelope.unwrap(object);
                            notify.call(value);
                            return HostedModeEnvelope.wrap(value);
                        } catch (Throwable e) {
                            GWT.log("Exception while calling promise notify", e);
                            return null; //FIXME Determine the suitable behavior.
                        }
                    }
                }));
        return p;
    }

    private final native  Promise _then(JSFunction fn1, JSFunction fn2, JSFunction fn3) /*-{
        return this.then(fn1, fn2, fn3);
    }-*/;
}