You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
2.6 KiB

import { createActiveCurrency } from './currency/active-currency.svelte';
import { createActiveDates } from './dates/active-dates.svelte';
import { createActiveNumbers } from './numbers/active-numbers.svelte';
import { createActiveUnits } from './units/active-units.svelte';
import { createActiveFormatLocaleSource } from './active-runtime.svelte';
import type { ActiveCurrency, ActiveCurrencyOptions } from './currency';
import type { ActiveDates, ActiveDatesOptions } from './dates';
import type { ActiveNumbers, ActiveNumbersOptions } from './numbers';
import type { ActiveUnits, ActiveUnitsOptions } from './units';
import type { FormatLocaleSource } from './types';
export interface ActiveFormatOptions {
locale?: string;
localeSource?: FormatLocaleSource;
numbers?: Omit<ActiveNumbersOptions, 'locale' | 'localeSource'>;
currency?: Omit<ActiveCurrencyOptions, 'locale' | 'localeSource' | 'numbers'>;
units?: Omit<ActiveUnitsOptions, 'locale' | 'localeSource' | 'numbers'>;
dates?: Omit<ActiveDatesOptions, 'locale' | 'localeSource'>;
}
export interface ActiveFormat {
readonly numbers: ActiveNumbers;
readonly currency: ActiveCurrency;
readonly units: ActiveUnits;
readonly dates: ActiveDates;
getLocale: () => string;
setLocale: (locale: string) => void;
/**
* `true` once `dispose()` has been called. After dispose,
* `setLocale()` is a silent no-op so a late event from a locale
* source doesn't reach the already-disposed sub-engines.
*/
readonly disposed: boolean;
/** Idempotent. Disposes every sub-engine in stable order. */
dispose: () => void;
}
export function createActiveFormat(options: ActiveFormatOptions = {}): ActiveFormat {
const localeState = createActiveFormatLocaleSource(options);
const localeSource = localeState.source;
const numbers = createActiveNumbers({ ...options.numbers, localeSource });
const currency = createActiveCurrency({ ...options.currency, localeSource, numbers });
const units = createActiveUnits({ ...options.units, localeSource, numbers });
const dates = createActiveDates({ ...options.dates, localeSource });
let disposed = false;
function setLocale(nextLocale: string): void {
if (disposed) return;
localeState.setLocale(nextLocale);
numbers.setLocale(nextLocale);
currency.setLocale(nextLocale);
units.setLocale(nextLocale);
dates.setLocale(nextLocale);
}
return {
numbers,
currency,
units,
dates,
getLocale: () => numbers.getLocale(),
setLocale,
get disposed() {
return disposed;
},
dispose() {
if (disposed) return;
disposed = true;
numbers.dispose();
currency.dispose();
units.dispose();
dates.dispose();
}
};
}

Powered by TurnKey Linux.