みずぴー日記

陽気なプログラマが世界を廻す

🔀bs-lwt

BuckleScriptで非同期処理を書きたかったので、Lwtバインディングを作った。 たぶんReasonからも使えると思う。

github.com

🙅 制限

Lwtの一部はUnixモジュールなどに依存しているのでBuckleScriptからは使えない。 なのでコア部分(src/core以下にあるモジュール)のみを使えるようにした。

利用できるモジュールの一覧はREADMEに書いてある。

🎯動機

BuckleScriptでredux-sagaみたいなのが作りたかった。 そこで、redux-sagaのソースコード読んでみたところ、タスクスケジューラを実装していることが分かった。

タスクスケジューラを再実装するのは大変なので、軽量スレッドのライブラリであるLwtのバインディングを作った。

「redux-sagaみたいなの」は今のところ ripple_task.mli みたいになっている。 Lwt_list.map_s のような関数で合成できるので、ジェネレータで実装したタスクより使いやすい気がしている。

😵大変だった箇所

submodule

最初、Lwtのソースコードはgit submoduleを使ってレポジトリに追加していた。 npmはsubmoduleに対応してるのでしばらくはうまくいっていたが、途中でyarnが対応していないことに気がついた。

しょうがないので、ソースコードをレポジトリに直接追加した。

バージョン番号

Lwtのバージョンとバンディングのバージョンの対応を考えるのが大変そうだったので、この2つを一致させるルールにした。

そしたら今度はバンディングのビルド方法を修正したときにバージョンをあげる方法がなくなってしまった。 試しに v3.0.0.1 みたいに4桁目を使ってみたが、semverではなくなりインストールできなくなってしまった。

postinstall

最初は、bucklescript-addons/bs-mochaを参考に、postinstallででライブラリをビルドするようにしていた。

が、ReasonのDiscordで聞いてみたら、

  • postinstallでビルドするのは古いスタイルで、今はなにもする必要はない
  • ライブラリを利用するプロジェクトが bsb -make-worldすれば、依存ライブラリもビルドされる
  • 出力するモジュールの種類を後で変更できるので、このほうが柔軟である

とのことだったので、消した。

💞所感

githubにpushだけしておいたら、Discordで晒されてて勢いを感じた。 typoを修正するプルリクエストも来た。

f:id:mzp:20170528210650p:plain