From 48cd0d63af5bacb4c70711a985aa5fabb22debbf Mon Sep 17 00:00:00 2001
From: Piotr Maslanka <piotr.maslanka@henrietta.com.pl>
Date: Sat, 9 Dec 2017 21:08:21 +0100
Subject: [PATCH] fixes #4

---
 firanka/builder.py    | 44 +++++++++++++++++++++++++++++++++++++++++++
 tests/test_builder.py | 24 +++++++++++++++++++++++
 tests/test_series.py  |  2 ++
 3 files changed, 70 insertions(+)
 create mode 100644 firanka/builder.py
 create mode 100644 tests/test_builder.py

diff --git a/firanka/builder.py b/firanka/builder.py
new file mode 100644
index 0000000..1b15543
--- /dev/null
+++ b/firanka/builder.py
@@ -0,0 +1,44 @@
+# coding=UTF-8
+from __future__ import print_function, absolute_import, division
+import six
+import logging
+import copy
+from .series import Series, DiscreteSeries
+from .ranges import Range
+
+"""
+Update knowledge of current discrete series
+"""
+
+__all__ = [
+    'DiscreteKnowledgeBuilder',
+]
+
+class DiscreteKnowledgeBuilder(object):
+    def __init__(self, series):
+
+        if not isinstance(series, DiscreteSeries):
+            raise TypeError('discrete knowledge builder supports only discrete series')
+
+        self.new_data = {}
+        self.domain = series.domain
+        self.series = series
+
+    def put(self, index, value):
+
+        if index not in self.domain:
+            if index <= self.domain.start:
+                self.domain = Range(index, self.domain.stop, True, self.domain.right_inc)
+            if index >= self.domain.stop:
+                self.domain = Range(self.domain.start, index, self.domain.left_inc, True)
+
+        self.new_data[index] = value
+
+    def update_series(self):
+        """:return: a new DiscreteSeries instance"""
+
+        new_data = copy.copy(self.series.data)
+        for k,v in self.new_data.items():
+            new_data.add((k,v))
+
+        return DiscreteSeries(new_data, self.domain)
diff --git a/tests/test_builder.py b/tests/test_builder.py
new file mode 100644
index 0000000..0c2b704
--- /dev/null
+++ b/tests/test_builder.py
@@ -0,0 +1,24 @@
+# coding=UTF-8
+from __future__ import print_function, absolute_import, division
+import six
+import unittest
+
+from firanka.builder import DiscreteKnowledgeBuilder
+from firanka.series import DiscreteSeries
+
+
+class TestBuilder(unittest.TestCase):
+    def test_t1(self):
+
+        ser = DiscreteSeries([(0,1), (1,2)])
+
+        kb = DiscreteKnowledgeBuilder(ser)
+
+        kb.put(3, 4)
+        kb.put(-1, 5)
+        kb.put(-1, 6)
+
+        s2 = kb.update_series()
+
+        self.assertTrue(s2.domain, '<-1;3>')
+        self.assertEqual(s2.data,[(-1,6), (0,1), (1,2), (3,4)])
diff --git a/tests/test_series.py b/tests/test_series.py
index 4ef0223..627ecfa 100644
--- a/tests/test_series.py
+++ b/tests/test_series.py
@@ -198,6 +198,8 @@ class TestModuloSeries(unittest.TestCase):
 
         self.assertEqual(series.period, 3.0)
 
+        self.assertEqual(series.eval_points([-1,0,1]), [1,2,3])
+
         self.assertEqual(series.eval_points([-5,-4,-3,-2,-1,0,1,2,3,4,5]),
                                             [ 3, 1, 2, 3, 1,2,3,1,2,3,1])
 
-- 
GitLab