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