MemoizeObject is a decorator which memoize functions and methods using their value as a cache key instead of reference ID.
memoize-object-decorator
A decorator returns memoized function which compares objects and arrays by value.
Installation
npm i memoize-object-decorator
Usage
import { MemoizeObject } from 'memoize-object-decorator';
interface Person {
name: string;
age: number;
}
class SomeClass {
@MemoizeObject()
factorial(num: number): number {
return (num <= 1) ? 1 : num * this.factorial(--num);
}
@MemoizeObject()
getFactorialOfPersonAgeMinusSomething(obj: Person, somethingToSubtract: number): number {
return this.factorial(obj.age) - somethingToSubtract;
}
}
const fact: SomeClass = new SomeClass();
const person: Person = {
name: "John Doe",
age: 10
}
fact.factorial(10);
fact.factorial(10);
fact.factorial(15);
fact.getFactorialOfPersonAgeMinusSomething(person, 10)
fact.getFactorialOfPersonAgeMinusSomething(person, 10)
person.age = 12;
fact.getFactorialOfPersonAgeMinusSomething(person, 10)
fact.getFactorialOfPersonAgeMinusSomething(person, 10)
fact.getFactorialOfPersonAgeMinusSomething(person, 20)
Comparision with standard lodash memoize function/decorator
import { Memoize } from 'lodash-decorators';
interface Person {
name: string;
age: number;
}
class SomeClass {
@Memoize()
factorial(num: number): number {
return (num <= 1) ? 1 : num * this.factorial(--num);
}
@Memoize()
getFactorialOfPersonAgeMinusSomething(obj: Person, somethingToSubtract: number): number {
return this.factorial(obj.age) - somethingToSubtract;
}
}
const fact: SomeClass = new SomeClass();
const person: Person = {
name: "John Doe",
age: 10
}
fact.factorial(10);
fact.factorial(10);
fact.factorial(15);
fact.getFactorialOfPersonAgeMinusSomething(person, 10)
fact.getFactorialOfPersonAgeMinusSomething(person, 10)
person.age = 12;
fact.getFactorialOfPersonAgeMinusSomething(person, 10)
fact.getFactorialOfPersonAgeMinusSomething(person, 10)
fact.getFactorialOfPersonAgeMinusSomething(person, 20)
What's going on under the hood?
The decorator takes all of the arguments of memoized function and calculates their unique SHA1 hash which is used as a Map key for cache.
In this way we can track objects and arrays by their values instead of the reference.
Important
SHA1 hash calculation process is slow in general, so it is not recommended to use this decorator for methods which takes huge objects or/and arrays as an arguments.