use crate::{
ad::scalar::Scalar,
rates::compounding::Compounding,
time::{date::Date, daycounter::DayCounter, enums::Frequency},
utils::errors::Result,
};
pub trait InterestRatesTermStructure<T>
where
T: Scalar,
{
fn reference_date(&self) -> Date;
fn discount_factor(&self, date: Date) -> Result<T>;
fn forward_rate(
&self,
start_date: Date,
end_date: Date,
comp: Compounding,
freq: Frequency,
) -> Result<T>;
fn nodes(&self) -> Option<Vec<(Date, T)>>;
fn day_counter(&self) -> Option<DayCounter>;
fn discount_factor_from_time(&self, t: f64) -> Result<T>;
fn forward_rate_from_time(&self, start: f64, end: f64) -> Result<T>;
}