use crate::{
env::Cx,
expr::Expr,
id::{ClassId, ShapeId},
value::Value,
};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Demand {
Never,
Expr,
Value,
Bool,
Class(ClassId),
Shape(ShapeId),
}
#[derive(Clone)]
pub struct PreparedArgs {
values: Vec<Value>,
}
impl PreparedArgs {
pub fn new(values: Vec<Value>) -> Self {
Self { values }
}
pub fn values(&self) -> &[Value] {
&self.values
}
pub fn get(&self, index: usize) -> Option<&Value> {
self.values.get(index)
}
pub fn len(&self) -> usize {
self.values.len()
}
pub fn is_empty(&self) -> bool {
self.values.is_empty()
}
pub fn as_expr_tuple(&self, cx: &mut Cx) -> crate::error::Result<Expr> {
Ok(Expr::List(
self.values
.iter()
.map(|value| value.object().as_expr(cx))
.collect::<crate::error::Result<Vec<_>>>()?,
))
}
}