Skip to content

Instantly share code, notes, and snippets.

@ranbena
Last active December 20, 2018 10:55
Show Gist options
  • Save ranbena/ace17bb4bb6015f2d22c9f60427e78be to your computer and use it in GitHub Desktop.
Save ranbena/ace17bb4bb6015f2d22c9f60427e78be to your computer and use it in GitHub Desktop.
Memoized getter decorator
import { has } from 'lodash-es'
// @flow
export function memoized(
target: any,
propertyKey: string,
descriptor: PropertyDescriptor<*>
) {
const originalGet = descriptor.get
const memKey = '__memoized__'
// eslint-disable-next-line no-param-reassign
descriptor.get = () => {
if (!has(this, memKey)) {
Object.defineProperty(this, memKey, { value: new Map() })
}
return this[memKey].has(propertyKey)
? this[memKey].get(propertyKey)
: (() => {
const value = originalGet.call(this)
this[memKey].set(propertyKey, value)
return value
})()
}
}
[options]
unsafe.enable_getters_and_setters=true
import memoized from 'util/memoized.decorator'
class Example {
@memoized
get someProperty() {
// do something
return value
}
}
@ranbena
Copy link
Author

ranbena commented Dec 20, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment