use std::fmt::{Debug, Display};
use std::any::TypeId;
use std::any::Any;
fn is_string<T: ?Sized + Any>(_s: &T) -> bool {
TypeId::of::<String>() == TypeId::of::<T>()
}
fn is_int<T: ?Sized + Any>(_s: &T) -> bool {
TypeId::of::<i32>() == TypeId::of::<T>()
}
fn is_f32<T: ?Sized + Any>(_s: &T) -> bool {
TypeId::of::<f32>() == TypeId::of::<T>()
}
fn is_f64<T: ?Sized + Any>(_s: &T) -> bool {
TypeId::of::<f64>() == TypeId::of::<T>()
}
fn is_arr<T: ?Sized + Any>(_s: &T) -> bool {
TypeId::of::<Vec<i32>>() == TypeId::of::<T>()
}
fn is_str<T: ?Sized + Any>(_s: &T) -> bool {
TypeId::of::<&str>() == TypeId::of::<T>()
}
trait N:Debug{}
impl N for i32 {}
impl N for f32 {}
impl N for i64 {}
impl N for f64 {}
impl N for String {}
impl N for &str {}
impl N for Vec<i32>{}
fn dosm(c: impl N + 'static){
// println!("{}", &c);
if is_f32(&c){
println!("float32 is");
}
if is_f64(&c){
println!("float64 is");
}
if is_int(&c){
println!("int is");
}
if is_string(&c){
println!("string is");
}
if is_arr(&c){
println!("arr is");
}
if is_str(&c){
println!("str is");
}
}
fn main(){
let a = vec![1,2,3,4,5,6,7,8,9];
let b = "A";
dosm(b);
}