use crate::{Solution, Token};
use crate::algo::collection::Collection;
use crate::algo::Branch;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Default, Clone)]
pub struct Item<T> {
pub color: T,
pub len: usize,
}
impl<T> Item<T> {
pub fn new(color: T, len: usize) -> Self {
Self { color, len }
}
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Default, Clone)]
pub struct Layout<T> {
pub cols: Vec<Vec<Item<T>>>,
pub rows: Vec<Vec<Item<T>>>,
}
impl<T: Copy + PartialEq + Send + Sync> Layout<T> {
pub fn new(cols: Vec<Vec<Item<T>>>, rows: Vec<Vec<Item<T>>>) -> Self {
Self { cols, rows }
}
pub fn solve(self, limit: usize, token: impl Token) -> Solution<T> {
let mut collection = Collection::new(limit, token);
Branch::build(self.cols, self.rows).solve(&mut collection);
collection.into()
}
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn layout_solve() {
let cols = vec![vec![Item::new('a', 1)]];
let rows = vec![vec![Item::new('a', 1)]];
let layout = Layout::new(cols, rows);
assert_eq!(1, layout.solve(usize::MAX, ()).collection.len());
}
}