diff --git a/src/decorators/index.ts b/src/decorators/index.ts index 3b2d1ae..4d53467 100644 --- a/src/decorators/index.ts +++ b/src/decorators/index.ts @@ -1,2 +1,3 @@ export * from './exclude'; +export * from './memoize'; export * from './pluck'; \ No newline at end of file diff --git a/src/decorators/memoize.ts b/src/decorators/memoize.ts new file mode 100644 index 0000000..9f6b353 --- /dev/null +++ b/src/decorators/memoize.ts @@ -0,0 +1,19 @@ +export function Memoize(): Function { + return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) { + const originalMethod = descriptor.value; + descriptor.value = function(this: any, ...args: any[]) { + const reflectKey = `${JSON.stringify(this)}_${JSON.stringify(args)}_${propertyKey}`; + const hasReflectData = Reflect.hasMetadata(reflectKey, target); + + if (hasReflectData) { + return Reflect.getMetadata(reflectKey, target) + } else { + const result = originalMethod.apply(this, args); + Reflect.defineMetadata(reflectKey, result, target); + return result; + } + } + + return descriptor; + } +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..48d5e07 --- /dev/null +++ b/src/index.ts @@ -0,0 +1 @@ +import "reflect-metadata"; \ No newline at end of file diff --git a/tests/decorators/memoize.spec.ts b/tests/decorators/memoize.spec.ts new file mode 100644 index 0000000..6311167 --- /dev/null +++ b/tests/decorators/memoize.spec.ts @@ -0,0 +1,22 @@ +import 'reflect-metadata'; +import { Serde } from "src/serde"; +import { Memoize } from 'src/decorators'; + +class MemoizeTestModel extends Serde { + name: string; + @Memoize() doNameRandom(): string { + return this.name + (Math.random() * 10); + } +} + +describe('@Memoize() Decorator', () => { + it('should remember...', () => { + const testModel = new MemoizeTestModel().deserialize({ + name: 'test model', + }); + + const result1 = testModel.doNameRandom(); + const result2 = testModel.doNameRandom(); + expect(result1).toBe(result2); + }); +}); \ No newline at end of file