@@ -519,6 +519,7 @@ def compose_with(self, other: Filters) -> Filters:
519519 )
520520
521521
522+ @dataclass (frozen = True )
522523class StepsView :
523524 """Filtered iterator over steps or snaps.
524525
@@ -531,10 +532,9 @@ class StepsView:
531532 items: iterable of isteps/isnaps or slices.
532533 """
533534
534- def __init__ (self , steps_col : Steps | Snaps , items : Sequence [StepIndex ]):
535- self ._col = steps_col
536- self ._items = items
537- self ._flt = Filters ()
535+ over : Steps | Snaps
536+ items : Sequence [StepIndex ]
537+ filters : Filters = field (default_factory = Filters )
538538
539539 @cached_property
540540 def rprofs_averaged (self ) -> RprofsAveraged :
@@ -546,32 +546,25 @@ def stepstr(self) -> str:
546546 """String representation of the requested set of steps."""
547547 items = []
548548 no_slice = True
549- for item in self ._items :
549+ for item in self .items :
550550 if isinstance (item , slice ):
551- items .append ("{}:{}:{}" .format (* item .indices (len (self ._col ))))
551+ items .append ("{}:{}:{}" .format (* item .indices (len (self .over ))))
552552 no_slice = False
553553 else :
554554 items .append (repr (item ))
555555 item_str = "," .join (items )
556556 if no_slice and len (items ) == 1 :
557557 item_str += ","
558- colstr = repr (self ._col ).rsplit ("." , maxsplit = 1 )[- 1 ]
558+ colstr = repr (self .over ).rsplit ("." , maxsplit = 1 )[- 1 ]
559559 return f"{ colstr } [{ item_str } ]"
560560
561- def __repr__ (self ) -> str :
562- rep = f"{ self ._col .sdat !r} .{ self .stepstr } "
563- flts = repr (self ._flt )
564- if flts :
565- rep += f".filter({ flts } )"
566- return rep
567-
568561 def _pass (self , item : int ) -> bool :
569562 """Check whether an item passes the filters."""
570563 try :
571- step = self ._col [item ]
564+ step = self .over [item ]
572565 except KeyError :
573566 return False
574- return self ._flt .passes (step )
567+ return self .filters .passes (step )
575568
576569 def filter (
577570 self ,
@@ -611,16 +604,19 @@ def filter(
611604 fields = set () if fields is None else set (fields ),
612605 funcs = [] if func is None else [func ],
613606 )
614- self ._flt = self ._flt .compose_with (new_filters )
615- return self
607+ return StepsView (
608+ over = self .over ,
609+ items = self .items ,
610+ filters = self .filters .compose_with (new_filters ),
611+ )
616612
617613 def __iter__ (self ) -> Iterator [Step ]:
618- for item in self ._items :
614+ for item in self .items :
619615 if isinstance (item , slice ):
620- idx = item .indices (len (self ._col ))
621- yield from (self ._col [i ] for i in range (* idx ) if self ._pass (i ))
616+ idx = item .indices (len (self .over ))
617+ yield from (self .over [i ] for i in range (* idx ) if self ._pass (i ))
622618 elif self ._pass (item ):
623- yield self ._col [item ]
619+ yield self .over [item ]
624620
625621 def __eq__ (self , other : object ) -> bool :
626622 if not isinstance (other , abc .Iterable ):
0 commit comments