use crate::traits::Sealed;
use core::{
    cell::RefCell,
    hash::{Hash, Hasher},
    mem,
    ops::{Bound, RangeBounds},
};

pub trait RefCell_v1_35<T>: Sealed<RefCell<T>> {
    fn replace_with<F: FnOnce(&mut T) -> T>(&self, f: F) -> T;
}

impl<T> RefCell_v1_35<T> for RefCell<T> {
    #[inline]
    fn replace_with<F: FnOnce(&mut T) -> T>(&self, f: F) -> T {
        let mut_borrow = &mut *self.borrow_mut();
        let replacement = f(mut_borrow);
        mem::replace(mut_borrow, replacement)
    }
}

pub trait Option_v1_35<'a, T: Copy + 'a>: Sealed<Option<&'a T>> {
    fn copied(self) -> Option<T>;
}

impl<'a, T: Copy + 'a> Option_v1_35<'a, T> for Option<&'a T> {
    fn copied(self) -> Option<T> {
        self.map(|&t| t)
    }
}

pub fn hash<T: ?Sized, S: Hasher>(hashee: *const T, into: &mut S) {
    hashee.hash(into);
}

pub trait RangeBounds_v1_35<T>: RangeBounds<T> {
    fn contains<U>(&self, item: &U) -> bool
    where
        T: PartialOrd<U>,
        U: ?Sized + PartialOrd<T>;
}

impl<T: PartialOrd<T>, RB: RangeBounds<T>> RangeBounds_v1_35<T> for RB {
    fn contains<U>(&self, item: &U) -> bool
    where
        T: PartialOrd<U>,
        U: ?Sized + PartialOrd<T>,
    {
        contains(self, item)
    }
}

fn contains<T, U>(range: &impl RangeBounds<T>, item: &U) -> bool
where
    T: ?Sized + PartialOrd<U>,
    U: ?Sized + PartialOrd<T>,
{
    (match range.start_bound() {
        Bound::Included(ref start) => *start <= item,
        Bound::Excluded(ref start) => *start < item,
        Bound::Unbounded => true,
    }) && (match range.end_bound() {
        Bound::Included(ref end) => item <= *end,
        Bound::Excluded(ref end) => item < *end,
        Bound::Unbounded => true,
    })
}
