from intervaltree import IntervalTree, Interval
from utils import bitstream


class SegmentMap(object):
    def __init__(self, grid):
        self.segment_tree = IntervalTree()

        for bits_info in grid.iter_all_frames():
            self.segment_tree.add(
                Interval(
                    begin=bits_info.bits.base_address,
                    end=bits_info.bits.base_address + bits_info.bits.frames,
                    data=bits_info,
                ))

    def segment_info_for_frame(self, frame):
        """ Return all bits info that match frame address. """
        for frame in self.segment_tree[frame]:
            yield frame.data
