Memoization - structural memoization
by Dawid Ryłko
HTML
<!-- Memoizacja strukturalna -->
<a href="https://dawidrylko.com/memoizacja-harry-potter-i-myslodsiewnia/" target="_blank">Memoizacja strukturalna</a>
TypeScript
class Character {
constructor(
public readonly value: string,
public readonly children: Character[] = [],
) {}
}
const characterCache = new Map<string, Character>();
const createSharedCharacter = (value: string, children: Character[] = []): Character => {
const key = `${value}:${children.map((c) => c.value).join(',')}`;
if (characterCache.has(key)) {
console.log(`♻️ Sharing character: ${value}`);
return characterCache.get(key)!;
}
console.log(`✨ Creating new character: ${value}`);
const newCharacter = new Character(value, children);
characterCache.set(key, newCharacter);
return newCharacter;
};
const pureBlood = createSharedCharacter('Pure blood');
const halfBlood = createSharedCharacter('Half blood');
const harry = createSharedCharacter('Harry', [halfBlood]);
const draco = createSharedCharacter('Draco', [pureBlood]);
const dracoTwin = createSharedCharacter('Draco', [pureBlood]);
console.log(harry !== draco);
console.log(draco === dracoTwin);