1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 | 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 public String toString() { 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; } public String toString() { return "Nothing"; } } |
aW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKCmVudW0gVW5pdCB7CiAgVmFsdWU7Cn0KCmludGVyZmFjZSBGMDxBPiB7CiAgcHVibGljIEEgXygpOwp9CgphYnN0cmFjdCBjbGFzcyBGMTxBLCBCPiB7CiAgcHVibGljIGFic3RyYWN0IEIgXyhBIGEpOwp9CgphYnN0cmFjdCBjbGFzcyBGMjxBLCBCLCBDPiB7CiAgcHVibGljIGFic3RyYWN0IEMgXyhBIGEsIEIgYik7Cn0KCmFic3RyYWN0IGNsYXNzIE1heWJlPEE+IHsKICBwdWJsaWMgc3RhdGljIDxBPiBNYXliZTxBPiB1bml0KEEgdmFsdWUpIHsKICAgIHJldHVybiBKdXN0Lm9mKHZhbHVlKTsKICB9CgogIHB1YmxpYyBhYnN0cmFjdCA8Qj4gTWF5YmU8Qj4gbWFwKEYxPEEsIEI+IGYpOwogIHB1YmxpYyBhYnN0cmFjdCA8Qj4gTWF5YmU8Qj4gZmxhdE1hcChGMTxBLCBNYXliZTxCPj4gZik7CiAgcHVibGljIGFic3RyYWN0IEEgZ2V0T3JFbHNlKEYwPEE+IGFsdCk7CiAgcHVibGljIGFic3RyYWN0IE1heWJlPEE+IG9yRWxzZShNYXliZTxBPiBhbHQpOwogIHB1YmxpYyBhYnN0cmFjdCA8Qj4gQiBmb2xkKEYxPEEsIEI+IGYsIEYwPEI+IGcpOwogIHB1YmxpYyBhYnN0cmFjdCBNYXliZTxBPiBmaWx0ZXIoRjE8QSwgQm9vbGVhbj4gcHJlZCk7Cn0KCmNsYXNzIEp1c3Q8QT4gZXh0ZW5kcyBNYXliZTxBPiB7CiAgcHJpdmF0ZSBmaW5hbCBBIHZhbHVlOwogIAogIHByaXZhdGUgSnVzdChBIHZhbHVlKSB7CiAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgfQoKICBwdWJsaWMgc3RhdGljIDxBPiBNYXliZTxBPiBvZihBIHZhbHVlKSB7CiAgICByZXR1cm4gbmV3IEp1c3Q8QT4odmFsdWUpOwogIH0KCiAgcHVibGljIDxCPiBNYXliZTxCPiBtYXAoRjE8QSwgQj4gZikgewogICAgcmV0dXJuIG5ldyBKdXN0PEI+KGYuXyh2YWx1ZSkpOwogIH0KCiAgcHVibGljIDxCPiBNYXliZTxCPiBmbGF0TWFwKEYxPEEsIE1heWJlPEI+PiBmKSB7CiAgICByZXR1cm4gZi5fKHZhbHVlKTsKICB9CiAgCiAgcHVibGljIEEgZ2V0T3JFbHNlKEYwPEE+IGFsdCkgewogICAgcmV0dXJuIHZhbHVlOwogIH0KCiAgcHVibGljIE1heWJlPEE+IG9yRWxzZShNYXliZTxBPiBhbHQpIHsKICAgIHJldHVybiB0aGlzOwogIH0KCiAgcHVibGljIDxCPiBCIGZvbGQoRjE8QSwgQj4gZiwgRjA8Qj4gZykgewogICAgcmV0dXJuIGYuXyh2YWx1ZSk7CiAgfQoKICBwdWJsaWMgTWF5YmU8QT4gZmlsdGVyKEYxPEEsIEJvb2xlYW4+IHByZWQpIHsKICAgIGlmKHByZWQuXyh2YWx1ZSkpIHsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gTm90aGluZy48QT52YWx1ZSgpOwogICAgfQogIH0KCiAgQE92ZXJyaWRlCiAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJKdXN0KCVzKSIsIHZhbHVlKTsKICB9Cn0KCmNsYXNzIE5vdGhpbmc8QT4gZXh0ZW5kcyBNYXliZTxBPiB7CiAgcHJpdmF0ZSBOb3RoaW5nKCkgewogIH0gIAoKICBwdWJsaWMgc3RhdGljIDxBPiBNYXliZTxBPiB2YWx1ZSgpIHsKICAgIHJldHVybiBuZXcgTm90aGluZzxBPigpOwogIH0KCiAgcHVibGljIDxCPiBNYXliZTxCPiBtYXAoRjE8QSwgQj4gZikgewogICAgcmV0dXJuIG5ldyBOb3RoaW5nPEI+KCk7CiAgfQoKICBwdWJsaWMgPEI+IE1heWJlPEI+IGZsYXRNYXAoRjE8QSwgTWF5YmU8Qj4+IGYpIHsKICAgIHJldHVybiBuZXcgTm90aGluZzxCPigpOwogIH0KCiAgcHVibGljIEEgZ2V0T3JFbHNlKEYwPEE+IGFsdCkgewogICAgcmV0dXJuIGFsdC5fKCk7CiAgfQoKICBwdWJsaWMgTWF5YmU8QT4gb3JFbHNlKE1heWJlPEE+IGFsdCkgewogICAgcmV0dXJuIGFsdDsKICB9CgogIHB1YmxpYyA8Qj4gQiBmb2xkKEYxPEEsIEI+IGYsIEYwPEI+IGcpIHsKICAgIHJldHVybiBnLl8oKTsKICB9CgogIHB1YmxpYyBNYXliZTxBPiBmaWx0ZXIoRjE8QSwgQm9vbGVhbj4gcHJlZCkgewogICAgcmV0dXJuIHRoaXM7CiAgfQogIAogIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAgICByZXR1cm4gIk5vdGhpbmciOwogIH0KfQ==


