use crate::{
ad::{dual::DualFwd, scalar::Scalar},
indices::marketindex::MarketIndex,
instruments::cashflows::payoffops::PayoffOps,
};
#[derive(Clone)]
pub struct OptionEmbeddedCashflow<T: Scalar> {
payoff_ops: PayoffOps,
market_index: MarketIndex,
value: T,
}
impl<T> OptionEmbeddedCashflow<T>
where
T: Scalar,
{
#[must_use]
pub const fn new(payoff_ops: PayoffOps, market_index: MarketIndex, value: T) -> Self {
Self {
payoff_ops,
market_index,
value,
}
}
#[must_use]
pub const fn payoff_ops(&self) -> &PayoffOps {
&self.payoff_ops
}
#[must_use]
pub const fn market_index(&self) -> &MarketIndex {
&self.market_index
}
#[must_use]
pub const fn value(&self) -> T {
self.value
}
}
impl From<OptionEmbeddedCashflow<f64>> for OptionEmbeddedCashflow<DualFwd> {
fn from(value: OptionEmbeddedCashflow<f64>) -> Self {
Self::new(
value.payoff_ops.clone(),
value.market_index.clone(),
DualFwd::new(value.value),
)
}
}
impl From<OptionEmbeddedCashflow<DualFwd>> for OptionEmbeddedCashflow<f64> {
fn from(value: OptionEmbeddedCashflow<DualFwd>) -> Self {
Self::new(
value.payoff_ops.clone(),
value.market_index.clone(),
value.value.value(),
)
}
}