exhaust 0.2.5

Trait and derive macro for working with all possible values of a type (exhaustive enumeration).
Documentation
use core::cell;

use crate::patterns::{delegate_factory_and_iter, impl_newtype_generic};
use crate::Exhaust;

impl_newtype_generic!(T: [], cell::Cell<T>, cell::Cell::new);
impl_newtype_generic!(T: [], cell::RefCell<T>, cell::RefCell::new);
impl_newtype_generic!(T: [], cell::UnsafeCell<T>, cell::UnsafeCell::new);

impl<T: Exhaust> Exhaust for cell::OnceCell<T> {
    delegate_factory_and_iter!(Option<T>);

    fn from_factory(factory: Self::Factory) -> Self {
        let cell = cell::OnceCell::new();
        if let Some(value) = Option::<T>::from_factory(factory) {
            match cell.set(value) {
                Ok(()) => {}
                Err(_) => unreachable!(),
            }
        }
        cell
    }
}