Skip to content

Instantly share code, notes, and snippets.

package com.ovoenergy
import java.util.{Calendar, Date}
object Aggregator {
case class DailySnapshot(date: Date, amount: Double)
case class MonthlyConsumption(date: Date, amount: Double)
def parseData(data: Seq[(String, Double)]): Seq[DailySnapshot] = {
// 3²x² + 5²
let quadPlus = Quadratic(x²: 3 ^^ 2, x: 30, c: 5 ^^ 2)
linearPlus ** linearPlus == quadPlus
let ai = Complex(real: 18.9, imm: -19.3)
let bi = Complex(real: 4.4, imm: 0.2)
let vecti = Vector(fst: ai, snd: bi)
one ◊ vecti
vecti + vecti
vecti ** vecti
let vectj = Vector(fst: Complex.multId, snd: Complex.addId)
let fVecti = Linear(x: Vector.addId, c: vecti)
let fVectj = Linear(x: vectj, c: vectj)
fVecti + fVectj
Linear.addId + fVectj == fVectj
operator ^^: PowerPrecedence
precedencegroup PowerPrecedence {
higherThan: MultiplicationPrecedence
associativity: right
}
func ^^ <A: Multiplicative> (lhs: A, rhs: Int) -> A {
var a = A.multId
for _ in 0..<rhs {
a = a * lhs
let linearMinus = Linear(x: 3, c: -5)
let linearPlus = Linear(x: 3, c: 5)
let quadMinus = Quadratic(x²: 9, x: 0, c: -25)
linearPlus ** linearMinus == quadMinus
infix operator **: MultiplicationPrecedence
protocol FancyMult {
associatedtype FancyVal
static func ** (lhs: Self, rhs: Self) -> FancyVal
}
struct Quadratic<A> {
let x²: A
let x: A
let c: A
}
extension Quadratic: Equatable where A: Equatable {}
extension Linear: FancyMult where A: Additive, A: Multiplicative {
typealias FancyVal = Quadratic<A>
extension Vector: FancyMult where A: Additive, A: Multiplicative {
typealias FancyVal = A
static func ** (lhs: Vector<A>, rhs: Vector<A>) -> A {
return lhs.fst * rhs.fst + lhs.fst * rhs.fst
}
}
let constOne = Linear(x: 0, c: 1)
let constThree = Linear(x: 0, c: 3)
let verySteep = Linear(x: 200, c: -5)
let moveUpByThree = { $0 + constThree }
constOne + Linear.addId == constOne
moveUpByThree(constOne)
285 ◊ verySteep