class Unfoldr<A,B> implements java.util.Iterator<A>
{
public Unfoldr(Closure<Tuple> f, B init)
{
this.f = f;
this.state = f(init);
}
public synchronized A next()
{
if (hasNext())
{
A curr = state.get(0);
state = f(state.get(1));
return curr;
}
else
{
throw java.lang.NoSuchElementException;
}
}
public synchronized boolean hasNext()
{
return (state != null);
}
public
void remove() { throw UnsupportedOperationException
; }
private Closure<Tuple> f;
private Tuple state;
}
def unfoldr = { f, init -> new Unfoldr(f, init) };
def u = unfoldr({ x -> if (x < 100) { new Tuple(x + 1, x + 1) } else null; }, 0);
for(e in u)
{
print e;
print "\n";
}
Y2xhc3MgVW5mb2xkcjxBLEI+IGltcGxlbWVudHMgamF2YS51dGlsLkl0ZXJhdG9yPEE+CnsKICBwdWJsaWMgVW5mb2xkcihDbG9zdXJlPFR1cGxlPiBmLCBCIGluaXQpIAogIHsKICAgIHRoaXMuZiA9IGY7CiAgICB0aGlzLnN0YXRlID0gZihpbml0KTsKICB9CiAgCiAgcHVibGljIHN5bmNocm9uaXplZCBBIG5leHQoKSAKICB7CiAgICBpZiAoaGFzTmV4dCgpKQogICAgewogICAgICBBIGN1cnIgPSBzdGF0ZS5nZXQoMCk7CiAgICAgIHN0YXRlID0gZihzdGF0ZS5nZXQoMSkpOwogICAgICByZXR1cm4gY3VycjsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgdGhyb3cgamF2YS5sYW5nLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CiAgICB9CiAgfQogIAogIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNOZXh0KCkgCiAgewogICAgcmV0dXJuIChzdGF0ZSAhPSBudWxsKTsKICB9CiAgCiAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeyB0aHJvdyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjsgfQoKICBwcml2YXRlIENsb3N1cmU8VHVwbGU+IGY7CiAgCiAgcHJpdmF0ZSBUdXBsZSBzdGF0ZTsKfQoKZGVmIHVuZm9sZHIgPSB7IGYsIGluaXQgLT4gbmV3IFVuZm9sZHIoZiwgaW5pdCkgfTsKCmRlZiB1ID0gdW5mb2xkcih7IHggLT4gaWYgKHggPCAxMDApIHsgbmV3IFR1cGxlKHggKyAxLCB4ICsgMSkgfSBlbHNlIG51bGw7IH0sIDApOwoKZm9yKGUgaW4gdSkKewogIHByaW50IGU7CiAgcHJpbnQgIlxuIjsKfQo=