@@ -133,3 +133,62 @@ def send(
133133 else :
134134 serialized = list (chain (* message .items ()))
135135 self .call_timed_with_nudge (deadline , self ._send , f"/{ address } " , serialized )
136+
137+ @alias_param (name = "iterator" , alias = "i" )
138+ @alias_param (name = "divisor" , alias = "d" )
139+ @alias_param (name = "rate" , alias = "r" )
140+ @alias_param (name = "sorted" , alias = "s" )
141+ def send_pure (
142+ self ,
143+ address : Optional [StringElement ] | Callable [[], StringElement ],
144+ iterator : Number | Callable [[], Number ] = 0 ,
145+ divisor : NumericElement | Callable [[], NumericElement ] = 1 ,
146+ rate : NumericElement | Callable [[], NumericElement ] = 1 ,
147+ sort : bool | Callable [[], bool ] = True ,
148+ ** rest_of_pattern : dict ,
149+ ) -> None :
150+
151+ def _util_flatten (value ):
152+ if isinstance (value , (list , tuple )):
153+ return list (value )
154+ else :
155+ return [value ]
156+
157+ if address is None :
158+ return
159+
160+ if self .apply_conditional_mask_to_bars (
161+ pattern = rest_of_pattern ,
162+ ):
163+ return
164+
165+ pattern = {"address" : _resolve_if_callable (address )}
166+
167+ # Evaluate all potential callables
168+ for key , value in rest_of_pattern .items ():
169+ pattern [key ] = _resolve_if_callable (value )
170+
171+ deadline = self .env .clock .shifted_time
172+ for message in self .pattern_reduce (
173+ pattern ,
174+ _resolve_if_callable (iterator ),
175+ _resolve_if_callable (divisor ),
176+ _resolve_if_callable (rate ),
177+ ):
178+ if message ["address" ] is None :
179+ continue
180+ address = message .pop ("address" )
181+ if sort :
182+ serialized = list (
183+ chain (
184+ * [
185+ _util_flatten (value )
186+ for key , value in sorted (message .items ())
187+ ]
188+ )
189+ )
190+ else :
191+ serialized = list (
192+ chain (* [_util_flatten (value ) for value in message .values ()])
193+ )
194+ self .call_timed_with_nudge (deadline , self ._send , f"/{ address } " , serialized )
0 commit comments