import java.util.Iterator;
enum Unit {
Value;
}
interface F0<A> {
public A _();
}
abstract class F1<A, B> {
public abstract B _(A a);
}
abstract class F2<A, B, C> {
public abstract C _(A a, B b);
}
abstract class Maybe<A> {
public static <A> Maybe<A> unit(A value) {
return Just.of(value);
}
public abstract <B> Maybe<B> map(F1<A, B> f);
public abstract <B> Maybe<B> flatMap(F1<A, Maybe<B>> f);
public abstract A getOrElse(F0<A> alt);
public abstract Maybe<A> orElse(Maybe<A> alt);
public abstract <B> B fold(F1<A, B> f, F0<B> g);
public abstract Maybe<A> filter(F1<A, Boolean> pred);
}
class Just<A> extends Maybe<A> {
private final A value;
private Just(A value) {
this.value = value;
}
public static <A> Maybe<A> of(A value) {
return new Just<A>(value);
}
public <B> Maybe<B> map(F1<A, B> f) {
return new Just<B>(f._(value));
}
public <B> Maybe<B> flatMap(F1<A, Maybe<B>> f) {
return f._(value);
}
public A getOrElse(F0<A> alt) {
return value;
}
public Maybe<A> orElse(Maybe<A> alt) {
return this;
}
public <B> B fold(F1<A, B> f, F0<B> g) {
return f._(value);
}
public Maybe<A> filter(F1<A, Boolean> pred) {
if(pred._(value)) {
return this;
} else {
return Nothing.<A>value();
}
}
@Override
return String.
format("Just(%s)", value
); }
}
class Nothing<A> extends Maybe<A> {
private Nothing() {
}
public static <A> Maybe<A> value() {
return new Nothing<A>();
}
public <B> Maybe<B> map(F1<A, B> f) {
return new Nothing<B>();
}
public <B> Maybe<B> flatMap(F1<A, Maybe<B>> f) {
return new Nothing<B>();
}
public A getOrElse(F0<A> alt) {
return alt._();
}
public Maybe<A> orElse(Maybe<A> alt) {
return alt;
}
public <B> B fold(F1<A, B> f, F0<B> g) {
return g._();
}
public Maybe<A> filter(F1<A, Boolean> pred) {
return this;
}
return "Nothing";
}
}
aW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKCmVudW0gVW5pdCB7CiAgVmFsdWU7Cn0KCmludGVyZmFjZSBGMDxBPiB7CiAgcHVibGljIEEgXygpOwp9CgphYnN0cmFjdCBjbGFzcyBGMTxBLCBCPiB7CiAgcHVibGljIGFic3RyYWN0IEIgXyhBIGEpOwp9CgphYnN0cmFjdCBjbGFzcyBGMjxBLCBCLCBDPiB7CiAgcHVibGljIGFic3RyYWN0IEMgXyhBIGEsIEIgYik7Cn0KCmFic3RyYWN0IGNsYXNzIE1heWJlPEE+IHsKICBwdWJsaWMgc3RhdGljIDxBPiBNYXliZTxBPiB1bml0KEEgdmFsdWUpIHsKICAgIHJldHVybiBKdXN0Lm9mKHZhbHVlKTsKICB9CgogIHB1YmxpYyBhYnN0cmFjdCA8Qj4gTWF5YmU8Qj4gbWFwKEYxPEEsIEI+IGYpOwogIHB1YmxpYyBhYnN0cmFjdCA8Qj4gTWF5YmU8Qj4gZmxhdE1hcChGMTxBLCBNYXliZTxCPj4gZik7CiAgcHVibGljIGFic3RyYWN0IEEgZ2V0T3JFbHNlKEYwPEE+IGFsdCk7CiAgcHVibGljIGFic3RyYWN0IE1heWJlPEE+IG9yRWxzZShNYXliZTxBPiBhbHQpOwogIHB1YmxpYyBhYnN0cmFjdCA8Qj4gQiBmb2xkKEYxPEEsIEI+IGYsIEYwPEI+IGcpOwogIHB1YmxpYyBhYnN0cmFjdCBNYXliZTxBPiBmaWx0ZXIoRjE8QSwgQm9vbGVhbj4gcHJlZCk7Cn0KCmNsYXNzIEp1c3Q8QT4gZXh0ZW5kcyBNYXliZTxBPiB7CiAgcHJpdmF0ZSBmaW5hbCBBIHZhbHVlOwogIAogIHByaXZhdGUgSnVzdChBIHZhbHVlKSB7CiAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgfQoKICBwdWJsaWMgc3RhdGljIDxBPiBNYXliZTxBPiBvZihBIHZhbHVlKSB7CiAgICByZXR1cm4gbmV3IEp1c3Q8QT4odmFsdWUpOwogIH0KCiAgcHVibGljIDxCPiBNYXliZTxCPiBtYXAoRjE8QSwgQj4gZikgewogICAgcmV0dXJuIG5ldyBKdXN0PEI+KGYuXyh2YWx1ZSkpOwogIH0KCiAgcHVibGljIDxCPiBNYXliZTxCPiBmbGF0TWFwKEYxPEEsIE1heWJlPEI+PiBmKSB7CiAgICByZXR1cm4gZi5fKHZhbHVlKTsKICB9CiAgCiAgcHVibGljIEEgZ2V0T3JFbHNlKEYwPEE+IGFsdCkgewogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgcHVibGljIE1heWJlPEE+IG9yRWxzZShNYXliZTxBPiBhbHQpIHsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgcHVibGljIDxCPiBCIGZvbGQoRjE8QSwgQj4gZiwgRjA8Qj4gZykgewogICAgcmV0dXJuIGYuXyh2YWx1ZSk7CiAgfQoKICBwdWJsaWMgTWF5YmU8QT4gZmlsdGVyKEYxPEEsIEJvb2xlYW4+IHByZWQpIHsKICAgIGlmKHByZWQuXyh2YWx1ZSkpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gTm90aGluZy48QT52YWx1ZSgpOwogICAgfQogIH0KCiAgQE92ZXJyaWRlCiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJKdXN0KCVzKSIsIHZhbHVlKTsKICB9Cn0KCmNsYXNzIE5vdGhpbmc8QT4gZXh0ZW5kcyBNYXliZTxBPiB7CiAgcHJpdmF0ZSBOb3RoaW5nKCkgewogIH0gIAoKICBwdWJsaWMgc3RhdGljIDxBPiBNYXliZTxBPiB2YWx1ZSgpIHsKICAgIHJldHVybiBuZXcgTm90aGluZzxBPigpOwogIH0KCiAgcHVibGljIDxCPiBNYXliZTxCPiBtYXAoRjE8QSwgQj4gZikgewogICAgcmV0dXJuIG5ldyBOb3RoaW5nPEI+KCk7CiAgfQoKICBwdWJsaWMgPEI+IE1heWJlPEI+IGZsYXRNYXAoRjE8QSwgTWF5YmU8Qj4+IGYpIHsKICAgIHJldHVybiBuZXcgTm90aGluZzxCPigpOwogIH0KCiAgcHVibGljIEEgZ2V0T3JFbHNlKEYwPEE+IGFsdCkgewogICAgcmV0dXJuIGFsdC5fKCk7CiAgfQoKICBwdWJsaWMgTWF5YmU8QT4gb3JFbHNlKE1heWJlPEE+IGFsdCkgewogICAgcmV0dXJuIGFsdDsKICB9CgogIHB1YmxpYyA8Qj4gQiBmb2xkKEYxPEEsIEI+IGYsIEYwPEI+IGcpIHsKICAgIHJldHVybiBnLl8oKTsKICB9CgogIHB1YmxpYyBNYXliZTxBPiBmaWx0ZXIoRjE8QSwgQm9vbGVhbj4gcHJlZCkgewogICAgcmV0dXJuIHRoaXM7CiAgfQogIAogIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gIk5vdGhpbmciOwogIH0KfQ==