use crate::Field;
use std::ops::{Range, RangeFrom, RangeFull, RangeInclusive, RangeTo};
use std::sync::Arc;
pub trait FieldSelector {
fn resolve_fields(&self, fields: &[Arc<Field>]) -> Vec<usize>;
fn to_owned(&self) -> Box<dyn FieldSelector + Send + Sync>;
}
pub trait DataSelector {
fn resolve_indices(&self, count: usize) -> Vec<usize>;
fn is_contiguous(&self) -> bool {
false }
}
pub trait ColumnSelection {
type View;
type DataView;
fn c<S: FieldSelector>(&self, selection: S) -> Self::View;
fn col(&self, name: &str) -> Self::View {
self.c(name)
}
fn col_ix(&self, idx: usize) -> Option<Self::DataView>;
fn col_vec(&self) -> Vec<Self::DataView>;
fn get_cols(&self) -> Vec<Arc<Field>>;
}
pub trait RowSelection {
type View;
fn r<S: DataSelector>(&self, selection: S) -> Self::View;
fn get_row_count(&self) -> usize;
}
pub trait Selection2D: ColumnSelection + RowSelection {}
impl<T> Selection2D for T where
T: ColumnSelection + RowSelection<View = <T as ColumnSelection>::View>
{
}
impl FieldSelector for &str {
fn resolve_fields(&self, fields: &[Arc<Field>]) -> Vec<usize> {
fields
.iter()
.position(|f| f.name == *self)
.into_iter()
.collect()
}
fn to_owned(&self) -> Box<dyn FieldSelector + Send + Sync> {
Box::new(vec![self.to_string()])
}
}
impl FieldSelector for &[&str] {
fn resolve_fields(&self, fields: &[Arc<Field>]) -> Vec<usize> {
self.iter()
.filter_map(|name| fields.iter().position(|f| f.name == *name))
.collect()
}
fn to_owned(&self) -> Box<dyn FieldSelector + Send + Sync> {
Box::new(self.iter().map(|s| s.to_string()).collect::<Vec<String>>())
}
}
impl<const N: usize> FieldSelector for &[&str; N] {
fn resolve_fields(&self, fields: &[Arc<Field>]) -> Vec<usize> {
self.iter()
.filter_map(|name| fields.iter().position(|f| f.name == *name))
.collect()
}
fn to_owned(&self) -> Box<dyn FieldSelector + Send + Sync> {
Box::new(self.iter().map(|s| s.to_string()).collect::<Vec<String>>())
}
}
impl FieldSelector for Vec<&str> {
fn resolve_fields(&self, fields: &[Arc<Field>]) -> Vec<usize> {
self.iter()
.filter_map(|name| fields.iter().position(|f| f.name == *name))
.collect()
}
fn to_owned(&self) -> Box<dyn FieldSelector + Send + Sync> {
Box::new(self.iter().map(|s| s.to_string()).collect::<Vec<String>>())
}
}
impl FieldSelector for Vec<String> {
fn resolve_fields(&self, fields: &[Arc<Field>]) -> Vec<usize> {
self.iter()
.filter_map(|name| fields.iter().position(|f| f.name.as_str() == name.as_str()))
.collect()
}
fn to_owned(&self) -> Box<dyn FieldSelector + Send + Sync> {
Box::new(self.clone())
}
}
impl FieldSelector for usize {
fn resolve_fields(&self, fields: &[Arc<Field>]) -> Vec<usize> {
if *self < fields.len() {
vec![*self]
} else {
Vec::new()
}
}
fn to_owned(&self) -> Box<dyn FieldSelector + Send + Sync> {
Box::new(vec![*self])
}
}
impl FieldSelector for &[usize] {
fn resolve_fields(&self, fields: &[Arc<Field>]) -> Vec<usize> {
self.iter()
.copied()
.filter(|&idx| idx < fields.len())
.collect()
}
fn to_owned(&self) -> Box<dyn FieldSelector + Send + Sync> {
Box::new(self.to_vec())
}
}
impl<const N: usize> FieldSelector for &[usize; N] {
fn resolve_fields(&self, fields: &[Arc<Field>]) -> Vec<usize> {
self.iter()
.copied()
.filter(|&idx| idx < fields.len())
.collect()
}
fn to_owned(&self) -> Box<dyn FieldSelector + Send + Sync> {
Box::new(self.to_vec())
}
}
impl FieldSelector for Vec<usize> {
fn resolve_fields(&self, fields: &[Arc<Field>]) -> Vec<usize> {
self.iter()
.copied()
.filter(|&idx| idx < fields.len())
.collect()
}
fn to_owned(&self) -> Box<dyn FieldSelector + Send + Sync> {
Box::new(self.clone())
}
}
impl FieldSelector for Range<usize> {
fn resolve_fields(&self, fields: &[Arc<Field>]) -> Vec<usize> {
let end = self.end.min(fields.len());
(self.start..end).collect()
}
fn to_owned(&self) -> Box<dyn FieldSelector + Send + Sync> {
Box::new(self.clone())
}
}
impl FieldSelector for RangeFrom<usize> {
fn resolve_fields(&self, fields: &[Arc<Field>]) -> Vec<usize> {
(self.start..fields.len()).collect()
}
fn to_owned(&self) -> Box<dyn FieldSelector + Send + Sync> {
Box::new(self.clone())
}
}
impl FieldSelector for RangeTo<usize> {
fn resolve_fields(&self, fields: &[Arc<Field>]) -> Vec<usize> {
let end = self.end.min(fields.len());
(0..end).collect()
}
fn to_owned(&self) -> Box<dyn FieldSelector + Send + Sync> {
Box::new(self.clone())
}
}
impl FieldSelector for RangeFull {
fn resolve_fields(&self, fields: &[Arc<Field>]) -> Vec<usize> {
(0..fields.len()).collect()
}
fn to_owned(&self) -> Box<dyn FieldSelector + Send + Sync> {
Box::new(..)
}
}
impl FieldSelector for RangeInclusive<usize> {
fn resolve_fields(&self, fields: &[Arc<Field>]) -> Vec<usize> {
let start = *self.start();
let end = (*self.end() + 1).min(fields.len());
(start..end).collect()
}
fn to_owned(&self) -> Box<dyn FieldSelector + Send + Sync> {
Box::new(self.clone())
}
}
impl FieldSelector for Box<dyn FieldSelector + Send + Sync> {
fn resolve_fields(&self, fields: &[Arc<Field>]) -> Vec<usize> {
(**self).resolve_fields(fields)
}
fn to_owned(&self) -> Box<dyn FieldSelector + Send + Sync> {
(**self).to_owned()
}
}
impl DataSelector for usize {
fn resolve_indices(&self, count: usize) -> Vec<usize> {
if *self < count {
vec![*self]
} else {
Vec::new()
}
}
}
impl DataSelector for &[usize] {
fn resolve_indices(&self, count: usize) -> Vec<usize> {
self.iter().copied().filter(|&idx| idx < count).collect()
}
}
impl<const N: usize> DataSelector for &[usize; N] {
fn resolve_indices(&self, count: usize) -> Vec<usize> {
self.iter().copied().filter(|&idx| idx < count).collect()
}
}
impl DataSelector for Vec<usize> {
fn resolve_indices(&self, count: usize) -> Vec<usize> {
self.iter().copied().filter(|&idx| idx < count).collect()
}
}
impl DataSelector for Range<usize> {
fn resolve_indices(&self, count: usize) -> Vec<usize> {
let end = self.end.min(count);
(self.start..end).collect()
}
fn is_contiguous(&self) -> bool {
true
}
}
impl DataSelector for RangeFrom<usize> {
fn resolve_indices(&self, count: usize) -> Vec<usize> {
(self.start..count).collect()
}
fn is_contiguous(&self) -> bool {
true
}
}
impl DataSelector for RangeTo<usize> {
fn resolve_indices(&self, count: usize) -> Vec<usize> {
let end = self.end.min(count);
(0..end).collect()
}
fn is_contiguous(&self) -> bool {
true
}
}
impl DataSelector for RangeFull {
fn resolve_indices(&self, count: usize) -> Vec<usize> {
(0..count).collect()
}
fn is_contiguous(&self) -> bool {
true
}
}
impl DataSelector for RangeInclusive<usize> {
fn resolve_indices(&self, count: usize) -> Vec<usize> {
let start = *self.start();
let end = (*self.end() + 1).min(count);
(start..end).collect()
}
fn is_contiguous(&self) -> bool {
true
}
}