77import uuid
88from abc import ABC , abstractmethod
99from collections import abc
10+ from typing import Generic , TypeVar , cast
1011
1112from frequenz .client .common .microgrid .components import ComponentId
1213from frequenz .quantities import Power
1516from frequenz .sdk .microgrid import _power_distributing , _power_managing
1617from frequenz .sdk .timeseries import Bounds
1718from frequenz .sdk .timeseries ._base_types import SystemBounds
18- from frequenz .sdk .timeseries .abstract_pool ._abstract_pool_reference_store import (
19- AbstractPoolReferenceStore ,
20- )
2119from frequenz .sdk .timeseries .formulas import Formula
2220
21+ from ._abstract_pool_reference_store import AbstractPoolReferenceStore
22+ from ._abstract_pool_report import AbstractPoolReport
2323
24- class AbstractPool (ABC ):
24+ RefStoreT = TypeVar ("RefStoreT" , bound = AbstractPoolReferenceStore )
25+ ReportT = TypeVar ("ReportT" , bound = AbstractPoolReport )
26+
27+
28+ class AbstractPool (ABC , Generic [RefStoreT , ReportT ]):
2529 """Abstract base class for component pools."""
2630
2731 def __init__ ( # pylint: disable=too-many-arguments
2832 self ,
2933 * ,
30- pool_ref_store : AbstractPoolReferenceStore ,
34+ pool_ref_store : RefStoreT ,
3135 name : str | None ,
3236 priority : int ,
3337 ) -> None :
@@ -97,7 +101,7 @@ def power(self) -> Formula[Power]:
97101 """
98102
99103 @property
100- def power_status (self ) -> ReceiverFetcher [_power_managing . _Report ]:
104+ def power_status (self ) -> ReceiverFetcher [ReportT ]:
101105 """Get a receiver to receive new power status reports when they change.
102106
103107 These include
@@ -124,7 +128,7 @@ def power_status(self) -> ReceiverFetcher[_power_managing._Report]:
124128 )
125129 channel .resend_latest = True
126130
127- return channel
131+ return cast ( ReceiverFetcher [ ReportT ], channel )
128132
129133 @property
130134 def power_distribution_results (self ) -> ReceiverFetcher [_power_distributing .Result ]:
0 commit comments