Kristian Nedrevold
12/27/2022, 2:22 PMfun <A, B> memoize (f: (A) -> B) = { a: A ->
val cache = mutableMapOf<A, B>()
cache.computeIfAbsent(a) { f(a) }
}
Kristian Nedrevold
12/27/2022, 2:24 PMfun main() {
val toUpperCaseMemoized: (Int) -> Int = memoize(::incrementWithSideEffect)
toUpperCaseMemoized(1) // Should print
toUpperCaseMemoized(1) // Should not print
}
fun <A, B> memoize (f: (A) -> B) = { a: A ->
val cache = mutableMapOf<A, B>()
cache.computeIfAbsent(a) { f(a) }
}
fun incrementWithSideEffect(n: Int): Int {
println("I'm a side effect")
return n + 1
}
Marian Schubert
12/27/2022, 2:35 PMMarian Schubert
12/27/2022, 2:37 PMKristian Nedrevold
12/27/2022, 2:51 PMKristian Nedrevold
12/27/2022, 2:51 PMclass Memoized<in A, out B>(val f: (A) -> B): (A) -> B {
private val cache = mutableMapOf<A, B>()
override fun invoke(a: A): B {
return cache.getOrPut(a) { f(a) }
}
}
fun <A, B> memoize (f: (A) -> B): (A) -> B = Memoized(f)
Kristian Nedrevold
12/27/2022, 2:53 PMfun <A, B> memoize (f: (A) -> B): (A) -> B = object : (A) -> B {
private val cache = mutableMapOf<A, B>()
override fun invoke(a: A): B {
return cache.getOrPut(a) { f(a) }
}
}
Kristian Nedrevold
12/27/2022, 2:53 PMMarian Schubert
12/27/2022, 3:32 PMKristian Nedrevold
12/27/2022, 7:05 PM