package com.doumee.lib_coremodel.binding.command; 
 | 
  
 | 
  
 | 
import io.reactivex.functions.Function; 
 | 
  
 | 
/** 
 | 
 * About : kelin的ResponseCommand 
 | 
 * 执行的命令事件转换 
 | 
 */ 
 | 
public class ResponseCommand<T, R> { 
 | 
  
 | 
    private BindingFunction<R> execute; 
 | 
    private Function<T, R> function; 
 | 
    private BindingFunction<Boolean> canExecute; 
 | 
  
 | 
    /** 
 | 
     * like {@link BindingCommand},but ResponseCommand can return result when command has executed! 
 | 
     * 
 | 
     * @param execute function to execute when event occur. 
 | 
     */ 
 | 
    public ResponseCommand(BindingFunction<R> execute) { 
 | 
        this.execute = execute; 
 | 
    } 
 | 
  
 | 
  
 | 
    public ResponseCommand(Function<T, R> execute) { 
 | 
        this.function = execute; 
 | 
    } 
 | 
  
 | 
  
 | 
    public ResponseCommand(BindingFunction<R> execute, BindingFunction<Boolean> canExecute) { 
 | 
        this.execute = execute; 
 | 
        this.canExecute = canExecute; 
 | 
    } 
 | 
  
 | 
  
 | 
    public ResponseCommand(Function<T, R> execute, BindingFunction<Boolean> canExecute) { 
 | 
        this.function = execute; 
 | 
        this.canExecute = canExecute; 
 | 
    } 
 | 
  
 | 
  
 | 
    public R execute() { 
 | 
        if (execute != null && canExecute()) { 
 | 
            return execute.call(); 
 | 
        } 
 | 
        return null; 
 | 
    } 
 | 
  
 | 
    private boolean canExecute() { 
 | 
        if (canExecute == null) { 
 | 
            return true; 
 | 
        } 
 | 
        return canExecute.call(); 
 | 
    } 
 | 
  
 | 
  
 | 
    public R execute(T parameter) throws Exception { 
 | 
        if (function != null && canExecute()) { 
 | 
            return function.apply(parameter); 
 | 
        } 
 | 
        return null; 
 | 
    } 
 | 
} 
 |