use super::{OptionFmt, OptionFmtOr, OptionFmtOrElse};
use crate::Display;
trait Sealed {}
impl<T> Sealed for Option<T> {}
#[doc = crate::_tags!(result)]
#[doc = crate::_doc_location!("code/result")]
#[cfg_attr(nightly_doc, doc(notable_trait))]
#[expect(private_bounds, reason = "Sealed")]
pub trait OptionExt<T>: Sealed {
#[must_use]
fn has<U: PartialEq<T>>(&self, x: &U) -> bool;
#[must_use]
fn reduce<F: FnOnce(T, T) -> T>(self, other: Option<T>, f: F) -> Option<T>;
#[doc = crate::_doc!(vendor: "fmtor")]
#[must_use]
fn fmt_or<U: Display>(&self, u: U) -> OptionFmtOr<'_, T, U>;
#[must_use]
fn fmt_or_else<U: Display, F: Fn() -> U>(&self, f: F) -> OptionFmtOrElse<'_, T, F>;
#[must_use]
fn fmt_or_empty(&self) -> OptionFmt<'_, T>;
}
impl<T> OptionExt<T> for Option<T> {
#[inline(always)]
fn has<U: PartialEq<T>>(&self, x: &U) -> bool {
self.as_ref().is_some_and(|y| x == y)
}
fn reduce<F: FnOnce(T, T) -> T>(self, other: Option<T>, f: F) -> Option<T> {
match (self, other) {
(Some(l), Some(r)) => Some(f(l, r)),
(x @ Some(_), None) | (None, x @ Some(_)) => x,
(None, None) => None,
}
}
#[inline(always)]
fn fmt_or_empty(&self) -> OptionFmt<'_, T> {
OptionFmt(self)
}
#[inline(always)]
fn fmt_or<U: Display>(&self, u: U) -> OptionFmtOr<'_, T, U> {
OptionFmtOr(self, u)
}
#[inline(always)]
fn fmt_or_else<U: Display, F: Fn() -> U>(&self, f: F) -> OptionFmtOrElse<'_, T, F> {
OptionFmtOrElse(self, f)
}
}