use crate::eval::ParametersSpec;
use crate::eval::ParametersSpecParam;
use crate::typing::ParamSpec;
use crate::typing::Ty;
use crate::util::ArcStr;
pub fn param_specs<'a, V: Copy>(
function_name: &str,
pos_only: impl IntoIterator<Item = (&'a str, ParametersSpecParam<V>, Ty)>,
pos_or_named: impl IntoIterator<Item = (&'a str, ParametersSpecParam<V>, Ty)>,
args: Option<Ty>,
named_only: impl IntoIterator<Item = (&'a str, ParametersSpecParam<V>, Ty)>,
kwargs: Option<Ty>,
) -> crate::Result<(ParametersSpec<V>, ParamSpec)> {
let pos_only = Vec::from_iter(pos_only);
let pos_or_named = Vec::from_iter(pos_or_named);
let named_only = Vec::from_iter(named_only);
let parameters_spec = ParametersSpec::new_parts(
function_name,
pos_only.iter().map(|(name, param, _ty)| (*name, *param)),
pos_or_named
.iter()
.map(|(name, param, _ty)| (*name, *param)),
args.is_some(),
named_only.iter().map(|(name, param, _ty)| (*name, *param)),
kwargs.is_some(),
);
let param_spec = ParamSpec::new_parts(
pos_only
.into_iter()
.map(|(_name, param, ty)| (param.is_required(), ty)),
pos_or_named
.into_iter()
.map(|(name, param, ty)| (ArcStr::from(name), param.is_required(), ty)),
args,
named_only
.into_iter()
.map(|(name, param, ty)| (ArcStr::from(name), param.is_required(), ty)),
kwargs,
)?;
Ok((parameters_spec, param_spec))
}