PureScriptで仮想DOM用のdiff処理を書いた

追記 本記事に出てくるパッケージは現在メンテされていません。 また実装に問題があるため参考にはしないでください。

動機

拙作の仮想DOM実装のpurescript-vomは、child nodeの差分計算が雑に作られていた。 しかし、そろそろ真面目にこのパッケージ使いたいなと思い、その差分計算の実装を少し賢くしようということで実装した。 それがこちらのpurescript-key-based-diffである。 まだpurescript-vomにはこの処理を組み込んでいないが、それはまた後日やる。

どういう感じなのか

馬鹿正直に実装せず、計算量が少なく済むようなリスト変更パターンで処理を進められるだけ進めるという感じになっている。 具体的にはコードを見てもらえればわかると思うが、

  • 先頭から処理を進めていった場合に、先頭が古いリストと同じリストで同じパターン
  • 末尾から処理を進めていった場合、末尾が古いリストと同じリストで同じパターン
  • 先頭から処理を進めていった場合のリストがリバースされているパターン
  • 末尾から処理を進めていった場合のリストがリバースされているパターン

を先にチェックして進めるだけ進めるようにしていて、 進めるだけ進んだら、未処理の分をぐるっとまわして、普通にkeyと要素のマップつくってから、残りの処理をするという感じ。

また、この処理は最終的にリスト操作に応じてdomへの反映処理を行うこととなるので、Effで反映処理をうけつけるようにしている。

感想

処理の性質上、すんごい手続き的な書き方になったが、すごい見栄えが悪いしコードも長かった。(通常はこんなコードにならない)

また、マジレスすると、デフォでカリー化されるPureScriptで書くより、FFI側でJSで全ての処理を書いて、インターフェースだけPureScript側に公開する形をとったほうがパフォーマンスはよいだろう。 しかし、あんまりFFIでどうにかしないようにしたいというお気持ちが強かった....

最後に

PureScriptはユーザーが少ないため、マサカリやPRが基本的にこない。そのため、マサカリ不足となっている。マサカリは能力値アップには必要不可欠であると考えるため、なるべく自分のつくったものを宣伝しようという気持ちができてきている。

GitHubに拙作のPureScriptパッケージがいくつかあるので、優しい人はPRやマサカリをなげていただけるとかなり喜ぶ。