use crate::node::Node;
use std::any::TypeId;
pub fn downcast<T: Node + 'static>(node: &dyn Node) -> Option<&T> {
let t = TypeId::of::<T>();
let concrete = node.type_id();
if t == concrete {
let concrete = node as *const dyn Node as *const T;
let concrete = unsafe { &*concrete };
Some(concrete)
} else {
None
}
}
pub fn downcast_mut<T: Node>(node: &mut dyn Node) -> Option<&mut T> {
let t = TypeId::of::<T>();
let concrete = node.type_id();
if t == concrete {
let concrete = node as *mut dyn Node as *mut T;
let concrete = unsafe { &mut *concrete };
Some(concrete)
} else {
None
}
}