Jelajahi Sumber

Added pair iterator.

Taddeus Kroes 13 tahun lalu
induk
melakukan
77ae42a081
2 mengubah file dengan 19 tambahan dan 1 penghapusan
  1. 11 0
      src/rules/utils.py
  2. 8 1
      tests/test_rules_utils.py

+ 11 - 0
src/rules/utils.py

@@ -194,3 +194,14 @@ def evals_to_numeric(node):
 
     return node.op in (OP_ADD, OP_MUL, OP_DIV, OP_POW, OP_SQRT) \
            and all(map(evals_to_numeric, node))
+
+
+def iter_pairs(list_iterable):
+    """
+    Iterate over a list iterable in left-right pairs.
+    """
+    if len(list_iterable) < 2:
+        raise StopIteration
+
+    for i, left in enumerate(list_iterable[:-1]):
+        yield left, list_iterable[i + 1]

+ 8 - 1
tests/test_rules_utils.py

@@ -1,7 +1,8 @@
 from src.rules import utils
 from src.rules.utils import least_common_multiple, is_fraction, partition, \
         find_variables, first_sorted_variable, find_variable, substitute, \
-        divides, dividers, is_prime, prime_dividers, evals_to_numeric
+        divides, dividers, is_prime, prime_dividers, evals_to_numeric, \
+        iter_pairs
 from tests.rulestestcase import tree, RulesTestCase
 
 
@@ -103,3 +104,9 @@ class TestRulesUtils(RulesTestCase):
         self.assertFalse(evals_to_numeric(tree('int 1')))
         self.assertFalse(evals_to_numeric(tree('int a')))
         self.assertTrue(evals_to_numeric(tree('sqrt 1')))
+
+    def test_iter_pairs(self):
+        self.assertEqual(list(iter_pairs([1])), [])
+        self.assertEqual(list(iter_pairs([1, 2])), [(1, 2)])
+        self.assertEqual(list(iter_pairs([1, 2, 3])), [(1, 2), (2, 3)])
+        self.assertEqual(list(iter_pairs([1, 2, 3, 4])), [(1, 2), (2, 3), (3, 4)])