Herteby / enum / Enum

String-based Enums


type alias Enum a =
{ toString : a -> String
, fromString : String -> Maybe a
, encode : a -> Json.Decode.Value
, decoder : Json.Decode.Decoder a
, list : List ( String
, a ) 
}

An Enum is a record containing common helper functions

create : List ( String, a ) -> Enum a

Create an Enum from a list of String and variants

type Fruit
    = Apple
    | Banana
    | Mango

fruit : Enum Fruit
fruit =
    Enum.create
        [ ( "Apple", Apple )
        , ( "Banana", Banana )
        , ( "Mango", Mango )
        ]

fromIterator : (a -> ( String, a )) -> a -> Enum a

Create an Enum from an iterator function and a starting variant. It may look unusual, but the benefit is that the case statement helps ensure that you don't forget a variant.

type Fruit
    = Apple
    | Banana
    | Mango

fruit : Enum Fruit
fruit =
    Enum.fromIterator
        (\a ->
            case a of
                Apple ->
                    ( "Banana", Banana )

                Banana ->
                    ( "Mango", Mango )

                Mango ->
                    ( "Apple", Apple )
        )
        Apple

Int-based Enums


type alias EnumInt a =
{ toInt : a -> Basics.Int
, fromInt : Basics.Int -> Maybe a
, encode : a -> Json.Decode.Value
, decoder : Json.Decode.Decoder a
, list : List ( Basics.Int
, a ) 
}

Enums based on Int instead of String

createInt : List ( Basics.Int, a ) -> EnumInt a

Create an EnumInt from a list of Int and variants

type Fruit
    = Apple
    | Banana
    | Mango

fruit : EnumInt Fruit
fruit =
    Enum.createInt
        [ ( 1, Apple )
        , ( 2, Banana )
        , ( 3, Mango )
        ]

fromIntIterator : (a -> ( Basics.Int, a )) -> a -> EnumInt a

Create an EnumInt from an iterator function and a starting variant

type Fruit
    = Apple
    | Banana
    | Mango

enum : EnumInt Fruit
enum =
    Enum.fromIntIterator
        (\a ->
            case a of
                Mango ->
                    ( 1, Apple )

                Apple ->
                    ( 2, Banana )

                Banana ->
                    ( 3, Mango )
        )
        Apple