use crate::curves::DiscountCurve;
use crate::curves::MultiCurve;
use crate::traits::FloatExt;
pub mod coupon;
pub mod engine;
pub mod leg;
pub mod types;
pub use coupon::Cashflow;
pub use coupon::CmsCoupon;
pub use coupon::FixedRateCoupon;
pub use coupon::FloatingRateCoupon;
pub use coupon::SimpleCashflow;
pub use engine::CashflowPricer;
pub use engine::CashflowSummary;
pub use leg::Leg;
pub use leg::LegBuilder;
pub use types::AccrualPeriod;
pub use types::CmsIndex;
pub use types::FloatingIndex;
pub use types::IborIndex;
pub use types::NotionalSchedule;
pub use types::OvernightIndex;
pub use types::RateTenor;
pub trait CurveProvider<T: FloatExt>: Send + Sync {
fn discount_curve(&self) -> &DiscountCurve<T>;
fn forecast_curve(&self, key: &str) -> Option<&DiscountCurve<T>>;
}
impl<T: FloatExt> CurveProvider<T> for DiscountCurve<T> {
fn discount_curve(&self) -> &DiscountCurve<T> {
self
}
fn forecast_curve(&self, _key: &str) -> Option<&DiscountCurve<T>> {
Some(self)
}
}
impl<T: FloatExt> CurveProvider<T> for MultiCurve<T> {
fn discount_curve(&self) -> &DiscountCurve<T> {
&self.discount
}
fn forecast_curve(&self, key: &str) -> Option<&DiscountCurve<T>> {
self.forecast(key).or(Some(&self.discount))
}
}
pub trait RateIndex<T: FloatExt>: Clone + Send + Sync {
fn curve_key(&self) -> &str;
fn forward_rate(
&self,
curves: &(impl CurveProvider<T> + ?Sized),
valuation_date: chrono::NaiveDate,
period: &AccrualPeriod<T>,
) -> T;
}