Last active
November 26, 2020 09:48
-
-
Save kryptt/505aec5d620924cf08c95826eb6a106e to your computer and use it in GitHub Desktop.
type-system-savings
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//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) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Motor has Cardinaliy |Motor| = |A| + |B| | |
case class Motor(engine: Either[ElectricEngine, CombustionEngine], ...) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Motor2 has Cardinaliy |Motor2| = (1+|A|) × (1+|B|) | |
case class Motor2(electricEngine: Option[ElectricEngine], combustionEngine: Option[CombustionEngine], ...) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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