- Call with single then
 - Call with single then and Java 8 lambda
 - Chained or piped promise
 - Parallel promise
 - Rejecting a promise
 - Failing a promise
 
<dependency>
    <groupId>nl.brusque.iou</groupId>
    <artifactId>iou-core</artifactId>
    <version>1.0.0-beta-01</version>
</dependency>compile 'nl.brusque.iou:iou-core:1.0.0-beta-01'
class TestTypedIOU<TInput> extends AbstractIOU<TInput> {
  ...
}
class TestTypedPromise<TInput> extends AbstractPromise<TInput> {
  ...
}
TestTypedIOU<Integer> iou = new TestTypedIOU<>();iou.getPromise()
    .then(new IThenCallable<Integer, Void>() {
        @Override
        public Void apply(Integer integer) throws Exception {
            System.out.println(integer);
            return null;
        }
    });
iou.resolve(42); // prints 42iou.getPromise()
    .then((Integer integer) -> {
        System.out.println(integer);
        return null;
    });
iou.resolve(42); // prints 42iou.getPromise()
    .then(new IThenCallable<Integer, Integer>() {
        @Override
        public Integer apply(Integer input) throws Exception {
            return input * 10;
        }
    })
    .then(new IThenCallable<Integer, String>() {
        @Override
        public String apply(Integer input) throws Exception {
            return String.format("The result: %d", input);
        }
    })
    .then(new IThenCallable<String, Void>() {
        @Override
        public Void apply(String input) throws Exception {
            System.out.println(input);
            return null;
        }
    });
iou.resolve(42); // prints "The result: 420"TestTypedPromise<Integer> promise = iou.getPromise();
promise
    .then(new IThenCallable<Integer, Void>() {
        @Override
        public Void apply(Integer input) throws Exception {
            System.out.println(input);
            return null;
        }
    });
promise
    .then(new IThenCallable<Integer, String>() {
        @Override
        public Void apply(Integer input) throws Exception {
            String result = String.format("%d * 10 = %d", input, input * 10);
            System.out.println(result);
            return result;
        }
    });
iou.resolve(42); // prints "42" and "42 * 10 = 420" in exactly this orderiou.getPromise()
    .then(new IThenCallable<Integer, Integer>() {
        @Override
        public Integer apply(Integer integer) throws Exception {
            return integer * 42;
        }
    }, new IThenCallable<Object, Void>() {
        @Override
        public Void apply(Object reason) throws Exception {
            System.out.println(String.format("%s I can't do that.", reason));
            return null;
        }
    });
iou.reject("I'm sorry, Dave."); // prints "I'm sorry, Dave. I can't do that."iou.getPromise()
    .then(new IThenCallable<Integer, Integer>() {
        @Override
        public Integer apply(Integer input) throws Exception {
            throw new Exception("I just don't care.");
        }
    })
    .then(new IThenCallable<Integer, Void>() {
        @Override
        public Void apply(Integer input) throws Exception {
            System.out.println("What would you say it is you do here?");
            return null;
        }
    }, new IThenCallable<Object, Void>() {
        @Override
        public Void apply(Object reason) throws Exception {
            System.out.println(
              String.format("It's not that I'm lazy, it's that %s",
                ((Exception)reason).getMessage()));
            return null;
        }
    });
iou.resolve(42); // prints "It's not that I'm lazy, it's that I just don't care."