use deep_causality_algebra::RealField;
use deep_causality_algebra::iso::witness::Iso;
use deep_causality_num::FromPrimitive;
use deep_causality_par::MaybeParallel;
use deep_causality_tensor::CausalTensor;
use crate::types::lattice_complex::LatticeComplex;
use crate::types::manifold::Manifold;
pub struct DeRhamSharpIso<const D: usize, R: RealField>(core::marker::PhantomData<R>);
pub type FieldCarrier<const D: usize, R> = (Manifold<LatticeComplex<D, R>, R>, CausalTensor<R>);
impl<const D: usize, R> Iso<FieldCarrier<D, R>, FieldCarrier<D, R>> for DeRhamSharpIso<D, R>
where
R: RealField + MaybeParallel + FromPrimitive + Default + PartialEq + core::fmt::Debug,
{
fn to_target(s: FieldCarrier<D, R>) -> FieldCarrier<D, R> {
let (manifold, vertex_vectors) = s;
let cochain = manifold
.de_rham(&vertex_vectors)
.expect("DeRhamSharpIso::to_target: carrier invariants violated");
(manifold, cochain)
}
fn to_source(t: FieldCarrier<D, R>) -> FieldCarrier<D, R> {
let (manifold, edge_cochain) = t;
let vectors = manifold
.sharp(&edge_cochain)
.expect("DeRhamSharpIso::to_source: carrier invariants violated");
(manifold, vectors)
}
}