git.delta.rocks / jrsonnet / refs/commits / 7681558ac965

difftreelog

fix SliceArray implementation was dumb

lwnlqzpvYaroslav Bolyukin2026-03-02parent: #3421cac.patch.diff
in: master

1 file changed

modifiedcrates/jrsonnet-evaluator/src/arr/spec.rsdiffbeforeafterboth
31}31}
3232
33impl SliceArray {33impl SliceArray {
34 fn iter(&self) -> impl Iterator<Item = Result<Val>> + '_ {34 fn map_idx(&self, index: usize) -> usize {
35 self.inner
36 .iter()
37 .skip(self.from as usize)
38 .take((self.to - self.from) as usize)
39 .step_by(self.step as usize)
40 }
41
42 fn iter_lazy(&self) -> impl Iterator<Item = Thunk<Val>> + '_ {
43 self.inner
44 .iter_lazy()
45 .skip(self.from as usize)35 self.from as usize + self.step as usize * index
46 .take((self.to - self.from) as usize)
47 .step_by(self.step as usize)
48 }36 }
49
50 fn iter_cheap(&self) -> Option<impl crate::arr::ArrayLikeIter<Val> + '_> {
51 Some(
52 self.inner
53 .iter_cheap()?
54 .skip(self.from as usize)
55 .take((self.to - self.from) as usize)
56 .step_by(self.step as usize),
57 )
58 }
59}37}
60impl ArrayLike for SliceArray {38impl ArrayLike for SliceArray {
61 fn len(&self) -> usize {39 fn len(&self) -> usize {
62 iter::repeat(())
63 .take((self.to - self.from) as usize)40 ((self.to - self.from + self.step - 1) / self.step) as usize
64 .step_by(self.step as usize)
65 .count()
66 }41 }
6742
68 fn get(&self, index: usize) -> Result<Option<Val>> {43 fn get(&self, index: usize) -> Result<Option<Val>> {
69 self.iter().nth(index).transpose()44 self.inner.get(self.map_idx(index))
70 }45 }
7146
72 fn get_lazy(&self, index: usize) -> Option<Thunk<Val>> {47 fn get_lazy(&self, index: usize) -> Option<Thunk<Val>> {
73 self.iter_lazy().nth(index)48 self.inner.get_lazy(self.map_idx(index))
74 }49 }
7550
76 fn get_cheap(&self, index: usize) -> Option<Val> {51 fn get_cheap(&self, index: usize) -> Option<Val> {
77 self.iter_cheap()?.nth(index)52 self.inner.get_cheap(self.map_idx(index))
78 }53 }
79 fn is_cheap(&self) -> bool {54 fn is_cheap(&self) -> bool {
80 self.inner.is_cheap()55 self.inner.is_cheap()