use crate::map::Map;
use core::fmt;

impl Map for bool {
    fn ok(self) -> Result<Self, Self> {
        if self { Ok(true) } else { Err(false) }
    }

    fn ok_or<E>(self, err: E) -> Result<Self, E> {
        if self { Ok(true) } else { Err(err) }
    }

    fn map<T>(self, f: impl FnOnce() -> T) -> Option<T> {
        if self { Some(f()) } else { None }
    }

    fn and_then<T>(self, f: impl FnOnce() -> Option<T>) -> Option<T> {
        if self { f() } else { None }
    }

    fn unwrap(self) -> Self {
        self.expect("Expected 'true', got 'false'")
    }

    fn expect(self, message: impl fmt::Display) -> Self {
        if self { self } else { panic!("{message}") }
    }
}
