use std::collections::{HashMap, HashSet};
pub fn is_empty<T>(value: &Option<T>) -> bool {
value.is_none()
}
pub fn is_empty_string(value: &str) -> bool {
value.is_empty()
}
pub fn is_empty_vec<T>(value: &[T]) -> bool {
value.is_empty()
}
pub fn is_empty_hashmap<K, V>(value: &HashMap<K, V>) -> bool {
value.is_empty()
}
pub fn is_empty_hashset<T>(value: &HashSet<T>) -> bool {
value.is_empty()
}
pub fn is_zero_i32(value: i32) -> bool {
value == 0
}
pub fn is_zero_f64(value: f64) -> bool {
value == 0.0
}
pub fn is_some<T>(value: &Option<T>) -> bool {
value.is_some()
}
pub fn is_none<T>(value: &Option<T>) -> bool {
value.is_none()
}
pub fn get_type_name<T: ?Sized>(_: &T) -> &'static str {
std::any::type_name::<T>()
}
pub fn is_equal<T: PartialEq>(a: &T, b: &T) -> bool {
a == b
}
pub fn is_numeric(s: &str) -> bool {
!s.is_empty() && s.chars().all(|c| c.is_ascii_digit())
}
pub fn is_alphabetic(s: &str) -> bool {
!s.is_empty() && s.chars().all(|c| c.is_alphabetic())
}
pub fn is_alphanumeric(s: &str) -> bool {
!s.is_empty() && s.chars().all(|c| c.is_alphanumeric())
}
pub fn is_identifier(s: &str) -> bool {
if s.is_empty() {
return false;
}
let mut chars = s.chars();
let first = chars.next().unwrap();
if !first.is_alphabetic() && first != '_' {
return false;
}
chars.all(|c| c.is_alphanumeric() || c == '_')
}