pub mod band;
pub mod bilinear;
pub mod closed;
pub mod euclid;
pub mod euclidean;
pub mod id;
pub mod lattice;
pub mod lie;
pub mod matrix;
pub mod module;
pub mod norm;
pub mod polynomial;
pub mod pow;
pub mod real;
pub mod semiring;
pub mod star;
pub mod subset;
pub mod tensor;
pub mod transform;
pub use self::band::Band;
pub use self::bilinear::{BilinearForm, PositiveDefinite, SymmetricBilinearForm};
pub use self::closed::{ClosedAdd, ClosedDiv, ClosedMul, ClosedNeg, ClosedRem, ClosedSub};
pub use self::euclid::{AffineSpace, EuclideanSpace};
pub use self::euclidean::EuclideanDomain;
pub use self::id::Id;
pub use self::lattice::{
BooleanAlgebra, BoundedLattice, ComplementedLattice, DistributiveLattice, JoinSemilattice,
Lattice, MeetSemilattice,
};
pub use self::lie::LieAlgebra;
pub use self::matrix::{InversibleSquareMatrix, Matrix, MatrixMut, SquareMatrix, SquareMatrixMut};
pub use self::module::{FreeModule, LinearMap, Module, VectorSpace};
pub use self::norm::{FiniteDimInnerSpace, FiniteDimVectorSpace, InnerSpace, NormedSpace};
pub use self::polynomial::Polynomial;
pub use self::pow::Power;
pub use self::real::{ComplexField, Real};
pub use self::semiring::{
CommutativeRing, DivisionRing, Field, FieldExtension, FieldExtensionTower, FiniteField,
IntegralDomain, OrderedField, PrincipalIdealDomain, Ring, Semiring, UniqueFactorizationDomain,
};
pub use self::star::StarSemiring;
pub use self::subset::{SubsetOf, SupersetOf};
pub use self::tensor::TensorProduct;
pub use self::transform::{
AffineTransformation, DirectIsometry, Isometry, OrthogonalTransformation,
ProjectiveTransformation, Rotation, Scaling, Similarity, Transformation, Translation,
};
use crate::op::{Additive, Operator};
pub trait Magma<Op: Operator = Additive> {
fn combine(&self, rhs: &Self) -> Self;
}
pub trait Quasigroup<Op: Operator = Additive>: Magma<Op> {}
pub trait Loop<Op: Operator = Additive>: Quasigroup<Op> + Monoid<Op> {}
pub trait Semigroup<Op: Operator = Additive>: Magma<Op> {}
pub trait Monoid<Op: Operator = Additive>: Semigroup<Op> {
fn identity() -> Self;
}
pub trait Group<Op: Operator = Additive>: Loop<Op> {
fn inverse(&self) -> Self;
}
pub trait AbelianGroup<Op: Operator = Additive>: Group<Op> {}