use std::panic::{AssertUnwindSafe, catch_unwind, resume_unwind};
#[derive(Debug)]
struct Failure(String);
pub fn catch<T>(operation: impl FnOnce() -> T) -> Result<T, String> {
match catch_unwind(AssertUnwindSafe(operation)) {
Ok(value) => Ok(value),
Err(payload) => match payload.downcast::<Failure>() {
Ok(error) => Err(error.0),
Err(payload) => resume_unwind(payload),
},
}
}
pub(crate) fn for_trait(sequence: &crate::LazySeq) -> crate::Value {
sequence
.try_realize()
.unwrap_or_else(|message| resume_unwind(Box::new(Failure(message))))
}
pub fn is_inert(value: &crate::Value) -> bool {
use crate::Value;
matches!(
value.unwrap_meta(),
Value::Nil
| Value::Bool(_)
| Value::Long(_)
| Value::Double(_)
| Value::Char(_)
| Value::Str(_)
| Value::Keyword(_)
| Value::Symbol(_)
| Value::BigInt(_)
| Value::BigDecimal(_)
| Value::Ratio(_)
| Value::Uuid(_)
| Value::Pattern(_)
)
}