HaxeのマクロでPromise専用構文を作った

専用構文というか、マクロでF#のコンピュテーション式のサブセットライブラリ(Bind, Return, Zeroのみ)を実装して、その上にPromiseを載せたという表現の方が正確な説明です。

github.com

Promiseを使った非同期処理がこんな感じで書けます。hxgndでは、hxgnd.Promiseという独自実装のPromise型が提供されていますが、これはjs.Promiseと混在させることが可能です。

import hxgnd.Promise;

class Main {
    public static function main() {
        Promise.compute({
            var a = @await Promise.resolve(1);
            var b = @await js.Promise.resolve(2);
            var c = @await getValue();
            (a + b + c) * 10;
        }).then(function (x) {
            trace(x);  // 60
        });
    }

    static function getValue() {
        return new Promise(function (fulfill, _) {
            haxe.Timer.delay(function () fulfill(3), 100);
        });
    }
}

とりあえずこれがあれば、他人に無理やりHaxeを書かせる際に「Haxeってasync/awaitとかScalaのforがないじゃないですか」って言われるケースは封殺できるようになってめでたいです。あとはHaxe 4でアロー構文とfinalが入ってくるのを待つ感じです。