Skip to content

Instantly share code, notes, and snippets.

@nubbel
Last active August 29, 2015 14:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nubbel/2784aac019b81b1646a4 to your computer and use it in GitHub Desktop.
Save nubbel/2784aac019b81b1646a4 to your computer and use it in GitHub Desktop.
final class Box<T> {
let value: T
init(_ value: T) {
self.value = value
}
}
protocol DataType : Printable {
}
protocol PrimitiveType : DataType {
}
enum UndefinedType : String, PrimitiveType {
case Undefined = "Undefined"
case Null = "Uninitialized"
var description : String {
return rawValue
}
static func fromState(state: String) -> UndefinedType {
return UndefinedType(rawValue: state)!
}
}
enum OnOffType : String, PrimitiveType {
case On = "ON"
case Off = "OFF"
var description : String {
return rawValue
}
}
enum PercentType : PrimitiveType {
case Zero
case Hundred
case Value(Int)
var value : Int {
switch self {
case .Zero:
return 0
case .Hundred:
return 100
case .Value(let value):
return value
}
}
var description : String {
return String(value)
}
}
enum ComposedType<P : PrimitiveType, T : DataType> : DataType {
case Left(Box<P>)
case Right(Box<T>)
var description : String {
switch self {
case .Left(let box):
return box.value.description
case .Right(let box):
return box.value.description
}
}
init(_ value: P) {
self = .Left(Box(value))
}
init(_ value: T) {
self = .Right(Box(value))
}
}
var state : ComposedType<OnOffType, ComposedType<UndefinedType, PercentType>>
state = ComposedType(OnOffType.On)
state.description // => "On"
state = ComposedType(ComposedType(PercentType.Value(37)))
state.description // => "37"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment