Add Generatable type
parent
df918b8498
commit
b61f0dfbbb
|
|
@ -0,0 +1,109 @@
|
|||
module Generatable exposing (..)
|
||||
{-| The Generatable type contains information that can be stored, modified,
|
||||
generated or regenerated.
|
||||
-}
|
||||
|
||||
import Random
|
||||
|
||||
type Generatable a
|
||||
= ToBeGenerated (Random.Generator a)
|
||||
| Generated a (Random.Generator a)
|
||||
|
||||
{-| Return the most recently generated content.
|
||||
-}
|
||||
content : Generatable a -> Maybe a
|
||||
content gen =
|
||||
case gen of
|
||||
ToBeGenerated _ ->
|
||||
Nothing
|
||||
|
||||
Generated x _ ->
|
||||
Just x
|
||||
|
||||
{-| Generate a new Generatable from a random generator
|
||||
.-}
|
||||
fromGenerator : Random.Generator a -> Generatable a
|
||||
fromGenerator gr =
|
||||
ToBeGenerated gr
|
||||
|
||||
{-| Create a new generatable from a given seed.
|
||||
-}
|
||||
generateFromSeed : Random.Seed -> Generatable a -> Generatable a
|
||||
generateFromSeed seed gen =
|
||||
case gen of
|
||||
ToBeGenerated gr ->
|
||||
Generated (Random.step gr seed |> Tuple.first) gr
|
||||
|
||||
Generated _ gr ->
|
||||
Generated (Random.step gr seed |> Tuple.first) gr
|
||||
|
||||
{-| Generate the content of the Generatable if it doesn't exist.
|
||||
-}
|
||||
generate : (a -> msg) -> Generatable a -> Cmd msg
|
||||
generate toMsg gen =
|
||||
case gen of
|
||||
ToBeGenerated gr ->
|
||||
Random.generate toMsg gr
|
||||
|
||||
Generated _ _ ->
|
||||
Cmd.none
|
||||
|
||||
{-| Update any generated content. This mapping does nothing if the content
|
||||
isn't generated yet, and it doesn't affect future generations.
|
||||
-}
|
||||
map : (a -> a) -> Generatable a -> Generatable a
|
||||
map f gen =
|
||||
case gen of
|
||||
ToBeGenerated _ ->
|
||||
gen
|
||||
|
||||
Generated x gr ->
|
||||
Generated (f x) gr
|
||||
|
||||
{-| Generate the content of the Generatable, regardless of whether it has
|
||||
already generated.
|
||||
-}
|
||||
regenerate : (a -> msg) -> Generatable a -> Cmd msg
|
||||
regenerate toMsg gen =
|
||||
case gen of
|
||||
ToBeGenerated gr ->
|
||||
Random.generate toMsg gr
|
||||
|
||||
Generated _ gr ->
|
||||
Random.generate toMsg gr
|
||||
|
||||
{-| Override the content with freshly generated content.
|
||||
-}
|
||||
setContent : a -> Generatable a -> Generatable a
|
||||
setContent x gen =
|
||||
case gen of
|
||||
ToBeGenerated gr ->
|
||||
Generated x gr
|
||||
|
||||
Generated _ gr ->
|
||||
Generated x gr
|
||||
|
||||
{-| Remove any previously generated content from the generatable.
|
||||
-}
|
||||
removeContent : Generatable a -> Generatable a
|
||||
removeContent gen =
|
||||
case gen of
|
||||
ToBeGenerated _ ->
|
||||
gen
|
||||
|
||||
Generated _ gr ->
|
||||
ToBeGenerated gr
|
||||
|
||||
{-| Update the content of the generatable type.
|
||||
|
||||
If the content hasn't been generated yet, it will be updated once the content
|
||||
has generated.
|
||||
-}
|
||||
updateGenerator : (a -> b) -> Generatable a -> Generatable b
|
||||
updateGenerator f gen =
|
||||
case gen of
|
||||
ToBeGenerated gr ->
|
||||
ToBeGenerated (Random.map f gr)
|
||||
|
||||
Generated x gr ->
|
||||
Generated (f x) (Random.map f gr)
|
||||
Loading…
Reference in New Issue