Skip to content

Commit 2085c9e

Browse files
committed
StepsView is a frozen dataclass
Calling `.filter` no longer modify the view in-place.
1 parent a1e24bf commit 2085c9e

File tree

1 file changed

+18
-22
lines changed

1 file changed

+18
-22
lines changed

src/stagpy/stagyydata.py

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,7 @@ def compose_with(self, other: Filters) -> Filters:
519519
)
520520

521521

522+
@dataclass(frozen=True)
522523
class 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

Comments
 (0)