use core::fmt::Write as _;
use deep_causality_num::Float106;
const PAIR_SEP: char = '|';
pub trait TableScalar: Copy {
fn write_cell(&self, out: &mut String);
fn parse_cell(cell: &str) -> Option<Self>;
}
impl TableScalar for f64 {
fn write_cell(&self, out: &mut String) {
let _ = write!(out, "{self}");
}
fn parse_cell(cell: &str) -> Option<Self> {
cell.trim().parse::<f64>().ok()
}
}
impl TableScalar for f32 {
fn write_cell(&self, out: &mut String) {
let _ = write!(out, "{self}");
}
fn parse_cell(cell: &str) -> Option<Self> {
cell.trim().parse::<f32>().ok()
}
}
impl TableScalar for Float106 {
fn write_cell(&self, out: &mut String) {
let _ = write!(out, "{}{PAIR_SEP}{}", self.hi(), self.lo());
}
fn parse_cell(cell: &str) -> Option<Self> {
let cell = cell.trim();
match cell.split_once(PAIR_SEP) {
Some((hi, lo)) => {
let hi = hi.trim().parse::<f64>().ok()?;
let lo = lo.trim().parse::<f64>().ok()?;
Some(Float106::from_raw(hi, lo))
}
None => cell.parse::<f64>().ok().map(Float106::from),
}
}
}