From 73a20fe682b513729dcf608d8e6458cac4f4f161 Mon Sep 17 00:00:00 2001 From: Ivan Demchuk Date: Fri, 17 Jul 2020 20:36:10 +0300 Subject: [PATCH 1/2] Add per locale Intl memoizer --- fluent-bundle/src/bundle.ts | 2 ++ fluent-bundle/src/memoizer.ts | 19 ++++++++++++++++++ fluent-bundle/test/memoizer_test.js | 30 +++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 fluent-bundle/src/memoizer.ts create mode 100644 fluent-bundle/test/memoizer_test.js diff --git a/fluent-bundle/src/bundle.ts b/fluent-bundle/src/bundle.ts index 59d7b81e..e958a3d0 100644 --- a/fluent-bundle/src/bundle.ts +++ b/fluent-bundle/src/bundle.ts @@ -4,6 +4,7 @@ import { FluentResource } from "./resource.js"; import { FluentValue, FluentNone, FluentFunction } from "./types.js"; import { Message, Term, Pattern } from "./ast.js"; import { NUMBER, DATETIME } from "./builtins.js"; +import { getMemoizerForLocale } from "./memoizer.js"; export type TextTransform = (text: string) => string; @@ -78,6 +79,7 @@ export class FluentBundle { }; this._useIsolating = useIsolating; this._transform = transform; + this._intls = getMemoizerForLocale(locales); } /** diff --git a/fluent-bundle/src/memoizer.ts b/fluent-bundle/src/memoizer.ts new file mode 100644 index 00000000..d2a8cf32 --- /dev/null +++ b/fluent-bundle/src/memoizer.ts @@ -0,0 +1,19 @@ +type IntlCache = WeakMap< + | typeof Intl.NumberFormat + | typeof Intl.DateTimeFormat + | typeof Intl.PluralRules, + Record + >; + +const cache = new Map(); + +export function getMemoizerForLocale(locales: string | string[]): IntlCache { + const stringLocale = Array.isArray(locales) ? locales.join(" ") : locales; + let memoizer = cache.get(stringLocale); + if (memoizer === undefined) { + memoizer = new WeakMap(); + cache.set(stringLocale, memoizer); + } + + return memoizer; +} diff --git a/fluent-bundle/test/memoizer_test.js b/fluent-bundle/test/memoizer_test.js new file mode 100644 index 00000000..ecf74e7d --- /dev/null +++ b/fluent-bundle/test/memoizer_test.js @@ -0,0 +1,30 @@ +'use strict'; + +import assert from 'assert'; +import {getMemoizerForLocale} from '../esm/memoizer.js'; + +suite('Memoizer', function() { + test('returns same instance for same locale', function() { + const memoizer1 = getMemoizerForLocale('en') + const memoizer2 = getMemoizerForLocale('en') + assert.strictEqual(memoizer1, memoizer2) + }); + + test('returns different instance for different locale', function() { + const memoizer1 = getMemoizerForLocale('en') + const memoizer2 = getMemoizerForLocale('uk') + assert.notStrictEqual(memoizer1, memoizer2) + }); + + test('works with array of locales', function() { + const memoizer1 = getMemoizerForLocale(['en']) + const memoizer2 = getMemoizerForLocale(['en']) + assert.strictEqual(memoizer1, memoizer2) + }); + + test('works with string and array of locales', function() { + const memoizer1 = getMemoizerForLocale(['en']) + const memoizer2 = getMemoizerForLocale('en') + assert.strictEqual(memoizer1, memoizer2) + }) +}) From e94eb08e7fad269108107b85c344f79d8617467d Mon Sep 17 00:00:00 2001 From: Ivan Demchuk Date: Fri, 28 May 2021 11:23:05 +0300 Subject: [PATCH 2/2] Switch from WeakMap to Map --- fluent-bundle/src/bundle.ts | 9 ++------- fluent-bundle/src/memoizer.ts | 4 ++-- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/fluent-bundle/src/bundle.ts b/fluent-bundle/src/bundle.ts index e958a3d0..c6396e5c 100644 --- a/fluent-bundle/src/bundle.ts +++ b/fluent-bundle/src/bundle.ts @@ -4,7 +4,7 @@ import { FluentResource } from "./resource.js"; import { FluentValue, FluentNone, FluentFunction } from "./types.js"; import { Message, Term, Pattern } from "./ast.js"; import { NUMBER, DATETIME } from "./builtins.js"; -import { getMemoizerForLocale } from "./memoizer.js"; +import { getMemoizerForLocale, IntlCache } from "./memoizer.js"; export type TextTransform = (text: string) => string; @@ -23,12 +23,7 @@ export class FluentBundle { public _functions: Record; public _useIsolating: boolean; public _transform: TextTransform; - public _intls = new WeakMap< - | typeof Intl.NumberFormat - | typeof Intl.DateTimeFormat - | typeof Intl.PluralRules, - Record - >(); + public _intls: IntlCache; /** * Create an instance of `FluentBundle`. diff --git a/fluent-bundle/src/memoizer.ts b/fluent-bundle/src/memoizer.ts index d2a8cf32..1f9bf204 100644 --- a/fluent-bundle/src/memoizer.ts +++ b/fluent-bundle/src/memoizer.ts @@ -1,4 +1,4 @@ -type IntlCache = WeakMap< +export type IntlCache = Map< | typeof Intl.NumberFormat | typeof Intl.DateTimeFormat | typeof Intl.PluralRules, @@ -11,7 +11,7 @@ export function getMemoizerForLocale(locales: string | string[]): IntlCache { const stringLocale = Array.isArray(locales) ? locales.join(" ") : locales; let memoizer = cache.get(stringLocale); if (memoizer === undefined) { - memoizer = new WeakMap(); + memoizer = new Map(); cache.set(stringLocale, memoizer); }