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 event date = evDate event < date

        evOccuredInclude:: a->Date->Bool
        evOccuredInclude event date = evDate event <= date

        evCompare :: a->a->Ordering
        evCompare x y
                | evDate x == evDate y = EQ
                | evDate x <= evDate y = LT
                | otherwise            = GT

        evEqual :: a->a->Bool
        evEqual x y = evDate x == evDate y

-- | Cash flows data type
data CashFlow = CashFlow {
        cfDate   :: Date,
        cfAmount :: Double
        } deriving (Show)

instance Event CashFlow where
        evDate (CashFlow date _) = date

instance Eq CashFlow where
       (==) = evEqual

instance Ord CashFlow where
        compare = evCompare

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

data Callability = Call {
        cPrice :: CallPrice,
        cDate  :: Date
        } | Put {
        cPrice :: CallPrice,
        cDate  :: Date
        } deriving (Show)

instance Event Callability where
        evDate = cDate

instance Eq Callability where
        (==) = evEqual

instance Ord Callability where
        compare = evCompare