/*******************************************************************************
* Copyright (c) 2012-2017 Codenvy, S.A.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Codenvy, S.A. - initial API and implementation
*******************************************************************************/
package org.eclipse.che.api.promises.client;
import org.eclipse.che.commons.annotation.Nullable;
/**
* A placeholder for a value that will be completed at a later time.
*
* @param <V>
* the type of the 'promised' value
* @author Mickaƫl Leduque
* @author Artem Zatsarynnyi
*/
public interface Promise<V> extends Thenable<V> {
/**
* Adds an action when the promise is fulfilled.<br>
* The action is added both to the original promise and the returned value, but the promises are not
* necessarily the same object.
*
* @param onFulfilled
* the fulfillment action added
* @return a promise equivalent to the original promise with the action added
*/
<B> Promise<B> then(Function<V, B> onFulfilled);
/**
* Allows to add another promise as action when this promise is fulfilled.
*
* @param onFulfilled
* the fulfillment action added. Function should return promise which
* will be evaluated to determine the state of the returned promise
* @return a promise, state which depends on the promise returned by {@code onFulfilled} function
* @see #then(Function)
*/
<B> Promise<B> thenPromise(Function<V, Promise<B>> onFulfilled);
/**
* Adds actions when the promise is fulfilled and rejected.<br>
* The actions are added both to the original promise and the returned value, but the promises are not
* necessarily the same object.
*
* @param onFulfilled
* the fulfillment action added
* @param onRejected
* the rejection action added
* @return a promise equivalent to the original promise with the actions added
*/
<B> Promise<B> then(@Nullable Function<V, B> onFulfilled, Function<PromiseError, B> onRejected);
/**
* Adds actions when the promise is rejected.
* <p>The action is added both to the original promise and the returned value, but the promises are not
* necessarily the same object.</p>
* <p>This is shorthand for {@code promise.then(null, onRejected)}.</p>
* <p>Note: the method name does not match the ES6 specification,
* obviously because <code>catch</code> can't be used in Java.
*
* @param onRejected
* the rejection action added
* @return a promise equivalent to the original promise with the rejection action added
*/
<B> Promise<B> catchError(Function<PromiseError, B> onRejected);
/**
* Allows to add another promise as action when this promise is rejected.
*
* @param onRejected
* the rejection action added. Function should return promise which
* will be evaluated to determine the state of the returned promise.
* @return a promise, state which depends on the promise returned by {@code onRejected} function
* @see #catchError(Function)
*/
<B> Promise<B> catchErrorPromise(Function<PromiseError, Promise<B>> onRejected);
/**
* @see #then(Function)
*/
Promise<V> then(Operation<V> onFulfilled);
/**
* @see #then(Function, Function)
*/
Promise<V> then(Operation<V> onFulfilled, Function<PromiseError, V> onRejected);
/**
* @see #then(Function, Function)
*/
Promise<V> then(Operation<V> onFulfilled, Operation<PromiseError> onRejected);
/**
* @see #then(Function)
*/
<B> Promise<B> then(Thenable<B> thenable);
/**
* @see #catchError(Function)
*/
Promise<V> catchError(Operation<PromiseError> onRejected);
}