public enum Basic { case Untyped case HasType(Int) public init() { self = .Untyped } public func doSomething() {} } public enum Generic { case Left(A) case Right(A) } public protocol Computable { func compute() } public enum Lazy : Computable { case Thunk(() -> T) case Value(T) public init(value: T) { self = .Value(value) } public func compute() { // if (this ~= .Thunk(var fn)) { // this = .Value(fn()) // } } } public enum Breakfast : Int { case Eggs case Bacon case Coffee } @frozen public enum Exhaustive {}