Cache.vala 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. using Invercargill.DataStructures;
  2. namespace Invercargill.Modifiers {
  3. public class Cache<T> : Enumerable<T> {
  4. private Vector<T> vector;
  5. private Enumerable<T> inner;
  6. private Tracker<T> inner_tracker;
  7. public Cache(Enumerable<T> inner) {
  8. this.inner = inner;
  9. inner_tracker = this.inner.get_tracker();
  10. vector = new Vector<T>();
  11. }
  12. public override uint? peek_count() {
  13. return inner.peek_count();
  14. }
  15. public override EnumerableInfo get_info() {
  16. return new EnumerableInfo.infer_single(this, EnumerableCategory.CACHED, inner);
  17. }
  18. public override Tracker<T> get_tracker () {
  19. var i = 0;
  20. return new AssertingLambdaTracker<T>(() => has_nth(i), () => vector[i++]);
  21. }
  22. private bool has_nth(int n) {
  23. lock(vector) {
  24. if(vector.count() > n) {
  25. return true;
  26. }
  27. while(vector.count() <= n) {
  28. if(inner_tracker.has_next()) {
  29. vector.add(inner_tracker.get_next());
  30. }
  31. else {
  32. return false;
  33. }
  34. }
  35. return true;
  36. }
  37. }
  38. }
  39. }