Herteby/enum/1.0.1

Enum

String-based Enums

type alias Enum a =
{ toString : a -> String
, fromString : String -> Maybe a
, encode : a -> Value
, decoder : 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 -> Int
, fromInt : Int -> Maybe a
, encode : a -> Value
, decoder : Decoder a
, list : List ( Int, a )
}

Enums based on Int instead of String

createInt : List ( 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 -> ( 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