never executed always true always false
    1 -- GENERATED by C->Haskell Compiler, version 0.28.8 Switcheroo, 25 November 2017 (Haskell)
    2 -- Edit the ORIGNAL .chs file instead!
    3 
    4 
    5 module QuantLib.Instrument
    6   (
    7     PositionType(..)
    8   , SettlementType(..)
    9   , SettlementMethod(..)
   10   , CallabilityType(..)
   11   , OptionType(..)
   12   , BarrierType(..)
   13   , DoubleBarrierType(..)
   14   , PartialBarrierRange(..)
   15   , AverageType(..)
   16   , Seniority(..)
   17   , PricingModel(..)
   18 
   19   , Instrument
   20   , asInstrument
   21   , Callability(..)
   22 
   23   , Exercise(..)
   24   , ExerciseType(..)
   25 
   26   , AdditionalResultVal(..)
   27   , npv
   28   , errorEstimate
   29   , isExpired
   30   , valuationDate
   31   , composite
   32   , additionalResults
   33   , setPricingEngine
   34   ) where
   35 import qualified Foreign.C.Types as C2HSImp
   36 import qualified Foreign.ForeignPtr as C2HSImp
   37 import qualified Foreign.Marshal.Utils as C2HSImp
   38 import qualified Foreign.Ptr as C2HSImp
   39 
   40 
   41 import QuantLib.Internal
   42 import QuantLib.Internal.Type hiding(ptr)
   43 import QuantLib.Internal.Common
   44 
   45 
   46 
   47 
   48 
   49 
   50 data SettlementType = Physical
   51                     | Cash
   52   deriving (Enum,Show,Eq,Read)
   53 
   54 
   55 data SettlementMethod = PhysicalOTC
   56                       | PhysicalCleared
   57                       | CollateralizedCashPrice
   58                       | ParYieldCurve
   59   deriving (Enum,Show,Eq,Read)
   60 
   61 
   62 data BarrierType = DownIn
   63                  | UpIn
   64                  | DownOut
   65                  | UpOut
   66   deriving (Enum,Show,Eq,Read)
   67 
   68 
   69 data DoubleBarrierType = KnockIn
   70                        | KnockOut
   71                        | KIKO
   72                        | KOKI
   73   deriving (Enum,Show,Eq,Read)
   74 
   75 
   76 data PartialBarrierRange = Start
   77                          | EndB1
   78                          | EndB2
   79   deriving (Show,Eq,Read)
   80 instance Enum PartialBarrierRange where
   81   succ Start = EndB1
   82   succ EndB1 = EndB2
   83   succ EndB2 = error "PartialBarrierRange.succ: EndB2 has no successor"
   84 
   85   pred EndB1 = Start
   86   pred EndB2 = EndB1
   87   pred Start = error "PartialBarrierRange.pred: Start has no predecessor"
   88 
   89   enumFromTo from to = go from
   90     where
   91       end = fromEnum to
   92       go v = case compare (fromEnum v) end of
   93                  LT -> v : go (succ v)
   94                  EQ -> [v]
   95                  GT -> []
   96 
   97   enumFrom from = enumFromTo from EndB2
   98 
   99   fromEnum Start = 0
  100   fromEnum EndB1 = 2
  101   fromEnum EndB2 = 3
  102 
  103   toEnum 0 = Start
  104   toEnum 2 = EndB1
  105   toEnum 3 = EndB2
  106   toEnum unmatched = error ("PartialBarrierRange.toEnum: Cannot match " ++ show unmatched)
  107 
  108 
  109 data AverageType = Arithmetic
  110                  | Geometric
  111   deriving (Enum,Show,Eq,Read)
  112 
  113 
  114 data Seniority = SecDom
  115                | SeniorSec
  116                | SnrFor
  117                | SeniorUnSec
  118                | SubLT2
  119                | SubLoweTier2
  120                | JrSubT2
  121                | SubUpperTier2
  122                | PrefT1
  123                | SubTier1
  124                | NoSeniority
  125   deriving (Show,Eq,Read)
  126 instance Enum Seniority where
  127   succ SecDom = SnrFor
  128   succ SeniorSec = SnrFor
  129   succ SnrFor = SubLT2
  130   succ SeniorUnSec = SubLT2
  131   succ SubLT2 = JrSubT2
  132   succ SubLoweTier2 = JrSubT2
  133   succ JrSubT2 = PrefT1
  134   succ SubUpperTier2 = PrefT1
  135   succ PrefT1 = NoSeniority
  136   succ SubTier1 = NoSeniority
  137   succ NoSeniority = error "Seniority.succ: NoSeniority has no successor"
  138 
  139   pred SnrFor = SecDom
  140   pred SeniorUnSec = SecDom
  141   pred SubLT2 = SnrFor
  142   pred SubLoweTier2 = SnrFor
  143   pred JrSubT2 = SubLT2
  144   pred SubUpperTier2 = SubLT2
  145   pred PrefT1 = JrSubT2
  146   pred SubTier1 = JrSubT2
  147   pred NoSeniority = PrefT1
  148   pred SecDom = error "Seniority.pred: SecDom has no predecessor"
  149   pred SeniorSec = error "Seniority.pred: SeniorSec has no predecessor"
  150 
  151   enumFromTo from to = go from
  152     where
  153       end = fromEnum to
  154       go v = case compare (fromEnum v) end of
  155                  LT -> v : go (succ v)
  156                  EQ -> [v]
  157                  GT -> []
  158 
  159   enumFrom from = enumFromTo from NoSeniority
  160 
  161   fromEnum SecDom = 0
  162   fromEnum SeniorSec = 0
  163   fromEnum SnrFor = 1
  164   fromEnum SeniorUnSec = 1
  165   fromEnum SubLT2 = 2
  166   fromEnum SubLoweTier2 = 2
  167   fromEnum JrSubT2 = 3
  168   fromEnum SubUpperTier2 = 3
  169   fromEnum PrefT1 = 4
  170   fromEnum SubTier1 = 4
  171   fromEnum NoSeniority = 5
  172 
  173   toEnum 0 = SecDom
  174   toEnum 1 = SnrFor
  175   toEnum 2 = SubLT2
  176   toEnum 3 = JrSubT2
  177   toEnum 4 = PrefT1
  178   toEnum 5 = NoSeniority
  179   toEnum unmatched = error ("Seniority.toEnum: Cannot match " ++ show unmatched)
  180 
  181 
  182 data PricingModel = Midpoint
  183                   | ISDA
  184   deriving (Enum,Show,Eq,Read)
  185 
  186 
  187 data RestructuringType = NoRestructuring
  188                        | XR
  189                        | ModifiedRestructuring
  190                        | MR
  191                        | ModifiedModifiedRestructuring
  192                        | MM
  193                        | FullRestructuring
  194                        | CR
  195                        | AnyRestructuring
  196   deriving (Show,Eq,Read)
  197 instance Enum RestructuringType where
  198   succ NoRestructuring = ModifiedRestructuring
  199   succ XR = ModifiedRestructuring
  200   succ ModifiedRestructuring = ModifiedModifiedRestructuring
  201   succ MR = ModifiedModifiedRestructuring
  202   succ ModifiedModifiedRestructuring = FullRestructuring
  203   succ MM = FullRestructuring
  204   succ FullRestructuring = AnyRestructuring
  205   succ CR = AnyRestructuring
  206   succ AnyRestructuring = error "RestructuringType.succ: AnyRestructuring has no successor"
  207 
  208   pred ModifiedRestructuring = NoRestructuring
  209   pred MR = NoRestructuring
  210   pred ModifiedModifiedRestructuring = ModifiedRestructuring
  211   pred MM = ModifiedRestructuring
  212   pred FullRestructuring = ModifiedModifiedRestructuring
  213   pred CR = ModifiedModifiedRestructuring
  214   pred AnyRestructuring = FullRestructuring
  215   pred NoRestructuring = error "RestructuringType.pred: NoRestructuring has no predecessor"
  216   pred XR = error "RestructuringType.pred: XR has no predecessor"
  217 
  218   enumFromTo from to = go from
  219     where
  220       end = fromEnum to
  221       go v = case compare (fromEnum v) end of
  222                  LT -> v : go (succ v)
  223                  EQ -> [v]
  224                  GT -> []
  225 
  226   enumFrom from = enumFromTo from AnyRestructuring
  227 
  228   fromEnum NoRestructuring = 0
  229   fromEnum XR = 0
  230   fromEnum ModifiedRestructuring = 1
  231   fromEnum MR = 1
  232   fromEnum ModifiedModifiedRestructuring = 2
  233   fromEnum MM = 2
  234   fromEnum FullRestructuring = 3
  235   fromEnum CR = 3
  236   fromEnum AnyRestructuring = 4
  237 
  238   toEnum 0 = NoRestructuring
  239   toEnum 1 = ModifiedRestructuring
  240   toEnum 2 = ModifiedModifiedRestructuring
  241   toEnum 3 = FullRestructuring
  242   toEnum 4 = AnyRestructuring
  243   toEnum unmatched = error ("RestructuringType.toEnum: Cannot match " ++ show unmatched)
  244 
  245 
  246 data AtomicDefaultType = Restructuring
  247                        | Bankruptcy
  248                        | FailureToPay
  249                        | RepudiationMoratorium
  250                        | Acceleration
  251                        | ObligationAcceleration
  252                        | Default
  253                        | ObligationDefault
  254                        | CrossDefault
  255                        | Downgrade
  256                        | MergerEvent
  257   deriving (Show,Eq,Read)
  258 instance Enum AtomicDefaultType where
  259   succ Restructuring = Bankruptcy
  260   succ Bankruptcy = FailureToPay
  261   succ FailureToPay = RepudiationMoratorium
  262   succ RepudiationMoratorium = Acceleration
  263   succ Acceleration = Default
  264   succ ObligationAcceleration = Default
  265   succ Default = Downgrade
  266   succ ObligationDefault = Downgrade
  267   succ CrossDefault = Downgrade
  268   succ Downgrade = MergerEvent
  269   succ MergerEvent = error "AtomicDefaultType.succ: MergerEvent has no successor"
  270 
  271   pred Bankruptcy = Restructuring
  272   pred FailureToPay = Bankruptcy
  273   pred RepudiationMoratorium = FailureToPay
  274   pred Acceleration = RepudiationMoratorium
  275   pred ObligationAcceleration = RepudiationMoratorium
  276   pred Default = Acceleration
  277   pred ObligationDefault = Acceleration
  278   pred CrossDefault = Acceleration
  279   pred Downgrade = Default
  280   pred MergerEvent = Downgrade
  281   pred Restructuring = error "AtomicDefaultType.pred: Restructuring has no predecessor"
  282 
  283   enumFromTo from to = go from
  284     where
  285       end = fromEnum to
  286       go v = case compare (fromEnum v) end of
  287                  LT -> v : go (succ v)
  288                  EQ -> [v]
  289                  GT -> []
  290 
  291   enumFrom from = enumFromTo from MergerEvent
  292 
  293   fromEnum Restructuring = 0
  294   fromEnum Bankruptcy = 1
  295   fromEnum FailureToPay = 2
  296   fromEnum RepudiationMoratorium = 3
  297   fromEnum Acceleration = 4
  298   fromEnum ObligationAcceleration = 4
  299   fromEnum Default = 5
  300   fromEnum ObligationDefault = 5
  301   fromEnum CrossDefault = 5
  302   fromEnum Downgrade = 6
  303   fromEnum MergerEvent = 7
  304 
  305   toEnum 0 = Restructuring
  306   toEnum 1 = Bankruptcy
  307   toEnum 2 = FailureToPay
  308   toEnum 3 = RepudiationMoratorium
  309   toEnum 4 = Acceleration
  310   toEnum 5 = Default
  311   toEnum 6 = Downgrade
  312   toEnum 7 = MergerEvent
  313   toEnum unmatched = error ("AtomicDefaultType.toEnum: Cannot match " ++ show unmatched)
  314 
  315 
  316 
  317 
  318 
  319 
  320 
  321 
  322 -- |Returns the net present value of the given Instrument
  323 npv :: (GenInstrument i) -> IO ((Double))
  324 npv a1 =
  325   withInstrument a1 $ \a1' -> 
  326   preErrorCheck $ \a2' -> 
  327   npv'_ a1' a2' >>= \res ->
  328   let {res' = realToFrac res} in
  329   errorCheck  a2'>>
  330   return (res')
  331 
  332 
  333 
  334 -- |returns the error estimate on the NPV when available.
  335 errorEstimate :: (GenInstrument i) -> IO ((Double))
  336 errorEstimate a1 =
  337   withInstrument a1 $ \a1' -> 
  338   preErrorCheck $ \a2' -> 
  339   errorEstimate'_ a1' a2' >>= \res ->
  340   let {res' = realToFrac res} in
  341   errorCheck  a2'>>
  342   return (res')
  343 
  344 
  345 
  346 -- |returns whether the instrument might have value greater than zero.
  347 isExpired :: (GenInstrument i) -> IO ((Bool))
  348 isExpired a1 =
  349   withInstrument a1 $ \a1' -> 
  350   preErrorCheck $ \a2' -> 
  351   isExpired'_ a1' a2' >>= \res ->
  352   let {res' = C2HSImp.toBool res} in
  353   errorCheck  a2'>>
  354   return (res')
  355 
  356 
  357 
  358 -- |returns the date the net present value refers to.
  359 valuationDate :: (GenInstrument i) -> IO ((Day))
  360 valuationDate a1 =
  361   withInstrument a1 $ \a1' -> 
  362   preErrorCheck $ \a2' -> 
  363   valuationDate'_ a1' a2' >>= \res ->
  364   let {res' = toDay res} in
  365   errorCheck  a2'>>
  366   return (res')
  367 
  368 
  369 
  370 -- |Re-registers `struct QlAdditionalResult*` with c2hs as `RawResultPtr` (the type is defined in
  371 -- `QuantLib.Internal.Common`, `nocode` here too) -- c2hs's pointer-type table is per-file, so
  372 -- without this the `{#fun#}` below infers the out-parameter as the opaque `Ptr (Ptr ())` instead
  373 -- of `Ptr RawResultPtr`, which fails to typecheck against `peekAdditionalResults`'s signature.
  374 
  375 
  376 
  377 -- |Returns QuantLib's `additionalResults()` map for the given Instrument, as an association list
  378 -- keyed by the C++ result name. The map's values are populated by the pricing engine;
  379 -- `additionalResults()` calls `calculate()` internally, so this is safe and idempotent after
  380 -- pricing.
  381 additionalResults :: (GenInstrument i) -> IO (([(String, AdditionalResultVal)]))
  382 additionalResults a1 =
  383   withInstrument a1 $ \a1' -> 
  384   preArray $ \(a2'1, a2'2) -> 
  385   preErrorCheck $ \a3' -> 
  386   additionalResults'_ a1' a2'1  a2'2 a3' >>
  387   peekAdditionalResults  a2'1  a2'2>>= \a2'' -> 
  388   errorCheck  a3'>>
  389   return (a2'')
  390 
  391 
  392 
  393 composite :: [(Instrument, Double)] -> IO Instrument
  394 composite = (uncurry qlCompositeInstrument) . unzip
  395 -- |Builds a composite instrument whose NPV is the sum of the given instruments' NPVs, each scaled by its paired multiplier.
  396 qlCompositeInstrument :: ([GenInstrument i]) -- ^instruments
  397  -> ([Double]) -- ^multipliers
  398  -> IO ((Instrument))
  399 qlCompositeInstrument a1 a2 =
  400   withInstrumentArray a1 $ \(a1'1, a1'2) -> 
  401   withDoubleArray a2 $ \(a2'1, a2'2) -> 
  402   preErrorCheck $ \a3' -> 
  403   qlCompositeInstrument'_ a1'1  a1'2 a2'1  a2'2 a3' >>= \res ->
  404   peekInstrument res >>= \res' ->
  405   errorCheck  a3'>>
  406   return (res')
  407 
  408 
  409 
  410 -- |Sets the pricing engine used to compute the instrument's results.
  411 setPricingEngine :: (GenInstrument i) -> (PricingEngine) -> IO ()
  412 setPricingEngine a1 a2 =
  413   withInstrument a1 $ \a1' -> 
  414   withPricingEngine a2 $ \a2' -> 
  415   preErrorCheck $ \a3' -> 
  416   setPricingEngine'_ a1' a2' a3' >>
  417   errorCheck  a3'>>
  418   return ()
  419 
  420 
  421 
  422 -- vim: set ff=unix ts=8 sts=2 sw=2 et:
  423 
  424 foreign import ccall safe "QuantLib/Instrument.chs.h qlInstrumentNPV"
  425   npv'_ :: ((C2HSImp.Ptr (CInstrument')) -> ((C2HSImp.Ptr (C2HSImp.Ptr C2HSImp.CChar)) -> (IO C2HSImp.CDouble)))
  426 
  427 foreign import ccall safe "QuantLib/Instrument.chs.h qlInstrumentErrorEstimate"
  428   errorEstimate'_ :: ((C2HSImp.Ptr (CInstrument')) -> ((C2HSImp.Ptr (C2HSImp.Ptr C2HSImp.CChar)) -> (IO C2HSImp.CDouble)))
  429 
  430 foreign import ccall safe "QuantLib/Instrument.chs.h qlInstrumentIsExpired"
  431   isExpired'_ :: ((C2HSImp.Ptr (CInstrument')) -> ((C2HSImp.Ptr (C2HSImp.Ptr C2HSImp.CChar)) -> (IO C2HSImp.CInt)))
  432 
  433 foreign import ccall safe "QuantLib/Instrument.chs.h qlInstrumentValuationDate"
  434   valuationDate'_ :: ((C2HSImp.Ptr (CInstrument')) -> ((C2HSImp.Ptr (C2HSImp.Ptr C2HSImp.CChar)) -> (IO C2HSImp.CInt)))
  435 
  436 foreign import ccall safe "QuantLib/Instrument.chs.h qlInstrumentAdditionalResults"
  437   additionalResults'_ :: ((C2HSImp.Ptr (CInstrument')) -> ((C2HSImp.Ptr C2HSImp.CUInt) -> ((C2HSImp.Ptr (RawResultPtr)) -> ((C2HSImp.Ptr (C2HSImp.Ptr C2HSImp.CChar)) -> (IO ())))))
  438 
  439 foreign import ccall safe "QuantLib/Instrument.chs.h qlCompositeInstrument"
  440   qlCompositeInstrument'_ :: (C2HSImp.CUInt -> ((C2HSImp.Ptr (C2HSImp.Ptr (CInstrument'))) -> (C2HSImp.CUInt -> ((C2HSImp.Ptr C2HSImp.CDouble) -> ((C2HSImp.Ptr (C2HSImp.Ptr C2HSImp.CChar)) -> (IO (C2HSImp.Ptr (CInstrument'))))))))
  441 
  442 foreign import ccall safe "QuantLib/Instrument.chs.h qlInstrumentSetPricingEngine"
  443   setPricingEngine'_ :: ((C2HSImp.Ptr (CInstrument')) -> ((C2HSImp.Ptr (CPricingEngine)) -> ((C2HSImp.Ptr (C2HSImp.Ptr C2HSImp.CChar)) -> (IO ()))))