Interleave.vala 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. namespace Invercargill.Modifiers {
  2. public class Interleave<T> : Enumerable<T> {
  3. private Enumerable<T> e1;
  4. private Enumerable<T> e2;
  5. public Interleave(Enumerable<T> en1, Enumerable<T> en2) {
  6. e1 = en1;
  7. e2 = en2;
  8. }
  9. public override uint? peek_count() {
  10. var c1 = e1.peek_count();
  11. var c2 = e2.peek_count();
  12. if(c1 == null || c2 == null)
  13. return null;
  14. return c1 + c2;
  15. }
  16. public override EnumerableInfo get_info() {
  17. return new EnumerableInfo.infer(this, EnumerableCategory.COMPUTED, Iterate.these(e1, e2));
  18. }
  19. public override Tracker<T> get_tracker() {
  20. var t1 = e1.get_tracker();
  21. var t2 = e2.get_tracker();
  22. var last = t2;
  23. return new LambdaTracker<T>(
  24. () => t1.has_next() || t2.has_next(),
  25. () => {
  26. if(last == t1 && t2.has_next()) {
  27. last = t2;
  28. return t2.get_next();
  29. }
  30. else if(last == t2 && t1.has_next()) {
  31. last = t1;
  32. return t1.get_next();
  33. }
  34. else if(t1.has_next()) {
  35. last = t1;
  36. return t1.get_next();
  37. }
  38. else {
  39. last = t2;
  40. return t2.get_next();
  41. }
  42. });
  43. }
  44. }
  45. }