Skip to content

Instantly share code, notes, and snippets.

@lildata
Last active October 22, 2015 13:39
Show Gist options
  • Save lildata/600624a9869665fddd95 to your computer and use it in GitHub Desktop.
Save lildata/600624a9869665fddd95 to your computer and use it in GitHub Desktop.
def usd(amount) = Scale(Const(amount),One("USD"))
def stock(symbol) = Scale(Lookup(symbol),One("USD"))
def buy(contract, amount) = And(contract,Give(usd(amount)))
def sell(contract, amount) = And(Give(contract),usd(amount))
def zcb(maturity, notional, currency) = When(maturity, Scale(Const(notional),One(currency)))
def option(contract) = Or(contract,Zero())
def europeanCallOption(at, c1, strike) = When(at, option(buy(c1,strike)))
def europeanPutOption(at, c1, strike) = When(at, option(sell(c1,strike)))
def americanCallOption(at, c1, strike) = Anytime(at, option(buy(c1,strike)))
def americanPutOption(at, c1, strike) = Anytime(at, option(sell(c1,strike)))
package ComposingContracts {
sealed trait Contract
case class Zero() extends Contract
case class One(currency: String) extends Contract
case class Give(contract: Contract) extends Contract
case class And(contract1: Contract, contract2: Contract) extends Contract
case class Or(contract1: Contract, contract2: Contract) extends Contract
case class Cond(cond: Obs[Boolean], contract1: Contract, contract2: Contract) extends Contract
case class Scale(scale: Obs[Double], contract: Contract) extends Contract
case class When(date: LocalDate, contract: Contract) extends Contract
case class Anytime(date: LocalDate, contract: Contract) extends Contract
abstract class Obs[A] {
def +(that: Obs[A])(implicit n: Numeric[A]): Obs[A] = Lift2(n.plus, this, that)
def -(that: Obs[A])(implicit n: Numeric[A]): Obs[A] = Lift2(n.minus, this, that)
...
}
case class Const[A](k: A) extends Obs[A]
case class Lift[B, A](lifted: (B) => A, o: Obs[B]) extends Obs[A]
case class Lift2[C, B, A](lifted: (C, B) => A, o1: Obs[C], o2: Obs[B]) extends Obs[A]
case class DateObs() extends Obs[LocalDate]
case class Lookup[A](lookup: String) extends Obs[Double]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment