Skip to content

Instantly share code, notes, and snippets.

@olim7t
Last active August 29, 2015 14:01
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 olim7t/ec6a7e4305862e5df781 to your computer and use it in GitHub Desktop.
Save olim7t/ec6a7e4305862e5df781 to your computer and use it in GitHub Desktop.
@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.7' )
abstract class Cache {
Cache parent
Closure loader
Cache(Closure loader) {
this.loader = loader
}
Cache(Cache parent) {
this.parent = parent
}
abstract getHere(key)
abstract putHere(key, value)
def get(key) {
def value = getHere(key)
if (!value) {
if (parent) {
value = parent.get(key)
} else {
value = loader(key)
}
putHere(key, value)
}
return value;
}
}
loader = { it ->
println("Computing for $it")
return it * 2
}
level2 = new Cache(loader) {
private def map = [:]
def getHere(key) {
return map[key]
}
def putHere(key, value) {
println("level 2 stores $key => $value")
map[key] = value
}
}
level1 = new Cache(level2) {
private def map = [:]
def getHere(key) {
return map[key]
}
def putHere(key, value) {
println("level 1 stores $key => $value")
map[key] = value
}
}
assert level1.get(2) == 4
assert level1.get(2) == 4
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment