Slice arrays
This commit is contained in:
@@ -140,6 +140,40 @@ impl PileValue {
|
||||
|
||||
out = e.get(state, idx).await?;
|
||||
}
|
||||
|
||||
PathSegment::Range {
|
||||
start,
|
||||
end,
|
||||
inclusive,
|
||||
} => {
|
||||
let e = match out.map(|x| x.list_extractor()) {
|
||||
Some(e) => e,
|
||||
None => {
|
||||
out = None;
|
||||
continue;
|
||||
}
|
||||
};
|
||||
|
||||
let len = e.len(state).await? as i64;
|
||||
|
||||
let start_idx = if *start >= 0 { *start } else { len + start };
|
||||
let end_idx = if *end >= 0 { *end } else { len + end };
|
||||
let end_idx = if *inclusive { end_idx + 1 } else { end_idx };
|
||||
|
||||
let start_idx = start_idx.max(0) as usize;
|
||||
let end_idx = (end_idx.max(0) as usize).min(len as usize);
|
||||
|
||||
let mut items = Vec::new();
|
||||
for i in start_idx..end_idx {
|
||||
match e.get(state, i).await? {
|
||||
Some(v) => items.push(v),
|
||||
None => break,
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: lazy view?
|
||||
out = Some(PileValue::Array(Arc::new(items)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user