module QuantLib.Event
        (module QuantLib.Event
        ) where

import           QuantLib.Prices
import           QuantLib.Time.Date

class Event a where
        evDate          :: a->Date
        evOccured       :: a->Date->Bool
        evOccured a
event Date
date = a -> Date
forall a. Event a => a -> Date
evDate a
event Date -> Date -> Bool
forall a. Ord a => a -> a -> Bool
< Date
date

        evOccuredInclude:: a->Date->Bool
        evOccuredInclude a
event Date
date = a -> Date
forall a. Event a => a -> Date
evDate a
event Date -> Date -> Bool
forall a. Ord a => a -> a -> Bool
<= Date
date

        evCompare :: a->a->Ordering
        evCompare a
x a
y
                | a -> Date
forall a. Event a => a -> Date
evDate a
x Date -> Date -> Bool
forall a. Eq a => a -> a -> Bool
== a -> Date
forall a. Event a => a -> Date
evDate a
y = Ordering
EQ
                | a -> Date
forall a. Event a => a -> Date
evDate a
x Date -> Date -> Bool
forall a. Ord a => a -> a -> Bool
<= a -> Date
forall a. Event a => a -> Date
evDate a
y = Ordering
LT
                | Bool
otherwise            = Ordering
GT

        evEqual :: a->a->Bool
        evEqual a
x a
y = a -> Date
forall a. Event a => a -> Date
evDate a
x Date -> Date -> Bool
forall a. Eq a => a -> a -> Bool
== a -> Date
forall a. Event a => a -> Date
evDate a
y

-- | Cash flows data type
data CashFlow = CashFlow {
        CashFlow -> Date
cfDate   :: Date,
        CashFlow -> Double
cfAmount :: Double
        } deriving (Int -> CashFlow -> ShowS
[CashFlow] -> ShowS
CashFlow -> String
(Int -> CashFlow -> ShowS)
-> (CashFlow -> String) -> ([CashFlow] -> ShowS) -> Show CashFlow
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CashFlow] -> ShowS
$cshowList :: [CashFlow] -> ShowS
show :: CashFlow -> String
$cshow :: CashFlow -> String
showsPrec :: Int -> CashFlow -> ShowS
$cshowsPrec :: Int -> CashFlow -> ShowS
Show)

instance Event CashFlow where
        evDate :: CashFlow -> Date
evDate (CashFlow Date
date Double
_) = Date
date

instance Eq CashFlow where
       == :: CashFlow -> CashFlow -> Bool
(==) = CashFlow -> CashFlow -> Bool
forall a. Event a => a -> a -> Bool
evEqual

instance Ord CashFlow where
        compare :: CashFlow -> CashFlow -> Ordering
compare = CashFlow -> CashFlow -> Ordering
forall a. Event a => a -> a -> Ordering
evCompare

-- | Sequence of cash-flows
type Leg        = [CashFlow]

data Callability = Call {
        Callability -> CallPrice
cPrice :: CallPrice,
        Callability -> Date
cDate  :: Date
        } | Put {
        cPrice :: CallPrice,
        cDate  :: Date
        } deriving (Int -> Callability -> ShowS
[Callability] -> ShowS
Callability -> String
(Int -> Callability -> ShowS)
-> (Callability -> String)
-> ([Callability] -> ShowS)
-> Show Callability
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Callability] -> ShowS
$cshowList :: [Callability] -> ShowS
show :: Callability -> String
$cshow :: Callability -> String
showsPrec :: Int -> Callability -> ShowS
$cshowsPrec :: Int -> Callability -> ShowS
Show)

instance Event Callability where
        evDate :: Callability -> Date
evDate = Callability -> Date
cDate

instance Eq Callability where
        == :: Callability -> Callability -> Bool
(==) = Callability -> Callability -> Bool
forall a. Event a => a -> a -> Bool
evEqual

instance Ord Callability where
        compare :: Callability -> Callability -> Ordering
compare = Callability -> Callability -> Ordering
forall a. Event a => a -> a -> Ordering
evCompare