use core::marker::PhantomData;
pub trait Name: Send + Sync + Sealed
{
}
pub trait HasType<T>: Name
{
}
pub struct Named<N: HasType<T>, T>(T, PhantomData<N>);
pub struct Seed<N>(PhantomData<N>);
pub struct Life<'name>(PhantomData<*mut &'name ()>);
struct SomeName<N>(PhantomData<N>);
impl<N: HasType<T>, T> Named<N, T>
{
pub fn value<'a>(&'a self) -> &'a T
{
&self.0
}
pub fn into_value(self) -> T
{
self.0
}
}
impl<N> Seed<N>
{
pub fn new_name(self) -> impl Name
{
unsafe_new_name(|| {})
}
pub fn new_named<T>(
self,
value: T,
) -> Named<impl HasType<T>, T>
{
unsafe_new_named(unsafe_new_name_with_type(|| {}), value)
}
pub fn replicate(self) -> (Seed<impl Name>, Seed<impl Name>)
{
(unsafe_new_seed(|| {}), unsafe_new_seed(|| {}))
}
}
pub trait Sealed
{
}
impl<N> Sealed for SomeName<N> where N: Send + Sync {}
impl<N> Name for SomeName<N> where N: Send + Sync {}
impl<N, T> HasType<T> for SomeName<N> where N: Send + Sync {}
unsafe impl<'name> Send for Life<'name> {}
unsafe impl<'name> Sync for Life<'name> {}
impl<'name> Sealed for Life<'name> {}
impl<'name> Name for Life<'name> {}
pub fn with_seed<R>(cont: impl for<'name> FnOnce(Seed<Life<'name>>) -> R) -> R
{
cont(Seed(PhantomData))
}
fn unsafe_new_name<F>(_: F) -> impl Name
where
F: Send + Sync,
{
SomeName(PhantomData::<F>)
}
fn unsafe_new_name_with_type<F, T>(_: F) -> impl HasType<T>
where
F: Send + Sync,
{
SomeName(PhantomData::<F>)
}
fn unsafe_new_seed<F>(_: F) -> Seed<impl Name>
where
F: Send + Sync,
{
Seed(PhantomData::<SomeName<F>>)
}
fn unsafe_new_named<Name: HasType<T>, T>(
_: Name,
value: T,
) -> Named<Name, T>
{
Named(value, PhantomData)
}
impl<N: Name> Seed<N>
{
pub fn replicate_3(
self
) -> (Seed<impl Name>, Seed<impl Name>, Seed<impl Name>)
{
(
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
)
}
pub fn replicate_4(
self
) -> (
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
)
{
(
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
)
}
pub fn replicate_5(
self
) -> (
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
)
{
(
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
)
}
pub fn replicate_6(
self
) -> (
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
)
{
(
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
)
}
pub fn replicate_7(
self
) -> (
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
)
{
(
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
)
}
pub fn replicate_8(
self
) -> (
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
Seed<impl Name>,
)
{
(
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
unsafe_new_seed(|| {}),
)
}
}