Chunk.vala 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. namespace Invercargill.Modifiers {
  2. public class Chunk<T> : Enumerable<Enumerable<T>> {
  3. private uint chunk_size;
  4. private Enumerable<T> input;
  5. public Chunk(Enumerable<T> input, uint chunk_size) {
  6. this.input = input;
  7. this.chunk_size = chunk_size;
  8. }
  9. public override uint? peek_count() {
  10. var inner = input.peek_count();
  11. if(inner == null) {
  12. return null;
  13. }
  14. return (inner / chunk_size) + (inner % chunk_size == 0 ? 0 : 1);
  15. }
  16. public override EnumerableInfo get_info() {
  17. return new EnumerableInfo.infer_single(this, EnumerableCategory.COMPUTED, input);
  18. }
  19. public override Tracker<Enumerable<T>> get_tracker() {
  20. var tracker = input.get_tracker();
  21. return new LambdaTracker<Enumerable<T>>(
  22. () => tracker.has_next(),
  23. () => {
  24. var items = new DataStructures.Series<T>();
  25. for(int i = 0; i < chunk_size && tracker.has_next(); i++) {
  26. items.add(tracker.get_next());
  27. }
  28. return items.seal();
  29. });
  30. }
  31. }
  32. }