Skip to content

Commit

Permalink
Make constructor functions and extract common types
Browse files Browse the repository at this point in the history
  • Loading branch information
jhbertra committed Nov 23, 2021
1 parent 39ed4e8 commit 5015357
Show file tree
Hide file tree
Showing 8 changed files with 665 additions and 256 deletions.
11 changes: 0 additions & 11 deletions purescript-actus/src/Data/Actus/Contract.purs

This file was deleted.

140 changes: 98 additions & 42 deletions purescript-actus/src/Data/Actus/Contract/Annuity.purs
@@ -1,28 +1,56 @@
module Data.Actus.Contract.Annuity where

import Data.Actus.Contract (Contract)
import Data.Actus.Types as Types
import Data.DateTime (DateTime)
import Data.Map.Heterogeneous (HMap)
import Data.Maybe (Maybe)

newtype Annuity = Annuity
( Contract
( calendar :: Calendar
newtype Contract = Contract
( Types.Contract
( calendar :: Types.Calendar
, contractPerformance :: Types.ContractPerformance
, fees :: Maybe Fees
, fees :: Maybe Types.Fees
, interest :: Interest
, notionalPrincipal :: NotionalPrincipal
, optionality :: Maybe Optionality
, rateReset :: Maybe RateReset
, optionality :: Maybe Types.LoanOptionality
, rateReset :: Maybe Types.LoanRateReset
)
)

type Calendar = HMap
( capitalizationEndDate :: Types.Calendar
, businessDayConvention :: Types.BusinessDayConvention
, endOfMonthConvention :: Types.EndOfMonthConvention
)
mkContract
:: DateTime
-> Types.ContractRole
-> String
-> Types.Calendar
-> Types.ContractPerformance
-> Maybe Types.Fees
-> Interest
-> NotionalPrincipal
-> Maybe Types.LoanOptionality
-> Maybe Types.LoanRateReset
-> Contract
mkContract
statusDate
contractRole
contractId
calendar
contractPerformance
fees
interest
notionalPrincipal
optionality
rateReset =
Contract
{ statusDate
, contractRole
, contractId
, calendar
, contractPerformance
, fees
, interest
, notionalPrincipal
, optionality
, rateReset
}

type Fees =
{ rate :: Number
Expand All @@ -40,6 +68,29 @@ type Interest =
, calculationBase :: Types.InterestCalculationBase
}

mkInterest
:: Number
-> DateTime
-> Number
-> Types.DayCountConvention
-> Maybe Types.AnchoredCycle
-> Types.InterestCalculationBase
-> Interest
mkInterest
accrued
capitalizationEndDate
nominalRate
dayCountConvention
paymentCycle
calculationBase =
{ accrued
, capitalizationEndDate
, nominalRate
, dayCountConvention
, paymentCycle
, calculationBase
}

type NotionalPrincipal =
{ ammortizationDate :: DateTime
, initialExchangeDate :: DateTime
Expand All @@ -50,35 +101,40 @@ type NotionalPrincipal =
, termination :: Maybe Types.ContractEndEvent
, redemptionCycle :: Maybe Types.AnchoredCycle
, nextPayment :: Maybe Number
, scaling ::
Maybe
{ cycle :: Types.AnchoredCycle
, effect :: Types.ScalingEffect
, marketObjectCodeOfIndex :: String
}
, scalingIndex :: Maybe Types.ScalingIndex
}

data Optionality =
Optionality
Types.PrepaymentEffect
( HMap
( cycle :: Maybe Types.AnchoredCycle
, penaltyType :: Types.PenaltyType
, penaltyRate :: Number
)
)

type RateReset =
{ cycle :: Types.AnchoredCycle
, rateSpread :: Number
, marketObjectCode :: String
, constraints ::
HMap
( lifeCap :: Number
, lifeFloor :: Number
, periodCap :: Number
, periodFloor :: Number
)
, nextResetRate :: Maybe Number
, rateMultiplier :: Maybe Number
mkNotionalPrincipal
:: DateTime
-> DateTime
-> Maybe Number
-> Maybe DateTime
-> Number
-> Maybe Types.ContractEndEvent
-> Maybe Types.ContractEndEvent
-> Maybe Types.AnchoredCycle
-> Maybe Number
-> Maybe Types.ScalingIndex
-> NotionalPrincipal
mkNotionalPrincipal
ammortizationDate
initialExchangeDate
premiumDiscountAtIED
maturityDate
notionalPrincipal
purchase
termination
redemptionCycle
nextPayment
scalingIndex =
{ ammortizationDate
, initialExchangeDate
, premiumDiscountAtIED
, maturityDate
, notionalPrincipal
, purchase
, termination
, redemptionCycle
, nextPayment
, scalingIndex
}
64 changes: 45 additions & 19 deletions purescript-actus/src/Data/Actus/Contract/Future.purs
@@ -1,38 +1,64 @@
module Data.Actus.Contract.Future where

import Data.Actus.Contract (Contract)
import Data.Actus.Types as Types
import Data.DateTime (DateTime)
import Data.Interval.Duration.Iso (IsoDuration)
import Data.Map.Heterogeneous (HMap)
import Data.Maybe (Maybe)

newtype Future = Future
( Contract
( calendar :: Calendar
newtype Contract = Contract
( Types.Contract
( calendar :: Types.Calendar
, contractPerformance :: Types.ContractPerformance
, contractStructure :: Types.ContractStructure
, notionalPrincipal :: NotionalPrincipal
, settlement :: Maybe Settlement
, futuresPrice :: Number
, notionalPrincipal :: NotionalPrincipal
, settlement :: Maybe Types.Settlement
)
)

type Calendar = HMap
( capitalizationEndDate :: Types.Calendar
, businessDayConvention :: Types.BusinessDayConvention
, endOfMonthConvention :: Types.EndOfMonthConvention
)
mkContract
:: DateTime
-> Types.ContractRole
-> String
-> Types.Calendar
-> Types.ContractPerformance
-> Types.ContractStructure
-> NotionalPrincipal
-> Maybe Types.Settlement
-> Number
-> Contract
mkContract
statusDate
contractRole
contractId
calendar
contractPerformance
contractStructure
notionalPrincipal
settlement
futuresPrice =
Contract
{ statusDate
, contractRole
, contractId
, calendar
, contractPerformance
, contractStructure
, futuresPrice
, notionalPrincipal
, settlement
}

type NotionalPrincipal =
{ maturityDate :: DateTime
, purchase :: Maybe Types.ContractEndEvent
, termination :: Maybe Types.ContractEndEvent
}

type Settlement =
{ exerciseAmount :: Number
, exerciseDate :: DateTime
, period :: Maybe IsoDuration
, deliverySettlement :: Maybe Types.DeliverySettlement
}
mkNotionalPrincipal
:: DateTime
-> Maybe Types.ContractEndEvent
-> Maybe Types.ContractEndEvent
-> NotionalPrincipal
mkNotionalPrincipal maturityDate purchase termination =
{ maturityDate, purchase, termination }

0 comments on commit 5015357

Please sign in to comment.