use std::iter;
use std::iter::Once;
use relp_num::One;
use crate::algorithm::two_phase::matrix_provider::column::Column;
use crate::algorithm::two_phase::matrix_provider::column::ColumnIterator;
use crate::data::linear_algebra::SparseTuple;
pub trait Identity: Column {
fn identity(i: usize, len: usize) -> Self;
}
const ONE: One = One;
#[derive(Debug, Copy, Clone)]
pub struct IdentityColumn {
index: usize,
}
impl IdentityColumn {
pub fn new(index: usize) -> Self {
Self {
index,
}
}
}
impl Column for IdentityColumn {
type F = One;
type Iter<'a> = impl ColumnIterator<'a, F=Self::F>;
fn iter(&self) -> Self::Iter<'_> {
iter::once((self.index, &ONE))
}
fn index_to_string(&self, i: usize) -> String {
if i == self.index {
"1"
} else {
"0"
}.to_string()
}
}
impl IntoIterator for IdentityColumn {
type Item = SparseTuple<One>;
type IntoIter = Once<Self::Item>;
fn into_iter(self) -> Self::IntoIter {
iter::once((self.index, One))
}
}