/*
 * Copyright (c) 2025, LJason. All Rights Reserved.
 */

//! 一些实用的方法

use std::sync::{Mutex, MutexGuard};

/// 消除 Mutex 的 `.lock().unwrap()`
///
/// [来源](https://www.reddit.com/r/rust/comments/10f6328/comment/j4vlz4t/)
pub trait LockOrPanic<T> {
    fn lock_or_panic(&self) -> MutexGuard<'_, T>;
}

impl<T> LockOrPanic<T> for Mutex<T> {
    /// 获取互斥锁，在中毒时 panic
    ///
    /// # Panics
    ///
    /// 如果互斥锁被 poison（另一个线程在临界区 panic），此函数会 panic。
    /// 这是有意为之：数据可能已损坏，不应继续操作。
    ///
    /// 如需恢复中毒状态，请直接使用 `.lock()` 并处理 `PoisonError`。
    #[allow(clippy::unwrap_used)]
    fn lock_or_panic(&self) -> MutexGuard<'_, T> {
        self.lock().unwrap()
    }
}
