LoginSignup
7
0

More than 3 years have passed since last update.

ElmでUUID生成をTask化する

Last updated at Posted at 2020-03-11

「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

7
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
0