mirror of
https://github.com/aljazceru/turso.git
synced 2025-12-25 20:14:21 +01:00
62 lines
1.5 KiB
Rust
62 lines
1.5 KiB
Rust
use crate::types::OwnedRecord;
|
|
use std::cmp::Ordering;
|
|
|
|
pub struct Sorter {
|
|
records: Vec<OwnedRecord>,
|
|
current: Option<OwnedRecord>,
|
|
order: Vec<bool>,
|
|
}
|
|
|
|
impl Sorter {
|
|
pub fn new(order: Vec<bool>) -> Self {
|
|
Self {
|
|
records: Vec::new(),
|
|
current: None,
|
|
order,
|
|
}
|
|
}
|
|
pub fn is_empty(&self) -> bool {
|
|
self.records.is_empty()
|
|
}
|
|
|
|
pub fn has_more(&self) -> bool {
|
|
self.current.is_some()
|
|
}
|
|
|
|
// We do the sorting here since this is what is called by the SorterSort instruction
|
|
pub fn sort(&mut self) {
|
|
self.records.sort_by(|a, b| {
|
|
let cmp_by_idx = |idx: usize, ascending: bool| {
|
|
let a = &a.values[idx];
|
|
let b = &b.values[idx];
|
|
if ascending {
|
|
a.cmp(b)
|
|
} else {
|
|
b.cmp(a)
|
|
}
|
|
};
|
|
|
|
let mut cmp_ret = Ordering::Equal;
|
|
for (idx, &is_asc) in self.order.iter().enumerate() {
|
|
cmp_ret = cmp_by_idx(idx, is_asc);
|
|
if cmp_ret != Ordering::Equal {
|
|
break;
|
|
}
|
|
}
|
|
cmp_ret
|
|
});
|
|
self.records.reverse();
|
|
self.next()
|
|
}
|
|
pub fn next(&mut self) {
|
|
self.current = self.records.pop();
|
|
}
|
|
pub fn record(&self) -> Option<&OwnedRecord> {
|
|
self.current.as_ref()
|
|
}
|
|
|
|
pub fn insert(&mut self, record: &OwnedRecord) {
|
|
self.records.push(OwnedRecord::new(record.values.to_vec()));
|
|
}
|
|
}
|