88from datetime import datetime , timezone
99from typing import Callable , Iterator , Self , overload
1010
11+ from ._quantities import Quantity
12+
1113UNIX_EPOCH = datetime .fromtimestamp (0.0 , tz = timezone .utc )
1214"""The UNIX epoch (in UTC)."""
1315
@@ -24,7 +26,7 @@ class Sample:
2426 timestamp : datetime
2527 """The time when this sample was generated."""
2628
27- value : float | None = None
29+ value : Quantity | None = None
2830 """The value of this sample."""
2931
3032
@@ -40,16 +42,16 @@ class Sample3Phase:
4042
4143 timestamp : datetime
4244 """The time when this sample was generated."""
43- value_p1 : float | None
45+ value_p1 : Quantity | None
4446 """The value of the 1st phase in this sample."""
4547
46- value_p2 : float | None
48+ value_p2 : Quantity | None
4749 """The value of the 2nd phase in this sample."""
4850
49- value_p3 : float | None
51+ value_p3 : Quantity | None
5052 """The value of the 3rd phase in this sample."""
5153
52- def __iter__ (self ) -> Iterator [float | None ]:
54+ def __iter__ (self ) -> Iterator [Quantity | None ]:
5355 """Return an iterator that yields values from each of the phases.
5456
5557 Yields:
@@ -60,14 +62,14 @@ def __iter__(self) -> Iterator[float | None]:
6062 yield self .value_p3
6163
6264 @overload
63- def max (self , default : float ) -> float :
65+ def max (self , default : Quantity ) -> Quantity :
6466 ...
6567
6668 @overload
67- def max (self , default : None = None ) -> float | None :
69+ def max (self , default : None = None ) -> Quantity | None :
6870 ...
6971
70- def max (self , default : float | None = None ) -> float | None :
72+ def max (self , default : Quantity | None = None ) -> Quantity | None :
7173 """Return the max value among all phases, or default if they are all `None`.
7274
7375 Args:
@@ -78,21 +80,21 @@ def max(self, default: float | None = None) -> float | None:
7880 """
7981 if not any (self ):
8082 return default
81- value : float = functools .reduce (
83+ value : Quantity = functools .reduce (
8284 lambda x , y : x if x > y else y ,
8385 filter (None , self ),
8486 )
8587 return value
8688
8789 @overload
88- def min (self , default : float ) -> float :
90+ def min (self , default : Quantity ) -> Quantity :
8991 ...
9092
9193 @overload
92- def min (self , default : None = None ) -> float | None :
94+ def min (self , default : None = None ) -> Quantity | None :
9395 ...
9496
95- def min (self , default : float | None = None ) -> float | None :
97+ def min (self , default : Quantity | None = None ) -> Quantity | None :
9698 """Return the min value among all phases, or default if they are all `None`.
9799
98100 Args:
@@ -103,14 +105,16 @@ def min(self, default: float | None = None) -> float | None:
103105 """
104106 if not any (self ):
105107 return default
106- value : float = functools .reduce (
108+ value : Quantity = functools .reduce (
107109 lambda x , y : x if x < y else y ,
108110 filter (None , self ),
109111 )
110112 return value
111113
112114 def map (
113- self , function : Callable [[float ], float ], default : float | None = None
115+ self ,
116+ function : Callable [[Quantity ], Quantity ],
117+ default : Quantity | None = None ,
114118 ) -> Self :
115119 """Apply the given function on each of the phase values and return the result.
116120
0 commit comments