import java.util.Objects;
class Ideone {
public static void main
(String[] args
) { Loop.from(0).to(10).execute(() -> {
System.
out.
println("Hello World!"); });
}
}
class Loop {
private final int from;
private final int to;
private Loop(Builder builder) {
this.from = builder.from();
this.to = builder.to();
}
public static LoopFromSetBuilder from(int from) {
return new Builder().from(from);
}
public static LoopToSetBuilder to(int to) {
return new Builder().to(to);
}
public void execute
(Runnable executable
) { for (int i = from; i < to; i++) {
executable.run();
}
}
public static class Builder implements LoopFromSetBuilder, LoopToSetBuilder, LoopAllSetBuilder {
private int from = 0;
private Builder() {}
public Builder from(int from) {
this.from = from;
return this;
}
private int from() {
return from;
}
public Builder to(int to) {
this.to = to;
return this;
}
private int to() {
return to;
}
public void execute
(Runnable runnable
) { Objects.requireNonNull(runnable);
new Loop(this).execute(runnable);
}
}
interface LoopFromSetBuilder {
LoopAllSetBuilder to(int to);
}
interface LoopToSetBuilder {
LoopAllSetBuilder from(int from);
}
interface LoopAllSetBuilder {
}
}
aW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwoKY2xhc3MgSWRlb25lIHsKCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiAoU3RyaW5nW10gYXJncykgewogICAgICAgIExvb3AuZnJvbSgwKS50bygxMCkuZXhlY3V0ZSgoKSAtPiB7CiAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG8gV29ybGQhIik7CiAgICAgICAgfSk7CiAgICB9Cn0KCmNsYXNzIExvb3AgewogICAgcHJpdmF0ZSBmaW5hbCBpbnQgZnJvbTsKICAgIHByaXZhdGUgZmluYWwgaW50IHRvOwoKICAgIHByaXZhdGUgTG9vcChCdWlsZGVyIGJ1aWxkZXIpIHsKICAgICAgICB0aGlzLmZyb20gPSBidWlsZGVyLmZyb20oKTsKICAgICAgICB0aGlzLnRvID0gYnVpbGRlci50bygpOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgTG9vcEZyb21TZXRCdWlsZGVyIGZyb20oaW50IGZyb20pIHsKICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5mcm9tKGZyb20pOwogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgTG9vcFRvU2V0QnVpbGRlciB0byhpbnQgdG8pIHsKICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS50byh0byk7CiAgICB9CgogICAgcHVibGljIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSBleGVjdXRhYmxlKSB7CiAgICAgICAgZm9yIChpbnQgaSA9IGZyb207IGkgPCB0bzsgaSsrKSB7CiAgICAgICAgICAgIGV4ZWN1dGFibGUucnVuKCk7CiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciAgaW1wbGVtZW50cyBMb29wRnJvbVNldEJ1aWxkZXIsIExvb3BUb1NldEJ1aWxkZXIsIExvb3BBbGxTZXRCdWlsZGVyIHsKICAgICAgICBwcml2YXRlIGludCBmcm9tID0gMDsKICAgICAgICBwcml2YXRlIEludGVnZXIgdG8gPSBudWxsOwoKICAgICAgICBwcml2YXRlIEJ1aWxkZXIoKSB7fQoKICAgICAgICBwdWJsaWMgQnVpbGRlciBmcm9tKGludCBmcm9tKSB7CiAgICAgICAgICAgIHRoaXMuZnJvbSA9IGZyb207CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KCiAgICAgICAgcHJpdmF0ZSBpbnQgZnJvbSgpIHsKICAgICAgICAgICAgcmV0dXJuIGZyb207CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgQnVpbGRlciB0byhpbnQgdG8pIHsKICAgICAgICAgICAgdGhpcy50byA9IHRvOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CgogICAgICAgIHByaXZhdGUgaW50IHRvKCkgewogICAgICAgICAgICByZXR1cm4gdG87CiAgICAgICAgfQoKICAgICAgICBwdWJsaWMgdm9pZCBleGVjdXRlKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7CiAgICAgICAgICAgIE9iamVjdHMucmVxdWlyZU5vbk51bGwocnVubmFibGUpOwogICAgICAgICAgICBuZXcgTG9vcCh0aGlzKS5leGVjdXRlKHJ1bm5hYmxlKTsKICAgICAgICB9CiAgICB9CgogICAgaW50ZXJmYWNlIExvb3BGcm9tU2V0QnVpbGRlciB7CiAgICAgICAgTG9vcEFsbFNldEJ1aWxkZXIgdG8oaW50IHRvKTsKICAgIH0KCiAgICBpbnRlcmZhY2UgTG9vcFRvU2V0QnVpbGRlciB7CiAgICAgICAgTG9vcEFsbFNldEJ1aWxkZXIgZnJvbShpbnQgZnJvbSk7CiAgICB9CgogICAgaW50ZXJmYWNlIExvb3BBbGxTZXRCdWlsZGVyIHsKICAgICAgICB2b2lkIGV4ZWN1dGUoUnVubmFibGUgcnVubmFibGUpOwogICAgfQp9