luaur_analysis/functions/
first.rs1use crate::functions::begin_type_pack::begin_type_pack_id;
2use crate::functions::end_type_pack::end_type_pack_id;
3use crate::functions::get_type_pack::get_type_pack_id;
4use crate::records::type_pack_iterator::TypePackIterator;
5use crate::records::variadic_type_pack::VariadicTypePack;
6use crate::type_aliases::type_id::TypeId;
7use crate::type_aliases::type_pack_id::TypePackId;
8
9pub fn first(tp: TypePackId, ignore_hidden_variadics: bool) -> Option<TypeId> {
10 let mut iter = begin_type_pack_id(tp);
11 let end_iter = end_type_pack_id(tp);
12
13 if iter.operator_ne(&end_iter) {
14 return Some(*iter.operator_deref());
15 }
16
17 if let Some(tail) = iter.tail() {
18 let vtp = unsafe { get_type_pack_id::<VariadicTypePack>(tail) };
19 if !vtp.is_null() {
20 let vtp_ref = unsafe { &*vtp };
21 if !vtp_ref.hidden || !ignore_hidden_variadics {
22 return Some(vtp_ref.ty);
23 }
24 }
25 }
26
27 None
28}