pub type Words<'a> = &'a [&'a str];
pub trait Sorts {
type Ty;
type Field;
}
pub trait ShapeAlg: Sorts {
fn truth(&self) -> Self::Ty;
fn unit(&self) -> Self::Ty;
fn text(&self) -> Self::Ty;
fn literal(&self, text: &str) -> Self::Ty;
fn name_word(&self, words: Words<'_>) -> Self::Ty;
fn int(&self, signed: bool, bits: u16) -> Self::Ty;
fn float(&self, bits: u16) -> Self::Ty;
fn bytes(&self, len: Option<usize>) -> Self::Ty;
fn hex(&self, item: Self::Ty) -> Self::Ty;
fn decimal(&self, item: Self::Ty) -> Self::Ty;
fn base64(&self, item: Self::Ty) -> Self::Ty;
fn opt(&self, item: Self::Ty) -> Self::Ty;
fn seq(&self, item: Self::Ty) -> Self::Ty;
fn map(&self, key: Self::Ty, value: Self::Ty) -> Self::Ty;
fn product(&self, fields: Vec<Self::Field>) -> Self::Ty;
fn choice(&self, alternatives: Vec<Self::Ty>) -> Self::Ty;
fn named(&self, words: Words<'_>, body: Self::Ty) -> Self::Ty;
fn reference(&self, words: Words<'_>) -> Self::Ty;
}
pub trait FieldAlg: Sorts {
fn field(&self, words: Words<'_>, shape: Self::Ty) -> Self::Field;
fn merge(&self, shape: Self::Ty) -> Self::Field;
}