/* package whatever; // don't place package name! */
import java.util.* ;
import java.lang.* ;
import java.io.* ;
import java.util.function.Function ;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
interface Monad< T> {
public < U> Monad< U> bind( Function< T, Monad< U>> f) ;
}
class Maybe< T> implements Monad< T> {
public Maybe( T val) {
this .val = val;
}
public T getVal( ) {
return val;
}
@Override
public < U> Monad< U> bind( Function< T, Monad< U>> f) {
if ( val == null )
return new Maybe< U> ( null ) ;
return f.apply ( val) ;
}
private final T val;
}
{
Maybe< Integer> x = new Maybe<> ( 5 ) ;
Monad< Integer> y = x.bind ( v -> new Maybe< Integer> ( v+ 1 ) )
.bind ( v -> new Maybe< Integer> ( v* 2 ) ) ;
System .
out .
println ( ( ( Maybe
< Integer
> ) y
) .
getVal ( ) ) ; }
}
LyogcGFja2FnZSB3aGF0ZXZlcjsgLy8gZG9uJ3QgcGxhY2UgcGFja2FnZSBuYW1lISAqLwoKaW1wb3J0IGphdmEudXRpbC4qOwppbXBvcnQgamF2YS5sYW5nLio7CmltcG9ydCBqYXZhLmlvLio7CglpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOwoKLyogTmFtZSBvZiB0aGUgY2xhc3MgaGFzIHRvIGJlICJNYWluIiBvbmx5IGlmIHRoZSBjbGFzcyBpcyBwdWJsaWMuICovCmNsYXNzIElkZW9uZQp7CgppbnRlcmZhY2UgTW9uYWQ8VD4gewoJcHVibGljIDxVPiBNb25hZDxVPiBiaW5kKEZ1bmN0aW9uPFQsIE1vbmFkPFU+PiBmKTsKfQoKY2xhc3MgTWF5YmU8VD4gaW1wbGVtZW50cyBNb25hZDxUPiB7CglwdWJsaWMgTWF5YmUoVCB2YWwpIHsKCQl0aGlzLnZhbCA9IHZhbDsKCX0KCQoJcHVibGljIFQgZ2V0VmFsKCkgewoJCXJldHVybiB2YWw7Cgl9CgkKCUBPdmVycmlkZQoJcHVibGljIDxVPiBNb25hZDxVPiBiaW5kKEZ1bmN0aW9uPFQsIE1vbmFkPFU+PiBmKSB7CgkJaWYgKHZhbCA9PSBudWxsKQoJCQlyZXR1cm4gbmV3IE1heWJlPFU+KG51bGwpOwoJCXJldHVybiBmLmFwcGx5KHZhbCk7Cgl9CgkKCXByaXZhdGUgZmluYWwgVCB2YWw7Cn0KCgkKCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmdbXSBhcmdzKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgoJewoJCU1heWJlPEludGVnZXI+IHggPSBuZXcgTWF5YmU8Pig1KTsKCQlNb25hZDxJbnRlZ2VyPiB5ID0geC5iaW5kKHYgLT4gbmV3IE1heWJlPEludGVnZXI+KHYrMSkpCgkJICAgICAgICAgICAgICAgICAgICAuYmluZCh2IC0+IG5ldyBNYXliZTxJbnRlZ2VyPih2KjIpKTsKCQlTeXN0ZW0ub3V0LnByaW50bG4oICgoTWF5YmU8SW50ZWdlcj4peSkuZ2V0VmFsKCkgKTsKCX0KfQ==