Skip to content

Commit fe7800d

Browse files
committed
Add a ComposableFormulaEngine base class
Signed-off-by: Sahas Subramanian <[email protected]>
1 parent 5d828fc commit fe7800d

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed

src/frequenz/sdk/timeseries/_formula_engine/_formula_engine.py

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,90 @@ async def apply(self) -> Sample:
159159
return Sample(metric_ts, res)
160160

161161

162+
_GenericEngine = TypeVar("_GenericEngine", "FormulaEngine", "FormulaEngine3Phase")
163+
_GenericHigherOrderBuilder = TypeVar(
164+
"_GenericHigherOrderBuilder",
165+
"HigherOrderFormulaBuilder",
166+
"HigherOrderFormulaBuilder3Phase",
167+
)
168+
169+
170+
class _ComposableFormulaEngine(
171+
ABC, Generic[_GenericEngine, _GenericHigherOrderBuilder]
172+
):
173+
"""A base class for formula engines."""
174+
175+
_higher_order_builder: Type[_GenericHigherOrderBuilder]
176+
_task: asyncio.Task[None] | None = None
177+
178+
async def _stop(self) -> None:
179+
"""Stop a running formula engine."""
180+
if self._task is None:
181+
return
182+
await cancel_and_await(self._task)
183+
184+
def __add__(
185+
self,
186+
other: _GenericEngine | _GenericHigherOrderBuilder,
187+
) -> _GenericHigherOrderBuilder:
188+
"""Return a formula builder that adds (data in) `other` to `self`.
189+
190+
Args:
191+
other: A formula receiver, or a formula builder instance corresponding to a
192+
sub-expression.
193+
194+
Returns:
195+
A formula builder that can take further expressions, or can be built
196+
into a formula engine.
197+
"""
198+
return self._higher_order_builder(self) + other # type: ignore
199+
200+
def __sub__(
201+
self, other: _GenericEngine | _GenericHigherOrderBuilder
202+
) -> _GenericHigherOrderBuilder:
203+
"""Return a formula builder that subtracts (data in) `other` from `self`.
204+
205+
Args:
206+
other: A formula receiver, or a formula builder instance corresponding to a
207+
sub-expression.
208+
209+
Returns:
210+
A formula builder that can take further expressions, or can be built
211+
into a formula engine.
212+
"""
213+
return self._higher_order_builder(self) - other # type: ignore
214+
215+
def __mul__(
216+
self, other: _GenericEngine | _GenericHigherOrderBuilder
217+
) -> _GenericHigherOrderBuilder:
218+
"""Return a formula builder that multiplies (data in) `self` with `other`.
219+
220+
Args:
221+
other: A formula receiver, or a formula builder instance corresponding to a
222+
sub-expression.
223+
224+
Returns:
225+
A formula builder that can take further expressions, or can be built
226+
into a formula engine.
227+
"""
228+
return self._higher_order_builder(self) * other # type: ignore
229+
230+
def __truediv__(
231+
self, other: _GenericEngine | _GenericHigherOrderBuilder
232+
) -> _GenericHigherOrderBuilder:
233+
"""Return a formula builder that divides (data in) `self` by `other`.
234+
235+
Args:
236+
other: A formula receiver, or a formula builder instance corresponding to a
237+
sub-expression.
238+
239+
Returns:
240+
A formula builder that can take further expressions, or can be built
241+
into a formula engine.
242+
"""
243+
return self._higher_order_builder(self) / other # type: ignore
244+
245+
162246
class FormulaEngine:
163247
"""
164248
The FormulaEngine evaluates formulas and streams the results.

0 commit comments

Comments
 (0)