SumTypes.@caseMacro
@case T fdef

Define a pattern matcher fdef to deconstruct a SumType

Examples:

@case Either f((x,)::Left)  = x + 1
@case Either f((x,)::Right) = x - 1

Calling f on an Either type will use manually unrolled dispatch, rather than julia's automatic dynamic dispatch machinery.That is, it'll emit code that is just a series of if/else calls.

SumTypes.@sum_typeMacro
@sum_type(T, blk)

Create a sum type T with constructors in the codeblock blk.

Examples: *) An unparameterized sum type Foo with constructors Bar and Baz

@sum_type Foo begin
    Bar(::Int)
    Baz(::Float64)
end

julia> Bar(1)
Foo(Bar(1))

*) 'The' Either sum type with constructors Left and Right

@sum_type Either{A, B} begin
    Left{A, B}(::A)
    Right{A, B}(::B)
end

julia> Left{Int, Int}(1)
Either{Int64,Int64}(Left{Int64,Int64}(1))

julia> Right{Int, Float64}(1.0)
Either{Int64,Float64}(Right{Int64,Float64}(1.0))

*) A recursive List sum type with constructors Nil and Cons

@sum_type List{A} begin
    Nil{A}()
    Cons{A}(::A, ::List{A})
end

julia> Nil{Int}()
List{Int64}(Nil{Int64}())

julia> Cons{Int}(1, Cons{Int}(1, Nil{Int}()))
List{Int64}(Cons{Int64}(1, List{Int64}(Cons{Int64}(1, List{Int64}(Nil{Int64}())))))