You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Fredrik Ekre 445a39ed6c Add a test for empty enums. 4 years ago
.github Add CI configuration. 4 years ago
src Add a test for empty enums. 4 years ago
test Add a test for empty enums. 4 years ago
.gitignore Add package skeleton. 4 years ago
LICENSE Add package skeleton. 4 years ago
Project.toml Add package content. 4 years ago
README.md Change default typename to 'T', and allow overriding by passing T=Typ. 4 years ago

README.md

EnumX.jl

This is what I wish Base.@enum was.

Usage

EnumX exports the macro @enumx, which works similarly to Base.@enum, but with some improvements.

The main drawback of Base.@enum is that the names for instances are not scoped. This means, for example, that it is inconvenient to use "common" names for enum instances, and it is impossible to have multiple enums with the same instance names.

EnumX.@enumx solves these limitations by putting everything behind a module scope such that instances are hidden and instead accessed using dot-syntax:

julia> using EnumX

julia> @enumx Fruit Apple Banana

julia> Fruit.Apple
Fruit.Apple = 0

julia> Fruit.Banana
Fruit.Banana = 1

Fruit is a module -- the actual enum type is defined as Fruit.T by default:

julia> Fruit.T
Enum type Fruit.T <: Enum{Int32} with 2 instances:
 Fruit.Apple  = 0
 Fruit.Banana = 1

julia> Fruit.T <: Base.Enum
true

Another typename can be passed as the first argument to @enumx as follows:

julia> @enumx T=FruitEnum Fruit Apple

julia> Fruit.FruitEnum
Enum type Fruit.FruitEnum <: Enum{Int32} with 1 instance:
 Fruit.Apple = 0

Since the only reserved name in the example above is the module Fruit we can create another enum with overlapping instance names (this would not be possible with Base.@enum):

julia> @enumx YellowFruits Banana Lemon

julia> YellowFruits.Banana
YellowFruits.Banana = 0

@enumx also allows for duplicate values:

julia> Fruit.T
Enum type Fruit.T <: Enum{Int32} with 2 instances:
 Fruit.Apple  = 1
 Fruit.Banana = 1

julia> Fruit.Apple
Fruit.Apple = Fruit.Banana = 1

julia> Fruit.Banana
Fruit.Apple = Fruit.Banana = 1

@enumx also lets you use previous enum names for value initialization:

julia> @enumx Fruit Apple Banana Orange=Apple

julia> Fruit.T
Enum type Fruit.T <: Enum{Int32} with 3 instances:
 Fruit.Apple  = 0
 Fruit.Banana = 1
 Fruit.Orange = 0

Other than that, functionality should be comparable to Base.@enum:

  • Base type specification (defaults to Int32):

    julia> @enumx Fruit::UInt8 Apple Banana
    
    julia> typeof(Integer(Fruit.Apple))
    UInt8
    
  • Specifying values (if not specified, defaults to the value of the previous instance + 1):

    julia> @enumx Fruit Apple=4 Banana=(1 + 5) Orange
    
    julia> Fruit.T
    Enum type Fruit.T <: Enum{Int32} with 3 instances:
     Fruit.Apple  = 4
     Fruit.Banana = 6
     Fruit.Orange = 7
    
  • Definition with begin/end block:

    julia> @enumx Fruit begin
               Apple
               Banana
               Orange
           end
    

See also

Community discussions

Related packages

  • CEnum.jl: C-compatible Enums.
  • SuperEnum.jl: Similar approach as EnumX, but doesn't give you Base.Enums.
  • NamespacedEnums.jl: Discontinued package similar to EnumX, which gave me the idea to let user override the default .T typename.