namespace Invercargill { private class CacheEnumerable : Enumerable { private Vector vector; private Enumerable inner; private Tracker inner_tracker; public CacheEnumerable(Enumerable inner) { this.inner = inner; inner_tracker = this.inner.get_tracker(); vector = new Vector(); } public override Tracker get_tracker () { var i = 0; return new LambdaTracker(() => has_nth(i), () => vector.get_or_default(i++)); } private bool has_nth(int n) { lock(vector) { if(vector.count() > n) { return true; } while(vector.count() <= n) { if(inner_tracker.has_next()) { vector.add(inner_tracker.get_next()); } else { return false; } } return true; } } } }