Sometimes we have an instance of enum
that is of known constructor (or we only accept that constructor) and we want to extract values from that instance. Normally, to do this, we have to use pattern matching (switch
), however it's quite verbose, so we can instead use this macro static extension method that will generate switch for us.
Implementation
#if macro import haxe.macro.Expr; #end class Tools { public static macro function extract(value:ExprOf<EnumValue>, pattern:Expr):Expr { switch (pattern) { case macro $a => $b: return macro switch ($value) { case $a: $b; default: throw "no match"; } default: throw new Error("Invalid enum value extraction pattern", pattern.pos); } } }
Usage
using Tools; class Main { static function main() { var opt = haxe.ds.Option.Some(10); var val = opt.extract(Some(v) => v); trace(val == 10); // true } }