amao
7/11/2015 - 8:08 AM

Memoized in Swift

Memoized in Swift

// Inspired by and basically implemnted by http://intersections.tumblr.com/post/99634084704/unobservable-effects-with-value-types
// Cleaned up for Swift 2.0 (multi-load enums, yay!) and added value as mutating get instead of a mutating fuc

enum Memoized<T> {
    case Evaluated(T)
    case Unevaluated(() -> T)
    
    var value: T {
        mutating get {
            switch self {
            case .Evaluated(let x):
                return x
            case .Unevaluated(let f):
                self = .Evaluated(f())
                return value
            }
        }
    }
}

// Example

var x = Memoized.Unevaluated { (1...10000000).reduce(0, combine: +) }

print("Thinking...")
for y in 1...3 {
    print("I like the number \(x.value + y).")
}