use super::compose::{comma_many, group};
use super::{GENERATED_TOKEN_LIMIT, GeneratedDelimiter, GeneratedRowRefusal, GeneratedToken};
use crate::bounded::{KeyedRoster, KeyedRosterAssignment, NonEmpty, NonEmptyError, Overflow};
pub fn keyed_roster_slice<T, K, const N: usize>(
roster: &KeyedRoster<T, K, N>,
mut row: impl FnMut(usize, &K, &T) -> Result<Vec<GeneratedToken>, Overflow>,
) -> Result<Vec<GeneratedToken>, Overflow> {
let rows = roster
.indexed()
.map(|(index, key, member)| row(index, key, member))
.collect::<Result<Vec<_>, _>>()?;
borrowed_slice(rows)
}
pub fn keyed_roster_items<T, K, const N: usize>(
roster: &KeyedRoster<T, K, N>,
mut row: impl FnMut(usize, &K, &T) -> Result<Vec<GeneratedToken>, Overflow>,
) -> Result<Vec<GeneratedToken>, GeneratedRowRefusal> {
let mut items = Vec::new();
for (index, key, member) in roster.indexed() {
let row = row(index, key, member)
.map_err(|cause| GeneratedRowRefusal::at(index, NonEmptyError::Overflow(cause)))?;
let row = NonEmpty::<GeneratedToken, GENERATED_TOKEN_LIMIT>::new(row)
.map_err(|cause| GeneratedRowRefusal::at(index, cause))?;
items.extend(row.iter().cloned());
}
Ok(items)
}
pub fn keyed_assignment_slice<D, K, P, S, const N: usize>(
assignment: &KeyedRosterAssignment<D, K, P, S, N>,
mut row: impl FnMut(usize, &K, &D, &S, &P) -> Result<Vec<GeneratedToken>, Overflow>,
) -> Result<Vec<GeneratedToken>, Overflow> {
let rows = assignment
.indexed()
.map(|(index, key, member, seat, payload)| row(index, key, member, seat, payload))
.collect::<Result<Vec<_>, _>>()?;
borrowed_slice(rows)
}
pub fn keyed_assignment_items<D, K, P, S, const N: usize>(
assignment: &KeyedRosterAssignment<D, K, P, S, N>,
mut row: impl FnMut(usize, &K, &D, &S, &P) -> Result<Vec<GeneratedToken>, Overflow>,
) -> Result<Vec<GeneratedToken>, GeneratedRowRefusal> {
let mut items = Vec::new();
for (index, key, member, seat, payload) in assignment.indexed() {
let row = row(index, key, member, seat, payload)
.map_err(|cause| GeneratedRowRefusal::at(index, NonEmptyError::Overflow(cause)))?;
let row = NonEmpty::<GeneratedToken, GENERATED_TOKEN_LIMIT>::new(row)
.map_err(|cause| GeneratedRowRefusal::at(index, cause))?;
items.extend(row.iter().cloned());
}
Ok(items)
}
fn borrowed_slice(rows: Vec<Vec<GeneratedToken>>) -> Result<Vec<GeneratedToken>, Overflow> {
Ok(vec![
GeneratedToken::alone('&'),
group(GeneratedDelimiter::Bracket, comma_many(rows))?,
])
}