use faer::traits::{ComplexField, RealField};
use num_traits::float::TotalOrder;
use num_traits::{Float, FromPrimitive, ToPrimitive};
use std::fmt::Display;
use std::ops::{AddAssign, Div, DivAssign, Mul, MulAssign, Sub, SubAssign};
pub trait BixverseFloat:
Float
+ FromPrimitive
+ ToPrimitive
+ ComplexField
+ Copy
+ 'static
+ RealField
+ AddAssign
+ DivAssign
+ SubAssign
+ MulAssign
+ Div
+ Display
+ Sub
+ Mul
+ Div
+ TotalOrder
+ Clone
{
}
impl<T> BixverseFloat for T where
T: Float
+ FromPrimitive
+ ToPrimitive
+ ComplexField
+ Copy
+ 'static
+ RealField
+ AddAssign
+ DivAssign
+ SubAssign
+ MulAssign
+ Div
+ Display
+ Sub
+ Mul
+ Div
+ TotalOrder
+ Clone
{
}
pub use bixverse_sparse::traits::{BixverseNumeric, VecIndexCast};
pub trait VecConvert<U> {
fn r_int_convert(self) -> Vec<U>;
fn r_int_convert_shift(self) -> Vec<U>;
}
impl VecConvert<i32> for Vec<usize> {
fn r_int_convert(self) -> Vec<i32> {
self.into_iter().map(|x| x as i32).collect()
}
fn r_int_convert_shift(self) -> Vec<i32> {
self.into_iter().map(|x| (x as i32) + 1).collect()
}
}
impl VecConvert<i32> for &[&usize] {
fn r_int_convert(self) -> Vec<i32> {
self.iter().map(|&&x| x as i32).collect()
}
fn r_int_convert_shift(self) -> Vec<i32> {
self.iter().map(|&&x| (x as i32) + 1).collect()
}
}
impl VecConvert<i32> for Vec<u32> {
fn r_int_convert(self) -> Vec<i32> {
self.into_iter().map(|x| x as i32).collect()
}
fn r_int_convert_shift(self) -> Vec<i32> {
self.into_iter().map(|x| (x as i32) + 1).collect()
}
}
impl VecConvert<usize> for Vec<i32> {
fn r_int_convert(self) -> Vec<usize> {
self.into_iter().map(|x| x as usize).collect()
}
fn r_int_convert_shift(self) -> Vec<usize> {
self.into_iter().map(|x| (x - 1) as usize).collect()
}
}
impl VecConvert<i32> for &[usize] {
fn r_int_convert(self) -> Vec<i32> {
self.iter().map(|&x| x as i32).collect()
}
fn r_int_convert_shift(self) -> Vec<i32> {
self.iter().map(|&x| (x as i32) + 1).collect()
}
}
impl VecConvert<usize> for &[i32] {
fn r_int_convert(self) -> Vec<usize> {
self.iter().map(|&x| x as usize).collect()
}
fn r_int_convert_shift(self) -> Vec<usize> {
self.iter().map(|&x| (x - 1) as usize).collect()
}
}
pub trait VecFloatConvert<U> {
fn r_float_convert(self) -> Vec<U>;
}
impl VecFloatConvert<f32> for Vec<f64> {
fn r_float_convert(self) -> Vec<f32> {
self.into_iter().map(|x| x as f32).collect()
}
}
impl VecFloatConvert<f64> for Vec<f32> {
fn r_float_convert(self) -> Vec<f64> {
self.into_iter().map(|x| x as f64).collect()
}
}
impl VecFloatConvert<f64> for &[f32] {
fn r_float_convert(self) -> Vec<f64> {
self.iter().map(|x| *x as f64).collect()
}
}
impl VecFloatConvert<f32> for &[f64] {
fn r_float_convert(self) -> Vec<f32> {
self.iter().map(|&x| x as f32).collect()
}
}