🔀bs-lwt
BuckleScriptで非同期処理を書きたかったので、Lwtのバインディングを作った。 たぶんReasonからも使えると思う。
🙅 制限
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が対応していないことに気がついた。
これ踏んだ https://t.co/rOHWjNlOCQ
— mzp (@mzp) 2017年5月14日
しょうがないので、ソースコードをレポジトリに直接追加した。
バージョン番号
Lwtのバージョンとバンディングのバージョンの対応を考えるのが大変そうだったので、この2つを一致させるルールにした。
そしたら今度はバンディングのビルド方法を修正したときにバージョンをあげる方法がなくなってしまった。 試しに v3.0.0.1 みたいに4桁目を使ってみたが、semverではなくなりインストールできなくなってしまった。
postinstall
最初は、bucklescript-addons/bs-mochaを参考に、postinstall
ででライブラリをビルドするようにしていた。
が、ReasonのDiscordで聞いてみたら、
postinstall
でビルドするのは古いスタイルで、今はなにもする必要はない- ライブラリを利用するプロジェクトが
bsb -make-world
すれば、依存ライブラリもビルドされる - 出力するモジュールの種類を後で変更できるので、このほうが柔軟である
とのことだったので、消した。
BuckleScriptの依存関係解決がよくわかんなくてreasonmlのdiscordで聞いてた
— mzp (@mzp) 2017年5月28日
質問すると即レスくるんだけど、どうなってんの...
— mzp (@mzp) 2017年5月28日
💞所感
githubにpushだけしておいたら、Discordで晒されてて勢いを感じた。 typoを修正するプルリクエストも来た。