Table of Contents
結論
Ellieでのデモ: https://ellie-app.com/8gVtbYdRFqja1
UUIDはTSFoster/elm-uuidを使用。
import UUID exposing (UUID)
randomToTask : Generator a -> Task Never a
randomToTask generator =
Time.now
|> Task.map (Tuple.first << Random.step generator << Random.initialSeed << Time.posixToMillis)
-- これがTask Never UUIDになるので、Task.performの第2引数に与えてやれば良い。
randomToTask UUID.generator
背景
弊社で開発中のWalletシステムではREST API呼び出し時の認証に、Hmac-sha256で生成した署名とAPI呼び出しごとにユニークなUUIDの組み合わせで認証を行っている。
現在、弊社ではScalaFXで作成していたクライアントアプリケーションをWebアプリ化するために、Elmを使って書き直している。
問題
Generator
のままUUID
を取り扱うと、下記の問題が発生していた。
- 各ページごとにmodule分割を行っているが、各ページのMsgにわざわざUUID生成用のMsgを用意しなければならない。(当然その際のupdateも定義する必要がある)
- 複数API呼び出しの結果をマージする際に、各API呼び出しごとに毎回
update
を回さないといけなくなる。
Taskにしてしまえば、UUIDを使用するAPI呼び出しもTask化することで、update関数内が非常にスッキリとした作りとなる。
解決策
探したところ、下記の議論が見つかった。
https://gist.github.com/JoelQ/c93a8f6a81262ff12c93ab2ff859f8e5
これをそのまま適用した形になる。
この内容は、Generator a -> Task Never a
の1つのテンプレートとして使えるため、UUID以外でも、GeneratorからTaskへ変換を行いたい時に役に立つ。
参考
弊社のElmアドバイザーとして参画されているIzumiSyさんも同様の記事を書かれているので、合わせて確認してみてください。
https://qiita.com/IzumiSy/items/a668483723b23e62b080