blog.bouzuya.net

2018-05-09 purescript-avar を読む

bouzuya/tamaru 。昨日 (2018-05-08) に引き続き、簡単な HTTP サーバーをつくっている。

今日はリクエストボディの読み取りとクエリ文字列の解釈。

リクエストボディは昨日予想したとおり怪しい感じ。主に使用したパッケージは↓。

avar は asynchronous な variable 。読み取り操作が書き込み操作 (の結果通知) を待つ。読み取り操作は callback を登録しておき、書き込み操作ではそれらの callback に値が渡される。 Maybe (Either Error a) な雰囲気の AVarStatus を持っている。書き込まれていなければ Nothing (Empty) 、エラーなら Left Error (Killed) 、成功なら Right a (Filled) な感じ。ソースコードをざっと読んだ。短いのだけど、ほとんど JavaScript だし、ガリガリやっているのでつらい。

aff (Aff) は JavaScript の Promise 的なもの。非同期処理と例外処理をまとめて Eff っぽく書けるようにしたもの。定番っぽいので、これもそのうちソースコードを読む。……で aff は avar に依存している。 avar は aff 経由で使うと callback の代わりに Aff が使われるので、簡潔になる。

node-stream は名前のとおり Node.js の Stream を PureScript から使えるようにしたもの。昨日も書いたけど、破壊的な操作を前提としているし、非同期処理だらけで扱いにくいデータ構造だと思う。

このへんをガリガリ使って読んだ。例外処理まわりに自信がない。 node-stream は Encoding が指定されているときに exception を投げるっぽいんだけど……、まあ、いいや。

クエリ文字列は適当に (JavaScript 由来の関数でガリガリと) バラして終わり。 purescript-node-url ってのを使ってみたのだけど、 Node.js の url と querystring に依存しているし、あまりおしゃれな API でもなくてモヤモヤする。 NPM パッケージに依存されるよりはマシだけど。

Request / Response が落ち着いてきた。あとすこし整理したら、 Google Sheets API を使っていく。今回は永続化先として Google Sheets を使うつもりなので。