use reify_reflect_core::{Reflect, RuntimeValue};
pub trait FrunkReflect {
fn reflect_runtime(&self) -> Vec<RuntimeValue>;
}
impl FrunkReflect for frunk::HNil {
fn reflect_runtime(&self) -> Vec<RuntimeValue> {
Vec::new()
}
}
impl<H, T> FrunkReflect for frunk::HCons<H, T>
where
H: Reflect<Value = RuntimeValue>,
T: FrunkReflect,
{
fn reflect_runtime(&self) -> Vec<RuntimeValue> {
let mut out = Vec::with_capacity(1 + self.tail.reflect_runtime().len());
out.push(H::reflect());
out.extend(self.tail.reflect_runtime());
out
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{S, Z};
use frunk::hlist;
use std::marker::PhantomData;
#[test]
fn empty_frunk_list() {
let list = frunk::HNil;
assert_eq!(list.reflect_runtime(), Vec::<RuntimeValue>::new());
}
#[test]
fn frunk_list_of_our_nats() {
let list = hlist![Z, S::<Z>(PhantomData), S::<S<Z>>(PhantomData)];
assert_eq!(
list.reflect_runtime(),
vec![
RuntimeValue::Nat(0),
RuntimeValue::Nat(1),
RuntimeValue::Nat(2),
]
);
}
}