use crate::{
ad::{dual::DualFwd, scalar::Scalar},
time::date::Date,
utils::errors::Result,
};
pub trait Cashflow<T>
where
T: Scalar,
{
fn amount(&self) -> Result<T>;
fn payment_date(&self) -> Date;
}
#[derive(Clone)]
pub struct SimpleCashflow<T = f64>
where
T: Scalar,
{
amount: T,
payment_date: Date,
}
impl<T> SimpleCashflow<T>
where
T: Scalar,
{
pub const fn new(amount: T, payment_date: Date) -> Self {
Self {
amount,
payment_date,
}
}
}
impl<T> Cashflow<T> for SimpleCashflow<T>
where
T: Scalar,
{
fn amount(&self) -> Result<T> {
Ok(self.amount)
}
fn payment_date(&self) -> Date {
self.payment_date
}
}
impl From<SimpleCashflow<f64>> for SimpleCashflow<DualFwd> {
fn from(value: SimpleCashflow<f64>) -> Self {
Self::new(DualFwd::new(value.amount.value()), value.payment_date)
}
}
impl From<SimpleCashflow<DualFwd>> for SimpleCashflow<f64> {
fn from(value: SimpleCashflow<DualFwd>) -> Self {
Self::new(value.amount.value(), value.payment_date)
}
}