/*******************************************************************************
* Copyright (c) 2016 Bruno Medeiros and other Contributors.
* 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:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package melnorme.lang.tooling.common.ops;
import java.util.function.Function;
import melnorme.lang.tooling.common.ops.IOperationMonitor.IOperationSubMonitor;
import melnorme.utilbox.concurrency.IRunnableFuture2;
import melnorme.utilbox.concurrency.OperationCancellation;
import melnorme.utilbox.core.CommonException;
import melnorme.utilbox.core.fntypes.OperationResult;
/**
* An operation which return a RET object upon successfull completion.
*
* @param <RET>
*/
public interface ResultOperation<RET> extends Function<IOperationMonitor, OperationResult<RET>> {
public abstract RET callOp(IOperationMonitor om) throws CommonException, OperationCancellation;
/** Execute this operation to a {@link OperationResult} object. */
@Override
default OperationResult<RET> apply(IOperationMonitor om) {
try {
return new OperationResult<>(callOp(om));
} catch(CommonException e) {
return new OperationResult<>(null, e);
} catch(OperationCancellation e) {
return new OperationResult<>(null, e);
}
}
default OperationResult<RET> executeToResult(IOperationMonitor om) {
return apply(om);
}
/* ----------------- ----------------- */
default IRunnableFuture2<OperationResult<RET>> toRunnableFuture(IOperationMonitor om) {
return OperationFuture.fromResultOperation(om, ResultOperation.this);
}
/* ----------------- ----------------- */
public default ResultOperation<RET> namedOperation(String taskName) {
return namedOperation(taskName, this);
}
public static <R> ResultOperation<R> namedOperation(String taskName, ResultOperation<R> subOp) {
return new ResultOperation<R>() {
@Override
public R callOp(IOperationMonitor om) throws CommonException, OperationCancellation {
try(IOperationSubMonitor subMonitor = om.enterSubTask(taskName)) {
return subOp.callOp(subMonitor);
}
}
};
}
}