Skip to content

Instantly share code, notes, and snippets.

@IanKeen
Last active January 9, 2024 08:41
Show Gist options
  • Save IanKeen/72b2f9cf6d00b0607e6bebffb5e98033 to your computer and use it in GitHub Desktop.
Save IanKeen/72b2f9cf6d00b0607e6bebffb5e98033 to your computer and use it in GitHub Desktop.
Lazy<T>
class Lazy<T> {
private(set) var created: Bool = false
private(set) lazy var value: T = {
created = true
return builder()
}()
private var builder: () -> T
init(_ builder: @escaping () -> T) {
self.builder = builder
}
func map<U>(_ closure: @escaping (T) -> U) -> Lazy<U> {
return .init { closure(self.value) }
}
func flatMap<U>(_ closure: @escaping (T) -> Lazy<U>) -> Lazy<U> {
return .init { closure(self.value).value }
}
}
// MARK: - Usage
let a = Lazy { 42 }
.map { $0 + 10 }
.flatMap { value in Lazy<String>({ String(value) }) }
a.created // false
let value = a.value //nothing is evaluated until this line
a.created // true
print(value)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment