Skip to content

Commit e046a9e

Browse files
committed
Implement support for continuous function iteration.
1 parent 9671764 commit e046a9e

File tree

4 files changed

+35
-0
lines changed

4 files changed

+35
-0
lines changed

colour/continuous/abstract.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
ArrayLike,
2020
Callable,
2121
DTypeFloat,
22+
Generator,
2223
Literal,
2324
NDArrayFloat,
2425
Optional,
@@ -96,6 +97,7 @@ class AbstractContinuousFunction(ABC):
9697
- :meth:`~colour.continuous.AbstractContinuousFunction.__getitem__`
9798
- :meth:`~colour.continuous.AbstractContinuousFunction.__setitem__`
9899
- :meth:`~colour.continuous.AbstractContinuousFunction.__contains__`
100+
- :meth:`~colour.continuous.AbstractContinuousFunction.__iter__`
99101
- :meth:`~colour.continuous.AbstractContinuousFunction.__len__`
100102
- :meth:`~colour.continuous.AbstractContinuousFunction.__eq__`
101103
- :meth:`~colour.continuous.AbstractContinuousFunction.__ne__`
@@ -484,6 +486,18 @@ def __contains__(self, x: Union[ArrayLike, slice]) -> bool:
484486

485487
... # pragma: no cover
486488

489+
def __iter__(self) -> Generator:
490+
"""
491+
Return a generator for the abstract continuous function.
492+
493+
Yields
494+
------
495+
Generator
496+
Abstract continuous function generator.
497+
"""
498+
499+
yield from np.column_stack([self.domain, self.range])
500+
487501
def __len__(self) -> int:
488502
"""
489503
Return the abstract continuous function independent domain :math:`x`

colour/continuous/tests/test_abstract.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ def test_required_methods(self):
5151
"__getitem__",
5252
"__setitem__",
5353
"__contains__",
54+
"__iter__",
5455
"__len__",
5556
"__eq__",
5657
"__ne__",

colour/continuous/tests/test_multi_signal.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ def test_required_methods(self):
7979
"__getitem__",
8080
"__setitem__",
8181
"__contains__",
82+
"__iter__",
8283
"__eq__",
8384
"__ne__",
8485
"arithmetical_operation",
@@ -745,6 +746,16 @@ def test__contains__(self):
745746
self.assertIn(0.5, self._multi_signals)
746747
self.assertNotIn(1000, self._multi_signals)
747748

749+
def test__iter__(self):
750+
"""Test :func:`colour.continuous.signal.Signal.__iter__` method."""
751+
752+
domain = np.arange(0, 10)
753+
for i, domain_range_value in enumerate(self._multi_signals):
754+
np.testing.assert_array_equal(domain_range_value[0], domain[i])
755+
np.testing.assert_array_equal(
756+
domain_range_value[1:], self._range_2[i]
757+
)
758+
748759
def test__len__(self):
749760
"""
750761
Test :meth:`colour.continuous.multi_signals.MultiSignals.__len__`

colour/continuous/tests/test_signal.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ def test_required_methods(self):
6565
"__getitem__",
6666
"__setitem__",
6767
"__contains__",
68+
"__iter__",
6869
"__eq__",
6970
"__ne__",
7071
"arithmetical_operation",
@@ -477,6 +478,14 @@ def test__contains__(self):
477478
self.assertIn(0.5, self._signal)
478479
self.assertNotIn(1000, self._signal)
479480

481+
def test__iter__(self):
482+
"""Test :func:`colour.continuous.signal.Signal.__iter__` method."""
483+
484+
domain = np.arange(0, 10)
485+
for i, (domain_value, range_value) in enumerate(self._signal):
486+
np.testing.assert_array_equal(domain_value, domain[i])
487+
np.testing.assert_array_equal(range_value, self._range[i])
488+
480489
def test__len__(self):
481490
"""Test :func:`colour.continuous.signal.Signal.__len__` method."""
482491

0 commit comments

Comments
 (0)