{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE AllowAmbiguousTypes#-}
{-# LANGUAGE FunctionalDependencies #-}
module Q.Options.ImpliedVol.TimeSlice
  (
      module Q.Types
    , module Q.Options.ImpliedVol
    , TimeSlice(..)
  )
where

import Q.Types
import Q.Options.ImpliedVol
import Q.Options.Black76

class TimeSlice v k where
  totalVar :: v -> k -> TotalVar

instance TimeSlice (k -> TotalVar) k where
  totalVar :: (k -> TotalVar) -> k -> TotalVar
totalVar k -> TotalVar
f = k -> TotalVar
f

instance TimeSlice Black76 k where
  totalVar :: Black76 -> k -> TotalVar
totalVar Black76{Vol
DF
YearFrac
Forward
b76Vol :: Black76 -> Vol
b76T :: Black76 -> YearFrac
b76DF :: Black76 -> DF
b76F :: Black76 -> Forward
b76Vol :: Vol
b76T :: YearFrac
b76DF :: DF
b76F :: Forward
..} k
_ = Double -> TotalVar
TotalVar (Double -> TotalVar) -> Double -> TotalVar
forall a b. (a -> b) -> a -> b
$ Double
vol Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
vol Double -> Double -> Double
forall a. Num a => a -> a -> a
* Double
t
    where (Vol Double
vol) = Vol
b76Vol
          (YearFrac Double
t) = YearFrac
b76T