use super::SweetCell;
use holo_hash::AgentPubKey;
use holochain_types::app::InstalledAppId;
use itertools::traits::HomogeneousTuple;
use itertools::Itertools;
#[derive(Clone, Debug)]
pub struct SweetApp {
installed_app_id: InstalledAppId,
cells: Vec<SweetCell>,
}
impl SweetApp {
#[cfg_attr(feature = "instrument", tracing::instrument(skip_all))]
pub(super) fn new(installed_app_id: InstalledAppId, cells: Vec<SweetCell>) -> Self {
assert!(
cells.iter().map(|c| c.agent_pubkey()).dedup().count() == 1,
"Agent key differs across Cells in this app"
);
Self {
installed_app_id,
cells,
}
}
pub fn installed_app_id(&self) -> &InstalledAppId {
&self.installed_app_id
}
pub fn cells(&self) -> &Vec<SweetCell> {
&self.cells
}
pub fn into_cells(self) -> Vec<SweetCell> {
self.cells
}
pub fn agent(&self) -> &AgentPubKey {
self.cells[0].agent_pubkey()
}
pub fn into_tuple<Inner>(self) -> Inner
where
Inner: HomogeneousTuple<Item = SweetCell>,
Inner::Buffer: std::convert::AsRef<[Option<SweetCell>]>,
Inner::Buffer: std::convert::AsMut<[Option<SweetCell>]>,
{
self.into_cells()
.into_iter()
.collect_tuple::<Inner>()
.expect(
"Wrong number of Cells in destructuring pattern, or too many (must be 4 or less)",
)
}
}
#[derive(
Clone,
derive_more::From,
derive_more::Into,
derive_more::AsRef,
derive_more::IntoIterator,
derive_more::Index,
)]
pub struct SweetAppBatch(pub(super) Vec<SweetApp>);
impl SweetAppBatch {
pub fn into_inner(self) -> Vec<SweetApp> {
self.0
}
pub fn into_tuples<Outer, Inner>(self) -> Outer
where
Outer: HomogeneousTuple<Item = Inner>,
Inner: HomogeneousTuple<Item = SweetCell>,
Outer::Buffer: std::convert::AsRef<[Option<Inner>]>,
Outer::Buffer: std::convert::AsMut<[Option<Inner>]>,
Inner::Buffer: std::convert::AsRef<[Option<SweetCell>]>,
Inner::Buffer: std::convert::AsMut<[Option<SweetCell>]>,
{
self.into_inner()
.into_iter()
.map(|a| {
a.into_cells()
.into_iter()
.collect_tuple::<Inner>()
.expect("Wrong number of DNAs in destructuring pattern, or too many (must be 4 or less)")
})
.collect_tuple::<Outer>()
.expect("Wrong number of Agents in destructuring pattern, or too many (must be 4 or less)")
}
pub fn cells_flattened(&self) -> Vec<SweetCell> {
self.0
.iter()
.flat_map(|app| app.cells().iter())
.cloned()
.collect()
}
pub fn iter(&self) -> impl Iterator<Item = &SweetApp> {
self.0.iter()
}
}