abstractを使ってDOMとjQueryを透過的に扱う

abstractを使うと、「C言語のunion」みたいなのを型安全かつ便利に書ける。引数をabstractで受けると非常に便利。

例として、js.html.Elementとjs.JQueryを透過的に扱ってみる。

abstract Html(Element) {
    inline function new(x: Element) {
        this = x;
    }

    @:from public static inline function fromElement(x: Element): Html {
        return new Html(x);
    }

    @:to public inline function toElement(): Element {
        return this;
    }

    @:from public static inline function fromJQuery(x: JQuery): Html {
        return new Html(x[0]);
    }

    @:to public inline function toJQuery(): JQuery {
        return new JQuery(this);
    }
}
function appendToBody(x: Html) {
    Browser.document.body.appendChild(x); //Html -> Element に暗黙の型変換
}

var div = new JQuery("<div></div>");
appendToBody(div); //JQuery -> Html に暗黙の型変換

ここでは "abstract Html(Element)" とElement型を主にしてみたけど、JQuery型を主にした方が良いかもって気もするし、NodeListも扱えた方が…とか色々あるのだけど、このあたりは好みですね。