ElmでUUID GeneratorをTask化する

お知らせ
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

タイトルとURLをコピーしました