use crate::syntax::notation::{char_to_label, split_and_validate_notation};
use crate::{Error, Result};
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Subscripts {
pub inputs: Vec<Vec<u32>>,
pub output: Vec<u32>,
}
impl Subscripts {
pub fn new(inputs: &[&[u32]], output: &[u32]) -> Self {
Self {
inputs: inputs.iter().map(|s| s.to_vec()).collect(),
output: output.to_vec(),
}
}
pub fn parse(notation: &str) -> Result<Self> {
let (inputs_str, output_str) = split_and_validate_notation(notation)?;
if inputs_str.contains(['(', ')']) {
return Err(Error::InvalidArgument(
"Subscripts::parse does not accept parentheses; use NestedEinsum::parse to preserve parenthesized contraction order"
.into(),
));
}
let output: Vec<u32> = output_str
.chars()
.map(char_to_label)
.collect::<Result<_>>()?;
let inputs: Vec<Vec<u32>> = inputs_str
.split(',')
.map(|s| s.chars().map(char_to_label).collect::<Result<_>>())
.collect::<Result<_>>()?;
Ok(Self { inputs, output })
}
}
#[cfg(test)]
mod tests;