/*
 * Copyright 2013 the original author or authors.
 *
 * Licensed under the MIT License (the "License"); you may not use this
 * file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 *     http://opensource.org/licenses/MIT
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.vertx.lang.php;

import org.vertx.java.core.AsyncResult;

/**
 * An implementation of the ArgumentWrapper interface
 * that wraps asynchronous results.
 *
 * @author Jordan Halterman
 */
public abstract class AsyncResultWrapper<T, E> implements ResultModifier<AsyncResult<T>, AsyncResult<E>> {

  @Override
  public AsyncResult<E> modify(final AsyncResult<T> result) {
    return new AsyncResult<E>() {

      @Override
      public Throwable cause() {
        return result.cause();
      }

      @Override
      public boolean failed() {
        return result.failed();
      }

      @Override
      public E result() {
        if (result.succeeded()) {
          return wrap(result.result());
        }
        return null;
      }

      @Override
      public boolean succeeded() {
        return result.succeeded();
      }

    };
  }

  /**
   * Wraps the result in the appropriate wrapper.
   */
  public abstract E wrap(T result);

}