timered-counter
Version:
Make the value change more vivid and natural
123 lines • 4.64 kB
JavaScript
import { isNullish, isString } from 'remeda';
import { BuildInNumberAdapter } from './number-adapter/index.js';
import { BuildInIntlSegmenterAdapter, BuildInStringAdapter, } from './string-adapter/index.js';
export class TimeredCounterAdapter {
/**
* 设置要使用的数字适配器. 仅对设置完之后的 TimeredCounter 实例生效.
*
* 接受的关键字除了内置的 `number` 以外, 还可以通过 {@link registerNumberAdapter} 注册的 `keyword`.
*
* @param adapterOrType
*/
static setNumberAdapter(adapterOrType) {
let adapter = BuildInNumberAdapter();
if (isString(adapterOrType)) {
for (const [keywords, adapterFactory,] of TimeredCounterAdapter.AVAILABLE_NUMBER_ADAPTERS) {
if (keywords.includes(adapterOrType)) {
adapter = adapterFactory();
break;
}
}
}
else {
adapter = adapterOrType;
}
TimeredCounterAdapter.NUMBER_ADAPTER = adapter;
}
/**
* 与 {@link setNumberAdapter} 类似, 用于设置字符串适配器.
*/
static setStringAdapter(adapterOrType) {
let adapter = BuildInStringAdapter();
if (isString(adapterOrType)) {
for (const [keywords, adapterFactory,] of TimeredCounterAdapter.AVAILABLE_STRING_ADAPTERS) {
if (keywords.includes(adapterOrType)) {
adapter = adapterFactory();
break;
}
}
}
else {
adapter = adapterOrType;
}
TimeredCounterAdapter.STRING_ADAPTER = adapter;
}
static registerNumberAdapter(keyword, adapter) {
TimeredCounterAdapter.AVAILABLE_NUMBER_ADAPTERS.set(keyword, adapter);
}
static registerStringAdapter(keyword, adapter) {
TimeredCounterAdapter.AVAILABLE_STRING_ADAPTERS.set(keyword, adapter);
}
/**
* 可以直接使用 adapter 文件的导出进行注册.
*
* adapter 文件需要导出一个名为 register 的函数, 该函数接受一个 TimeredCounterAdapter 类型的参数.
*
* 具体示例请查看 {@link GraphemeSplitterAdapter} or {@link DecimalJsAdapter}.
*/
static registerAdapter(adapter) {
adapter.register(this);
}
}
TimeredCounterAdapter.AVAILABLE_NUMBER_ADAPTERS = new Map([
[['number'], BuildInNumberAdapter],
// [['decimal.js', 'decimaljs'], DecimalJsAdapter()],
]);
TimeredCounterAdapter.AVAILABLE_STRING_ADAPTERS = new Map([
[['string'], BuildInStringAdapter],
[['intl-segmenter'], BuildInIntlSegmenterAdapter],
// [['grapheme-splitter'], GraphemeSplitterAdapter()],
]);
/**
* 数字适配器, 有以下两种:
* 1. BuildInNumberAdapter(默认): 使用内置 number 进行计算.
* 2. DecimalJsAdapter: 使用 Decimal.js 进行计算.
*
* 详细信息请查看[字符长度限制](/guide/optional-dependencies#字符长度限制)章节.
*
* @default BuildInNumberAdapter
*/
TimeredCounterAdapter.NUMBER_ADAPTER = BuildInNumberAdapter();
/**
* 字符串适配器, 有以下两种:
* 1. BuildInStringAdapter(默认): 使用内置 string 进行字符串处理.
* 2. BuildInIntlSegmenterAdapter: 使用 Intl.Segmenter 进行字符串处理. 能够支持 emoji, 字符集.
* 3. GraphemeSplitterAdapter: 使用 grapheme-splitter 进行字符串处理. 能够支持 emoji, 字符集.
*
* 详细信息请查看[支持 emoji 分词](/guide/optional-dependencies#支持-emoji-分词)章节.
*
* @default BuildInStringAdapter
*/
TimeredCounterAdapter.STRING_ADAPTER = BuildInStringAdapter();
/**
* 将 value 及其相关的属性, 在 attribute 和 property 上的互相转换.
*
* @see https://lit.dev/docs/components/properties/#attributes
* @protected
*/
TimeredCounterAdapter.VALUE_CONVERTER = {
fromAttribute(value) {
return value;
},
toAttribute(value) {
return isNullish(value)
? value
: TimeredCounterAdapter.NUMBER_ADAPTER.toString(value);
},
};
export function setNumberAdapter(...args) {
TimeredCounterAdapter.setNumberAdapter(...args);
}
export function setStringAdapter(...args) {
TimeredCounterAdapter.setStringAdapter(...args);
}
export function registerNumberAdapter(...args) {
TimeredCounterAdapter.registerNumberAdapter(...args);
}
export function registerStringAdapter(...args) {
TimeredCounterAdapter.registerStringAdapter(...args);
}
export function registerAdapter(...args) {
TimeredCounterAdapter.registerAdapter(...args);
}
//# sourceMappingURL=timered-counter-adapter.js.map