Skip to content

Instantly share code, notes, and snippets.

@kryptt
Last active November 26, 2020 09:48
Show Gist options
  • Save kryptt/505aec5d620924cf08c95826eb6a106e to your computer and use it in GitHub Desktop.
Save kryptt/505aec5d620924cf08c95826eb6a106e to your computer and use it in GitHub Desktop.
type-system-savings
//A type A with Cardinality |A| = 5
class ElectricEngine(core: MotorCoils)
case class HybridElectricEngine(volume: EngineVolume, fuel: Petrol.type) extends ElectricEngine(`1800Coils`)
//A type B with Cardinality |B| = 8
case class CombustionEngine(volume: EngineVolume, fuel: FuelType, mod: Modification)
// Motor has Cardinaliy |Motor| = |A| + |B|
case class Motor(engine: Either[ElectricEngine, CombustionEngine], ...)
// Motor2 has Cardinaliy |Motor2| = (1+|A|) × (1+|B|)
case class Motor2(electricEngine: Option[ElectricEngine], combustionEngine: Option[CombustionEngine], ...)
// definitions used so the code's Cardinalities match the article
sealed trait EngineVolume
case object `600cc` extends EngineVolume
case object `1200cc` extends EngineVolume
sealed trait MotorCoils
case object `600Coils` extends MotorCoils
case object `1500Coils` extends MotorCoils
case object `1800Coils` extends MotorCoils
sealed trait FuelType
case object `Petrol` extends FuelType
case object `Deisel` extends FuelType
sealed trait Modification
case object 'Turbo' extends Modification
case object 'None' extends Modification
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment