use std::{marker, pin};
pub use value::Value;
use crate::base::cell::{Sealed, brand, region, values};
mod value;
pub trait Brand: Sealed {}
#[derive(Clone, Copy)]
#[repr(transparent)]
pub struct Identity<'id>(marker::PhantomData<*mut &'id ()>);
impl<'id> Sealed for Identity<'id> {}
impl<'id> Brand for Identity<'id> {}
#[repr(transparent)]
pub struct Token<B: Brand> {
pub(in crate::base::cell) token: values::Token<B>,
}
impl<B: Brand> Token<B> {
pub const fn bind<T>(&self, value: T) -> brand::Value<B, T> {
brand::Value {
value: values::Value::new(value),
}
}
}
impl Token<Identity<'_>> {
pub fn scope_pinned<T: ?Sized, R>(
root: pin::Pin<&mut T>,
f: impl for<'id> FnOnce(
Token<Identity<'id>>,
(
region::Token<region::Identity<'id>>,
region::Token<region::Identity<'id, 1>>,
),
pin::Pin<&'id mut T>,
) -> R,
) -> R {
f(
Token {
token: values::Token::new(),
},
(values::Token::new().into(), values::Token::new().into()),
root,
)
}
}