use crate::values::{FrozenHeap, FrozenValue, Heap, UnpackValue, Value, ValueOf};
pub trait AllocValue<'v> {
fn alloc_value(self, heap: &'v Heap) -> Value<'v>;
}
impl<'v> AllocValue<'v> for FrozenValue {
fn alloc_value(self, _heap: &'v Heap) -> Value<'v> {
self.to_value()
}
}
impl<'v> AllocValue<'v> for Value<'v> {
fn alloc_value(self, _heap: &'v Heap) -> Value<'v> {
self
}
}
impl<'v, T> AllocValue<'v> for Option<T>
where
T: AllocValue<'v>,
{
fn alloc_value(self, heap: &'v Heap) -> Value<'v> {
match self {
Some(v) => v.alloc_value(heap),
None => Value::new_none(),
}
}
}
pub trait AllocFrozenValue {
fn alloc_frozen_value(self, heap: &FrozenHeap) -> FrozenValue;
}
impl AllocFrozenValue for FrozenValue {
fn alloc_frozen_value(self, _heap: &FrozenHeap) -> FrozenValue {
self
}
}
impl FrozenHeap {
pub fn alloc<T: AllocFrozenValue>(&self, val: T) -> FrozenValue {
val.alloc_frozen_value(self)
}
}
impl Heap {
pub fn alloc<'v, T: AllocValue<'v>>(&'v self, x: T) -> Value<'v> {
x.alloc_value(self)
}
pub fn alloc_value_of<'v, T>(&'v self, x: T) -> ValueOf<'v, &'v T>
where
T: AllocValue<'v>,
&'v T: UnpackValue<'v>,
{
let value = self.alloc(x);
ValueOf::unpack_value(value)
.expect("just allocate value must be unpackable to the type of value")
}
}