| # Copyright 2016 The Chromium OS Authors. All rights reserved. |

| # Use of this source code is governed by a BSD-style license that can be |

| # found in the LICENSE file. |

| |

| """Utility functions for dealing with iterators.""" |

| |

| from __future__ import print_function |

| |

| import itertools |

| |

| |

| def IntersectIntervals(intervals): |

| """Gets the intersection of a set of intervals. |

| |

| Args: |

| intervals: A list of interval groups, where each interval group is itself |

| a list of (start, stop) tuples (ordered by start time and |

| non-overlapping). |

| |

| Returns: |

| An interval group, as a list of (start, stop) tuples, corresponding to the |

| intersection (i.e. overlap) of the given |intervals|. |

| """ |

| if not intervals: |

| return [] |

| |

| intersection = [] |

| indices = [0] * len(intervals) |

| lengths = [len(i) for i in intervals] |

| while all(i < l for i, l in zip(indices, lengths)): |

| current_intervals = [intervals[i][j] for (i, j) in |

| zip(itertools.count(), indices)] |

| start = max([s[0] for s in current_intervals]) |

| end, end_index = min([(e[1], i) for e, i in |

| zip(current_intervals, itertools.count())]) |

| if start < end: |

| intersection.append((start, end)) |

| indices[end_index] += 1 |

| |

| return intersection |

| |

| |

| def SplitToChunks(input_iter, chunk_size): |

| """Split an iterator into chunks. |

| |

| This function walks 1 entire chunk of |input_iter| at a time, but does not |

| walk past that chunk until necessary. |

| |

| Example usage |

| list(SplitToChunks([1, 2, 3, 4, 5], 3)) -> [[1, 2, 3], [4, 5] |

| |

| Args: |

| input_iter: iterable or generator to be split into chunks |

| chunk_size: the maximum size of each chunk |

| |

| Returns: |

| An iterable of chunks, where each chunk is of maximum size chunk_size. |

| """ |

| count = 0 |

| l = [] |

| for item in input_iter: |

| l.append(item) |

| count += 1 |

| if count == chunk_size: |

| yield l |

| l = [] |

| count = 0 |

| |

| if l: |

| yield l |