Skip to main content

conspire/domain/density/
mod.rs

1#[cfg(test)]
2mod test;
3
4use crate::{math::Quantity, mechanics::ReferenceCoordinate, units::Density};
5
6#[derive(Clone, Copy, Debug)]
7pub struct NoDensity;
8
9pub trait DensityField {
10    type Resolved<S>;
11    fn density(&self, coordinate: &ReferenceCoordinate) -> Quantity<Density>;
12    fn resolve<S>(&self, build: impl FnOnce(&Self) -> S) -> Self::Resolved<S>;
13}
14
15impl DensityField for Quantity<Density> {
16    type Resolved<S> = Quantity<Density>;
17    fn density(&self, _coordinate: &ReferenceCoordinate) -> Quantity<Density> {
18        *self
19    }
20    fn resolve<S>(&self, _build: impl FnOnce(&Self) -> S) -> Quantity<Density> {
21        *self
22    }
23}
24
25impl<F> DensityField for F
26where
27    F: Fn(&ReferenceCoordinate) -> Quantity<Density>,
28{
29    type Resolved<S> = S;
30    fn density(&self, coordinate: &ReferenceCoordinate) -> Quantity<Density> {
31        self(coordinate)
32    }
33    fn resolve<S>(&self, build: impl FnOnce(&Self) -> S) -> S {
34        build(self)
35    }
36}