Open thekid opened 3 years ago
First implementation idea:
// What the user writes
enum Distance {
case Miles(public int $miles);
}
// What gets emitted
abstract class Distance implements \TaggedUnion {
public static function Miles(int $miles): self {
return new class('Miles', $miles) extends self {
public $name, $miles;
private function __construct($name, $miles) {
$this->name= $name;
$this->miles= $miles;
}
};
}
}
See https://wiki.php.net/rfc/tagged_unions:
The famous "Maybe" nomad:
These are very similar to Kotlin's sealed classes: In some sense, sealed classes are similar to enum classes: the set of values for an enum type is also restricted, but each enum constant exists only as a single instance, whereas a subclass of a sealed class can have multiple instances, each with its own state..
See also https://www.dotnetcurry.com/patterns-practices/1510/maybe-monad-csharp