@@ -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+
162246class FormulaEngine :
163247 """
164248 The FormulaEngine evaluates formulas and streams the results.
0 commit comments