smok-serwis/firanka

View on GitHub
firanka/builders.py

Summary

Maintainability
A
0 mins
Test Coverage
import copy

from sortedcontainers import SortedList

from .series import DiscreteSeries

"""
Update knowledge of current discrete series
"""

__all__ = [
    'DiscreteSeriesBuilder',
]


class DiscreteSeriesBuilder(object):
    def __init__(self, series=None):

        if series is None:
            series = DiscreteSeries([])

        if not isinstance(series, DiscreteSeries):
            raise TypeError(u'discrete knowledge builder supports only discrete series')

        self.new_data = {}
        self.domain = series.domain
        self.series = series

    def put(self, index, value):
        self.domain = self.domain.extend_to_point(index)
        self.new_data[index] = value

    def as_series(self):
        """
        Update
        :return: a new DiscreteSeries instance
        """

        new_data = SortedList()
        cp_new_data = copy.copy(self.new_data)

        # Update - series.data is sorted, so no worries :)
        for k, v in self.series.data:
            if k in cp_new_data:
                v = cp_new_data.pop(k)
            new_data.add((k, v))

        # Add those that remained
        for k, v in cp_new_data.items():
            new_data.add((k, v))

        return DiscreteSeries(new_data, self.domain)