CacheEnumerable.vala 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. namespace Invercargill {
  2. private class CacheEnumerable<T> : Enumerable<T> {
  3. private Vector<T> vector;
  4. private Enumerable<T> inner;
  5. private Tracker<T> inner_tracker;
  6. public CacheEnumerable(Enumerable<T> inner) {
  7. this.inner = inner;
  8. inner_tracker = this.inner.get_tracker();
  9. vector = new Vector<T>();
  10. }
  11. public override Tracker<T> get_tracker () {
  12. var i = 0;
  13. return new LambdaTracker<T>(() => has_nth(i), () => vector.get_or_default(i++));
  14. }
  15. private bool has_nth(int n) {
  16. lock(vector) {
  17. if(vector.count() > n) {
  18. return true;
  19. }
  20. while(vector.count() <= n) {
  21. if(inner_tracker.has_next()) {
  22. vector.add(inner_tracker.get_next());
  23. }
  24. else {
  25. return false;
  26. }
  27. }
  28. return true;
  29. }
  30. }
  31. }
  32. }