use crate::typing::Ty;
use crate::values::type_repr::StarlarkTypeRepr;
use crate::values::types::tuple::value::Tuple;
use crate::values::AllocFrozenValue;
use crate::values::AllocValue;
use crate::values::FrozenHeap;
use crate::values::FrozenValue;
use crate::values::Heap;
use crate::values::UnpackValue;
use crate::values::Value;
impl<'v, T1: AllocValue<'v>> AllocValue<'v> for (T1,) {
fn alloc_value(self, heap: &'v Heap) -> Value<'v> {
heap.alloc_tuple(&[self.0.alloc_value(heap)])
}
}
impl<'v, T1: AllocValue<'v>, T2: AllocValue<'v>> AllocValue<'v> for (T1, T2) {
fn alloc_value(self, heap: &'v Heap) -> Value<'v> {
heap.alloc_tuple(&[self.0.alloc_value(heap), self.1.alloc_value(heap)])
}
}
impl<'v, T1: AllocValue<'v>, T2: AllocValue<'v>, T3: AllocValue<'v>> AllocValue<'v>
for (T1, T2, T3)
{
fn alloc_value(self, heap: &'v Heap) -> Value<'v> {
heap.alloc_tuple(&[
self.0.alloc_value(heap),
self.1.alloc_value(heap),
self.2.alloc_value(heap),
])
}
}
impl<T1: AllocFrozenValue> AllocFrozenValue for (T1,) {
fn alloc_frozen_value(self, heap: &FrozenHeap) -> FrozenValue {
heap.alloc_tuple(&[self.0.alloc_frozen_value(heap)])
}
}
impl<T1: AllocFrozenValue, T2: AllocFrozenValue> AllocFrozenValue for (T1, T2) {
fn alloc_frozen_value(self, heap: &FrozenHeap) -> FrozenValue {
heap.alloc_tuple(&[
self.0.alloc_frozen_value(heap),
self.1.alloc_frozen_value(heap),
])
}
}
impl<T1: AllocFrozenValue, T2: AllocFrozenValue, T3: AllocFrozenValue> AllocFrozenValue
for (T1, T2, T3)
{
fn alloc_frozen_value(self, heap: &FrozenHeap) -> FrozenValue {
heap.alloc_tuple(&[
self.0.alloc_frozen_value(heap),
self.1.alloc_frozen_value(heap),
self.2.alloc_frozen_value(heap),
])
}
}
impl<T1: StarlarkTypeRepr, T2: StarlarkTypeRepr> StarlarkTypeRepr for (T1, T2) {
fn starlark_type_repr() -> Ty {
Ty::tuple2(T1::starlark_type_repr(), T2::starlark_type_repr())
}
}
impl<T1: StarlarkTypeRepr> StarlarkTypeRepr for (T1,) {
fn starlark_type_repr() -> Ty {
Ty::tuple(vec![T1::starlark_type_repr()])
}
}
impl<T1: StarlarkTypeRepr, T2: StarlarkTypeRepr, T3: StarlarkTypeRepr> StarlarkTypeRepr
for (T1, T2, T3)
{
fn starlark_type_repr() -> Ty {
Ty::tuple(vec![
T1::starlark_type_repr(),
T2::starlark_type_repr(),
T3::starlark_type_repr(),
])
}
}
impl<'v, T1: UnpackValue<'v>, T2: UnpackValue<'v>> UnpackValue<'v> for (T1, T2) {
fn expected() -> String {
format!("tuple ({}, {})", T1::expected(), T2::expected())
}
fn unpack_value(value: Value<'v>) -> Option<Self> {
let t = Tuple::from_value(value)?;
if t.len() != 2 {
return None;
}
Some((
T1::unpack_value(t.content()[0])?,
T2::unpack_value(t.content()[1])?,
))
}
}