use crate::edge_table::EdgeTableIterator;
use crate::individual_table::IndividualTableIterator;
use crate::migration_table::MigrationTableIterator;
use crate::mutation_table::MutationTableIterator;
use crate::node_table::NodeTableIterator;
use crate::population_table::PopulationTableIterator;
use crate::site_table::SiteTableIterator;
use crate::table_iterator::make_table_iterator;
use crate::tsk_id_t;
use crate::EdgeTable;
use crate::IndividualTable;
use crate::MigrationTable;
use crate::MutationTable;
use crate::NodeTable;
use crate::PopulationTable;
use crate::SiteTable;
pub trait TskitTypeAccess<T> {
fn as_ptr(&self) -> *const T;
fn as_mut_ptr(&mut self) -> *mut T;
}
pub trait TableAccess {
fn edges(&self) -> EdgeTable;
fn edges_iter(&self, decode_metadata: bool) -> EdgeTableIterator {
make_table_iterator::<EdgeTable>(self.edges(), decode_metadata)
}
fn nodes(&self) -> NodeTable;
fn nodes_iter(&self, decode_metadata: bool) -> NodeTableIterator {
make_table_iterator::<NodeTable>(self.nodes(), decode_metadata)
}
fn mutations(&self) -> MutationTable;
fn mutations_iter(&self, decode_metadata: bool) -> MutationTableIterator {
make_table_iterator::<MutationTable>(self.mutations(), decode_metadata)
}
fn sites(&self) -> SiteTable;
fn sites_iter(&self, decode_metadata: bool) -> SiteTableIterator {
make_table_iterator::<SiteTable>(self.sites(), decode_metadata)
}
fn populations(&self) -> PopulationTable;
fn populations_iter(&self, decode_metadata: bool) -> PopulationTableIterator {
make_table_iterator::<PopulationTable>(self.populations(), decode_metadata)
}
fn migrations(&self) -> MigrationTable;
fn migrations_iter(&self, decode_metadata: bool) -> MigrationTableIterator {
make_table_iterator::<MigrationTable>(self.migrations(), decode_metadata)
}
fn individuals(&self) -> IndividualTable;
fn individuals_iter(&self, decode_metadata: bool) -> IndividualTableIterator {
make_table_iterator::<IndividualTable>(self.individuals(), decode_metadata)
}
}
pub trait NodeListGenerator: TableAccess {
fn samples_as_vector(&self) -> Vec<tsk_id_t> {
self.nodes().samples_as_vector()
}
fn create_node_id_vector(&self, f: impl FnMut(&crate::NodeTableRow) -> bool) -> Vec<tsk_id_t> {
self.nodes().create_node_id_vector(f)
}
}
pub trait NodeIterator {
fn next_node(&mut self);
fn current_node(&mut self) -> Option<tsk_id_t>;
}
impl Iterator for dyn NodeIterator {
type Item = tsk_id_t;
fn next(&mut self) -> Option<tsk_id_t> {
self.next_node();
self.current_node()
}
}