mirror of
https://github.com/Dummi26/mers.git
synced 2025-04-28 18:16:05 +02:00
139 lines
3.6 KiB
Rust
Executable File
139 lines
3.6 KiB
Rust
Executable File
use std::{any::Any, fmt::Display, sync::Arc};
|
|
|
|
use super::{Data, MersData, MersType, Type};
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct Tuple(pub Vec<Data>);
|
|
|
|
impl Tuple {
|
|
pub fn len(&self) -> usize {
|
|
self.0.len()
|
|
}
|
|
pub fn get(&self, i: usize) -> Option<&Data> {
|
|
self.0.get(i)
|
|
}
|
|
}
|
|
|
|
impl MersData for Tuple {
|
|
fn is_eq(&self, other: &dyn MersData) -> bool {
|
|
if let Some(other) = other.as_any().downcast_ref::<Self>() {
|
|
other.0 == self.0
|
|
} else {
|
|
false
|
|
}
|
|
}
|
|
fn iterable(&self) -> Option<Box<dyn Iterator<Item = Data>>> {
|
|
Some(Box::new(self.0.clone().into_iter()))
|
|
}
|
|
fn clone(&self) -> Box<dyn MersData> {
|
|
Box::new(Clone::clone(self))
|
|
}
|
|
fn as_type(&self) -> Type {
|
|
Type::new(TupleT(self.0.iter().map(|v| v.get().as_type()).collect()))
|
|
}
|
|
fn as_any(&self) -> &dyn Any {
|
|
self
|
|
}
|
|
fn mut_any(&mut self) -> &mut dyn Any {
|
|
self
|
|
}
|
|
fn to_any(self) -> Box<dyn Any> {
|
|
Box::new(self)
|
|
}
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct TupleT(pub Vec<Type>);
|
|
impl MersType for TupleT {
|
|
fn iterable(&self) -> Option<Type> {
|
|
let mut o = Type::empty();
|
|
for t in self.0.iter() {
|
|
o.add(Arc::new(t.clone()));
|
|
}
|
|
Some(o)
|
|
}
|
|
fn is_same_type_as(&self, other: &dyn MersType) -> bool {
|
|
if let Some(other) = other.as_any().downcast_ref::<Self>() {
|
|
self.0.len() == other.0.len()
|
|
&& self
|
|
.0
|
|
.iter()
|
|
.zip(other.0.iter())
|
|
.all(|(s, o)| s.is_same_type_as(o))
|
|
} else {
|
|
false
|
|
}
|
|
}
|
|
fn is_included_in_single(&self, target: &dyn MersType) -> bool {
|
|
if let Some(target) = target.as_any().downcast_ref::<Self>() {
|
|
self.0.len() == target.0.len()
|
|
&& self
|
|
.0
|
|
.iter()
|
|
.zip(target.0.iter())
|
|
.all(|(s, t)| s.is_included_in(t))
|
|
} else {
|
|
false
|
|
}
|
|
}
|
|
fn subtypes(&self, acc: &mut Type) {
|
|
self.gen_subtypes_recursively(acc, &mut Vec::with_capacity(self.0.len()));
|
|
}
|
|
fn as_any(&self) -> &dyn Any {
|
|
self
|
|
}
|
|
fn mut_any(&mut self) -> &mut dyn Any {
|
|
self
|
|
}
|
|
fn to_any(self) -> Box<dyn Any> {
|
|
Box::new(self)
|
|
}
|
|
}
|
|
|
|
impl Display for Tuple {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
write!(f, "(")?;
|
|
for (i, c) in self.0.iter().enumerate() {
|
|
if i > 0 {
|
|
write!(f, ", ")?;
|
|
}
|
|
write!(f, "{}", c.get())?;
|
|
}
|
|
write!(f, ")")?;
|
|
Ok(())
|
|
}
|
|
}
|
|
impl Display for TupleT {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
write!(f, "(")?;
|
|
for (i, c) in self.0.iter().enumerate() {
|
|
if i > 0 {
|
|
write!(f, ", ")?;
|
|
}
|
|
write!(f, "{}", c)?;
|
|
}
|
|
write!(f, ")")?;
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
impl TupleT {
|
|
pub fn gen_subtypes_recursively(&self, acc: &mut Type, types: &mut Vec<Arc<dyn MersType>>) {
|
|
if types.len() >= self.0.len() {
|
|
let nt = Self(
|
|
types
|
|
.iter()
|
|
.map(|v| Type::newm(vec![Arc::clone(v)]))
|
|
.collect(),
|
|
);
|
|
acc.add(Arc::new(nt));
|
|
} else {
|
|
for t in self.0[types.len()].subtypes_type().types {
|
|
types.push(t);
|
|
self.gen_subtypes_recursively(acc, types);
|
|
types.pop();
|
|
}
|
|
}
|
|
}
|
|
}
|