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 を使うつもりなので。