「UUID生成をTask化できないか」という相談に対して「できないだろうな」と思っていたが、@niso1985さんができる方法を見つけてくれたので日本語でも検索に引っかかるようメモとして残しておく。
以下の例はTSFoster/elm-uuidをつかったケース。
これまでUUIDを生成するには以下のように一度Cmdにしないと受け取れないのかと思っていた。
Cmd使う版
init : () -> ( Model, Cmd msg )
init _ =
( { uuid = "" }, Random.generate UUIDGenerated UUID.generator )
type Msg
= UUIDGenerated UUID
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
UUIDGenerated value ->
( { value = UUID.toString value }, Cmd.none )
しかしこんな感じで書くこともできるらしい。
Task使う版
import UUID exposing (UUID)
import Task exposing (Task)
import Random
import Time
newUUID : Task Never UUID
newUUID =
Task.map (Tuple.first << Random.step UUID.generator << Random.initialSeed << Time.posixToMillis) Time.now
こうすればUUIDが必要な任意の処理をTaskとしてチェーンして書ける。これはうれしい。
懸念点として、Taskのほうは現在時刻をシードとして使うため推測されやすいUUIDになる可能性があるとのこと。
参考: https://gist.github.com/JoelQ/c93a8f6a81262ff12c93ab2ff859f8e5