blob: eeb9050fe3185a15c6b1c129acf58eae1a275da6 [file] [log] [blame]
// RUN: %target-typecheck-verify-swift -solver-expression-time-threshold=1 -solver-disable-shrink -disable-constraint-solver-performance-hacks -solver-enable-operator-designated-types
// REQUIRES: tools-release,no_asserts
func memoize<A: Hashable, R>(
f: @escaping ((A) -> R, A) -> R
) -> ((A) -> R) {
var memo = Dictionary<A,R>()
var recur: ((A) -> R)!
recur = { (a: A) -> R in
if let r = memo[a] { return r }
let r = f(recur, a)
memo[a] = r
return r
}
return recur
}
let fibonacci = memoize {
(fibonacci, n) in
n < 2 ? n as Int : fibonacci(n - 1) + fibonacci(n - 2)
}