/random-pipeline

This is a package that makes getting random values a little bit easier in Elm.

Primary LanguageElmOtherNOASSERTION

Random Pipeline

This is a package that makes getting random values a little bit easier in Elm.

Heres a side by side comparison between Random and Random.Pipeline

-- Random
modelGenerator : Generator Model
modelGenerator =
    Random.map4 Model
        positionGenerator
        enemiesGenerator
        uuidGenerator
        nameGenerator


init : Seed -> ( Model, Seed )
init =
    Random.step modelGenerator


-- Random.Pipeline
import Random.Pipeline exposing (from, with)

init : Seed -> ( Model, Seed )
init seed =
    Model
        |> from seed
        |> with positionGenerator
        |> with enemiesGenerator
        |> with uuidGenerator
        |> with nameGenerator

A little bit cleaner right? And what if we wanted to keep the seed in our Model too? Just use Random.Pipeline.finish

import Random.Pipeline exposing (from, with, finish)

init : Seed -> Model
init seed =
    Model
        |> from seed
        |> with positionGenerator
        |> with enemiesGenerator
        |> with uuidGenerator
        |> with nameGenerator
        |> finish


type alias Model =
    { pos : Position
    , enemies : List Enemy
    , uuid : Uuid
    , name : String
    , seed : Seed
    }

It also has always that can hardcode values into your random generation.

import Random.Pipeline exposing (from, with, finish, always)

update : Msg -> Model -> Model
update msg model =
    case msg of
        Restart ->
            Model
                |> Random.from model.seed
                |> Random.with positionGenerator
                |> Random.with enemiesGenerator
                |> Random.always model.uuid
                |> Random.always model.name
                |> Random.finish