@lee-zg/melange 1.0.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-3RM45M64.js +1637 -0
- package/dist/chunk-3RM45M64.js.map +1 -0
- package/dist/{chunk-ALBD5XC5.js → chunk-GXFWPL5M.js} +4 -8
- package/dist/chunk-GXFWPL5M.js.map +1 -0
- package/dist/{chunk-Q73NOVWX.cjs → chunk-KUJARU3D.cjs} +7 -24
- package/dist/chunk-KUJARU3D.cjs.map +1 -0
- package/dist/{chunk-2PXWQDZC.js → chunk-MBBJMHTS.js} +3 -5
- package/dist/chunk-MBBJMHTS.js.map +1 -0
- package/dist/{chunk-ZT6HVG4G.cjs → chunk-UYJUSNDI.cjs} +4 -8
- package/dist/chunk-UYJUSNDI.cjs.map +1 -0
- package/dist/{chunk-Q7XG6YN6.cjs → chunk-V5THPEB2.cjs} +3 -5
- package/dist/chunk-V5THPEB2.cjs.map +1 -0
- package/dist/{chunk-352XNR3C.js → chunk-VGZMISJD.js} +7 -24
- package/dist/chunk-VGZMISJD.js.map +1 -0
- package/dist/chunk-YZVCK6VZ.cjs +1646 -0
- package/dist/chunk-YZVCK6VZ.cjs.map +1 -0
- package/dist/core/index.cjs +23 -23
- package/dist/core/index.js +1 -1
- package/dist/fp/index.cjs +45 -45
- package/dist/fp/index.js +1 -1
- package/dist/index.cjs +147 -147
- package/dist/index.js +4 -4
- package/dist/plugins/index.cjs +9 -9
- package/dist/plugins/index.d.cts +287 -133
- package/dist/plugins/index.d.ts +287 -133
- package/dist/plugins/index.js +1 -1
- package/dist/utils/index.cjs +73 -73
- package/dist/utils/index.js +1 -1
- package/package.json +5 -2
- package/dist/chunk-2PXWQDZC.js.map +0 -1
- package/dist/chunk-352XNR3C.js.map +0 -1
- package/dist/chunk-ALBD5XC5.js.map +0 -1
- package/dist/chunk-O7K662J5.cjs +0 -842
- package/dist/chunk-O7K662J5.cjs.map +0 -1
- package/dist/chunk-Q73NOVWX.cjs.map +0 -1
- package/dist/chunk-Q7XG6YN6.cjs.map +0 -1
- package/dist/chunk-YGMBCZJQ.js +0 -833
- package/dist/chunk-YGMBCZJQ.js.map +0 -1
- package/dist/chunk-ZT6HVG4G.cjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugins/speech/synthesis.ts","../src/plugins/speech/recognition.ts"],"names":[],"mappings":"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","file":"chunk-YGMBCZJQ.js","sourcesContent":["/**\r\n * @fileoverview 语音合成 (TTS) 实现\r\n * @module melange/plugins/speech/synthesis\r\n * @description 提供语音合成功能,支持浏览器原生 API 和第三方服务降级\r\n */\r\n\r\nimport type {\r\n SpeechProviderType,\r\n SpeechServiceStatus,\r\n SpeechError,\r\n VoiceInfo,\r\n SynthesisConfig,\r\n SynthesisEventType,\r\n SynthesisEvent,\r\n SynthesisEventHandler,\r\n SynthesisProvider,\r\n SpeechSynthesizer,\r\n} from './types';\r\n\r\n// ============================================================================\r\n// 浏览器原生提供商实现\r\n// ============================================================================\r\n\r\n/**\r\n * 浏览器原生语音合成提供商\r\n * 使用 Web Speech API 的 SpeechSynthesis 接口\r\n */\r\nclass BrowserSynthesisProvider implements SynthesisProvider {\r\n readonly type: SpeechProviderType = 'browser';\r\n private synthesis: SpeechSynthesis | null = null;\r\n private eventHandlers: Map<SynthesisEventType, Set<SynthesisEventHandler>> = new Map();\r\n private voicesLoaded: boolean = false;\r\n private voicesPromise: Promise<VoiceInfo[]> | null = null;\r\n\r\n constructor() {\r\n if (this.isAvailable()) {\r\n this.synthesis = window.speechSynthesis;\r\n }\r\n }\r\n\r\n /**\r\n * 检查浏览器是否支持语音合成\r\n */\r\n isAvailable(): boolean {\r\n return typeof window !== 'undefined' && 'speechSynthesis' in window;\r\n }\r\n\r\n /**\r\n * 获取可用语音列表\r\n */\r\n async getVoices(): Promise<VoiceInfo[]> {\r\n if (!this.synthesis) {\r\n return [];\r\n }\r\n\r\n // 如果已经有加载中的 Promise,直接返回\r\n if (this.voicesPromise) {\r\n return this.voicesPromise;\r\n }\r\n\r\n this.voicesPromise = new Promise((resolve) => {\r\n const loadVoices = () => {\r\n const voices = this.synthesis!.getVoices();\r\n if (voices.length > 0) {\r\n this.voicesLoaded = true;\r\n resolve(\r\n voices.map((voice) => ({\r\n id: voice.voiceURI,\r\n name: voice.name,\r\n lang: voice.lang,\r\n localService: voice.localService,\r\n default: voice.default,\r\n provider: 'browser' as SpeechProviderType,\r\n }))\r\n );\r\n }\r\n };\r\n\r\n // 尝试立即获取\r\n loadVoices();\r\n\r\n // 如果没有获取到,监听 voiceschanged 事件\r\n if (!this.voicesLoaded) {\r\n this.synthesis!.addEventListener('voiceschanged', loadVoices, { once: true });\r\n // 设置超时,防止永久等待\r\n setTimeout(() => {\r\n if (!this.voicesLoaded) {\r\n resolve([]);\r\n }\r\n }, 3000);\r\n }\r\n });\r\n\r\n return this.voicesPromise;\r\n }\r\n\r\n /**\r\n * 朗读文本\r\n */\r\n async speak(text: string, config?: SynthesisConfig): Promise<void> {\r\n if (!this.synthesis) {\r\n throw this.createError('NOT_AVAILABLE', '浏览器不支持语音合成');\r\n }\r\n\r\n // 取消当前正在进行的朗读\r\n this.cancel();\r\n\r\n return new Promise((resolve, reject) => {\r\n const utterance = new SpeechSynthesisUtterance(text);\r\n\r\n // 应用配置\r\n if (config) {\r\n if (config.lang) utterance.lang = config.lang;\r\n if (config.volume !== undefined) utterance.volume = config.volume;\r\n if (config.rate !== undefined) utterance.rate = config.rate;\r\n if (config.pitch !== undefined) utterance.pitch = config.pitch;\r\n\r\n // 设置语音\r\n if (config.voice) {\r\n const voices = this.synthesis!.getVoices();\r\n const voiceConfig = config.voice;\r\n const targetVoice =\r\n typeof voiceConfig === 'string'\r\n ? voices.find((v) => v.name === voiceConfig || v.voiceURI === voiceConfig)\r\n : voices.find((v) => v.voiceURI === voiceConfig.id);\r\n if (targetVoice) {\r\n utterance.voice = targetVoice;\r\n }\r\n }\r\n }\r\n\r\n // 设置事件处理\r\n utterance.onstart = () => {\r\n this.emit('start', { type: 'start' });\r\n };\r\n\r\n utterance.onend = () => {\r\n this.emit('end', { type: 'end' });\r\n resolve();\r\n };\r\n\r\n utterance.onpause = () => {\r\n this.emit('pause', { type: 'pause' });\r\n };\r\n\r\n utterance.onresume = () => {\r\n this.emit('resume', { type: 'resume' });\r\n };\r\n\r\n utterance.onboundary = (event) => {\r\n this.emit('boundary', {\r\n type: 'boundary',\r\n charIndex: event.charIndex,\r\n charLength: event.charLength,\r\n elapsedTime: event.elapsedTime,\r\n name: event.name,\r\n });\r\n };\r\n\r\n utterance.onmark = (event) => {\r\n this.emit('mark', {\r\n type: 'mark',\r\n name: event.name,\r\n });\r\n };\r\n\r\n utterance.onerror = (event) => {\r\n const error = this.createError(event.error, `语音合成错误: ${event.error}`);\r\n this.emit('error', { type: 'error', error });\r\n reject(error);\r\n };\r\n\r\n this.synthesis!.speak(utterance);\r\n });\r\n }\r\n\r\n /**\r\n * 暂停朗读\r\n */\r\n pause(): void {\r\n if (this.synthesis && this.isSpeaking()) {\r\n this.synthesis.pause();\r\n }\r\n }\r\n\r\n /**\r\n * 继续朗读\r\n */\r\n resume(): void {\r\n if (this.synthesis && this.isPaused()) {\r\n this.synthesis.resume();\r\n }\r\n }\r\n\r\n /**\r\n * 取消朗读\r\n */\r\n cancel(): void {\r\n if (this.synthesis) {\r\n this.synthesis.cancel();\r\n }\r\n }\r\n\r\n /**\r\n * 是否正在朗读\r\n */\r\n isSpeaking(): boolean {\r\n return this.synthesis?.speaking ?? false;\r\n }\r\n\r\n /**\r\n * 是否已暂停\r\n */\r\n isPaused(): boolean {\r\n return this.synthesis?.paused ?? false;\r\n }\r\n\r\n /**\r\n * 添加事件监听\r\n */\r\n on(event: SynthesisEventType, handler: SynthesisEventHandler): void {\r\n if (!this.eventHandlers.has(event)) {\r\n this.eventHandlers.set(event, new Set());\r\n }\r\n this.eventHandlers.get(event)!.add(handler);\r\n }\r\n\r\n /**\r\n * 移除事件监听\r\n */\r\n off(event: SynthesisEventType, handler: SynthesisEventHandler): void {\r\n this.eventHandlers.get(event)?.delete(handler);\r\n }\r\n\r\n /**\r\n * 触发事件\r\n */\r\n private emit(type: SynthesisEventType, event: SynthesisEvent): void {\r\n this.eventHandlers.get(type)?.forEach((handler) => {\r\n try {\r\n handler(event);\r\n } catch (e) {\r\n console.error('语音合成事件处理器错误:', e);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 创建错误对象\r\n */\r\n private createError(code: string, message: string, originalError?: Error): SpeechError {\r\n const result: SpeechError = { code, message };\r\n if (originalError) {\r\n result.originalError = originalError;\r\n }\r\n return result;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// 语音合成器主类\r\n// ============================================================================\r\n\r\n/**\r\n * 语音合成器\r\n * 管理多个提供商,支持自动降级\r\n */\r\nexport class SpeechSynthesizerImpl implements SpeechSynthesizer {\r\n private _currentProvider: SpeechProviderType = 'browser';\r\n private _status: SpeechServiceStatus = 'idle';\r\n private provider: SynthesisProvider | null = null;\r\n private config: SynthesisConfig = {};\r\n private eventHandlers: Map<SynthesisEventType, Set<SynthesisEventHandler>> = new Map();\r\n private providers: Map<SpeechProviderType, SynthesisProvider> = new Map();\r\n\r\n /**\r\n * 当前使用的提供商类型\r\n */\r\n get currentProvider(): SpeechProviderType {\r\n return this._currentProvider;\r\n }\r\n\r\n /**\r\n * 服务状态\r\n */\r\n get status(): SpeechServiceStatus {\r\n return this._status;\r\n }\r\n\r\n /**\r\n * 初始化语音合成器\r\n * @param config - 合成配置\r\n */\r\n async initialize(config?: SynthesisConfig): Promise<void> {\r\n this._status = 'loading';\r\n this.config = {\r\n lang: 'zh-CN',\r\n preferredProvider: 'browser',\r\n autoFallback: true,\r\n fallbackProviders: ['azure', 'google', 'aws'],\r\n ...config,\r\n };\r\n\r\n try {\r\n // 注册浏览器提供商\r\n const browserProvider = new BrowserSynthesisProvider();\r\n this.providers.set('browser', browserProvider);\r\n\r\n // 尝试使用首选提供商\r\n const preferredProvider = this.config.preferredProvider || 'browser';\r\n if (await this.tryProvider(preferredProvider)) {\r\n this._status = 'ready';\r\n return;\r\n }\r\n\r\n // 如果首选提供商不可用且启用了自动降级\r\n if (this.config.autoFallback && this.config.fallbackProviders) {\r\n for (const providerType of this.config.fallbackProviders) {\r\n if (await this.tryProvider(providerType)) {\r\n this._status = 'ready';\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // 所有提供商都不可用\r\n this._status = 'error';\r\n throw new Error('没有可用的语音合成提供商');\r\n } catch (error) {\r\n this._status = 'error';\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 尝试使用指定提供商\r\n */\r\n private async tryProvider(type: SpeechProviderType): Promise<boolean> {\r\n const provider = this.providers.get(type);\r\n if (provider && provider.isAvailable()) {\r\n this.provider = provider;\r\n this._currentProvider = type;\r\n\r\n // 转发提供商事件\r\n this.forwardProviderEvents(provider);\r\n\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 转发提供商事件到合成器\r\n */\r\n private forwardProviderEvents(provider: SynthesisProvider): void {\r\n const events: SynthesisEventType[] = [\r\n 'start',\r\n 'end',\r\n 'pause',\r\n 'resume',\r\n 'boundary',\r\n 'mark',\r\n 'error',\r\n ];\r\n events.forEach((event) => {\r\n provider.on(event, (e) => this.emit(event, e));\r\n });\r\n }\r\n\r\n /**\r\n * 获取可用语音列表\r\n */\r\n async getVoices(): Promise<VoiceInfo[]> {\r\n if (!this.provider) {\r\n throw new Error('语音合成器未初始化');\r\n }\r\n return this.provider.getVoices();\r\n }\r\n\r\n /**\r\n * 朗读文本\r\n * @param text - 要朗读的文本\r\n * @param config - 可选的合成配置\r\n */\r\n async speak(text: string, config?: SynthesisConfig): Promise<void> {\r\n if (!this.provider) {\r\n throw new Error('语音合成器未初始化');\r\n }\r\n\r\n const mergedConfig = { ...this.config, ...config };\r\n return this.provider.speak(text, mergedConfig);\r\n }\r\n\r\n /**\r\n * 暂停朗读\r\n */\r\n pause(): void {\r\n this.provider?.pause();\r\n }\r\n\r\n /**\r\n * 继续朗读\r\n */\r\n resume(): void {\r\n this.provider?.resume();\r\n }\r\n\r\n /**\r\n * 取消朗读\r\n */\r\n cancel(): void {\r\n this.provider?.cancel();\r\n }\r\n\r\n /**\r\n * 是否正在朗读\r\n */\r\n isSpeaking(): boolean {\r\n return this.provider?.isSpeaking() ?? false;\r\n }\r\n\r\n /**\r\n * 是否已暂停\r\n */\r\n isPaused(): boolean {\r\n return this.provider?.isPaused() ?? false;\r\n }\r\n\r\n /**\r\n * 添加事件监听\r\n */\r\n on(event: SynthesisEventType, handler: SynthesisEventHandler): void {\r\n if (!this.eventHandlers.has(event)) {\r\n this.eventHandlers.set(event, new Set());\r\n }\r\n this.eventHandlers.get(event)!.add(handler);\r\n }\r\n\r\n /**\r\n * 移除事件监听\r\n */\r\n off(event: SynthesisEventType, handler: SynthesisEventHandler): void {\r\n this.eventHandlers.get(event)?.delete(handler);\r\n }\r\n\r\n /**\r\n * 触发事件\r\n */\r\n private emit(type: SynthesisEventType, event: SynthesisEvent): void {\r\n this.eventHandlers.get(type)?.forEach((handler) => {\r\n try {\r\n handler(event);\r\n } catch (e) {\r\n console.error('语音合成事件处理器错误:', e);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 销毁实例\r\n */\r\n dispose(): void {\r\n this.cancel();\r\n this.eventHandlers.clear();\r\n this.provider = null;\r\n this._status = 'idle';\r\n }\r\n\r\n /**\r\n * 注册自定义提供商\r\n * @param type - 提供商类型\r\n * @param provider - 提供商实例\r\n */\r\n registerProvider(type: SpeechProviderType, provider: SynthesisProvider): void {\r\n this.providers.set(type, provider);\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// 工厂函数\r\n// ============================================================================\r\n\r\n/**\r\n * 创建语音合成器实例\r\n * @param config - 可选的合成配置\r\n * @returns 语音合成器实例\r\n *\r\n * @example\r\n * ```typescript\r\n * // 创建并初始化语音合成器\r\n * const synthesizer = await createSpeechSynthesizer({\r\n * lang: 'zh-CN',\r\n * rate: 1.0,\r\n * pitch: 1.0,\r\n * });\r\n *\r\n * // 朗读文本\r\n * await synthesizer.speak('你好,世界!');\r\n *\r\n * // 监听事件\r\n * synthesizer.on('end', () => {\r\n * console.log('朗读完成');\r\n * });\r\n *\r\n * // 销毁\r\n * synthesizer.dispose();\r\n * ```\r\n */\r\nexport async function createSpeechSynthesizer(\r\n config?: SynthesisConfig\r\n): Promise<SpeechSynthesizer> {\r\n const synthesizer = new SpeechSynthesizerImpl();\r\n await synthesizer.initialize(config);\r\n return synthesizer;\r\n}\r\n\r\n/**\r\n * 检查当前环境是否支持语音合成\r\n * @returns 是否支持语音合成\r\n */\r\nexport function isSpeechSynthesisSupported(): boolean {\r\n return typeof window !== 'undefined' && 'speechSynthesis' in window;\r\n}\r\n\r\n/**\r\n * 快速朗读文本(一次性使用)\r\n * @param text - 要朗读的文本\r\n * @param config - 可选的合成配置\r\n *\r\n * @example\r\n * ```typescript\r\n * // 快速朗读\r\n * await speak('你好,世界!');\r\n *\r\n * // 带配置的朗读\r\n * await speak('Hello World', { lang: 'en-US', rate: 0.8 });\r\n * ```\r\n */\r\nexport async function speak(text: string, config?: SynthesisConfig): Promise<void> {\r\n if (!isSpeechSynthesisSupported()) {\r\n throw new Error('当前环境不支持语音合成');\r\n }\r\n\r\n const synthesizer = await createSpeechSynthesizer(config);\r\n try {\r\n await synthesizer.speak(text, config);\r\n } finally {\r\n synthesizer.dispose();\r\n }\r\n}\r\n","/**\r\n * @fileoverview 语音识别 (STT) 实现\r\n * @module melange/plugins/speech/recognition\r\n * @description 提供语音识别功能,支持浏览器原生 API 和第三方服务降级\r\n */\r\n\r\nimport type {\r\n SpeechProviderType,\r\n SpeechServiceStatus,\r\n SpeechError,\r\n RecognitionConfig,\r\n RecognitionEventType,\r\n RecognitionEvent,\r\n RecognitionEventHandler,\r\n RecognitionProvider,\r\n SpeechRecognizer,\r\n RecognitionResult,\r\n RecognitionResultItem,\r\n} from './types';\r\n\r\n// ============================================================================\r\n// 浏览器原生提供商实现\r\n// ============================================================================\r\n\r\n// ============================================================================\r\n// 浏览器 Speech Recognition API 类型声明\r\n// ============================================================================\r\n\r\n/**\r\n * SpeechRecognition 结果列表接口\r\n */\r\ninterface BrowserSpeechRecognitionResultList {\r\n readonly length: number;\r\n item(index: number): BrowserSpeechRecognitionResult | null;\r\n [index: number]: BrowserSpeechRecognitionResult;\r\n}\r\n\r\n/**\r\n * SpeechRecognition 结果接口\r\n */\r\ninterface BrowserSpeechRecognitionResult {\r\n readonly length: number;\r\n readonly isFinal: boolean;\r\n item(index: number): BrowserSpeechRecognitionAlternative | null;\r\n [index: number]: BrowserSpeechRecognitionAlternative;\r\n}\r\n\r\n/**\r\n * SpeechRecognition 备选结果接口\r\n */\r\ninterface BrowserSpeechRecognitionAlternative {\r\n readonly transcript: string;\r\n readonly confidence: number;\r\n}\r\n\r\n/**\r\n * SpeechRecognition 事件接口\r\n */\r\ninterface BrowserSpeechRecognitionEvent {\r\n readonly results: BrowserSpeechRecognitionResultList;\r\n readonly resultIndex: number;\r\n}\r\n\r\n/**\r\n * SpeechRecognition 错误事件接口\r\n */\r\ninterface BrowserSpeechRecognitionErrorEvent {\r\n readonly error: string;\r\n readonly message: string;\r\n}\r\n\r\n/**\r\n * 浏览器原生 SpeechRecognition 接口\r\n */\r\ninterface BrowserSpeechRecognition extends EventTarget {\r\n lang: string;\r\n continuous: boolean;\r\n interimResults: boolean;\r\n maxAlternatives: number;\r\n start(): void;\r\n stop(): void;\r\n abort(): void;\r\n onstart: ((this: BrowserSpeechRecognition, ev: Event) => void) | null;\r\n onend: ((this: BrowserSpeechRecognition, ev: Event) => void) | null;\r\n onresult: ((this: BrowserSpeechRecognition, ev: BrowserSpeechRecognitionEvent) => void) | null;\r\n onerror: ((this: BrowserSpeechRecognition, ev: BrowserSpeechRecognitionErrorEvent) => void) | null;\r\n onsoundstart: ((this: BrowserSpeechRecognition, ev: Event) => void) | null;\r\n onsoundend: ((this: BrowserSpeechRecognition, ev: Event) => void) | null;\r\n onspeechstart: ((this: BrowserSpeechRecognition, ev: Event) => void) | null;\r\n onspeechend: ((this: BrowserSpeechRecognition, ev: Event) => void) | null;\r\n onaudiostart: ((this: BrowserSpeechRecognition, ev: Event) => void) | null;\r\n onaudioend: ((this: BrowserSpeechRecognition, ev: Event) => void) | null;\r\n onnomatch: ((this: BrowserSpeechRecognition, ev: Event) => void) | null;\r\n}\r\n\r\n/**\r\n * SpeechRecognition 构造函数类型\r\n */\r\ninterface BrowserSpeechRecognitionConstructor {\r\n new (): BrowserSpeechRecognition;\r\n}\r\n\r\n// 声明 window 对象上的 SpeechRecognition\r\ndeclare global {\r\n interface Window {\r\n SpeechRecognition?: BrowserSpeechRecognitionConstructor;\r\n webkitSpeechRecognition?: BrowserSpeechRecognitionConstructor;\r\n }\r\n}\r\n\r\n/**\r\n * 获取浏览器的 SpeechRecognition 构造函数\r\n */\r\nfunction getSpeechRecognitionConstructor(): BrowserSpeechRecognitionConstructor | null {\r\n if (typeof window === 'undefined') {\r\n return null;\r\n }\r\n return window.SpeechRecognition || window.webkitSpeechRecognition || null;\r\n}\r\n\r\n/**\r\n * 浏览器原生语音识别提供商\r\n * 使用 Web Speech API 的 SpeechRecognition 接口\r\n */\r\nclass BrowserRecognitionProvider implements RecognitionProvider {\r\n readonly type: SpeechProviderType = 'browser';\r\n private recognition: BrowserSpeechRecognition | null = null;\r\n private eventHandlers: Map<RecognitionEventType, Set<RecognitionEventHandler>> = new Map();\r\n private _isListening: boolean = false;\r\n private SpeechRecognitionClass: BrowserSpeechRecognitionConstructor | null = null;\r\n\r\n constructor() {\r\n this.SpeechRecognitionClass = getSpeechRecognitionConstructor();\r\n }\r\n\r\n /**\r\n * 检查浏览器是否支持语音识别\r\n */\r\n isAvailable(): boolean {\r\n return this.SpeechRecognitionClass !== null;\r\n }\r\n\r\n /**\r\n * 开始语音识别\r\n */\r\n async start(config?: RecognitionConfig): Promise<void> {\r\n if (!this.SpeechRecognitionClass) {\r\n throw this.createError('NOT_AVAILABLE', '浏览器不支持语音识别');\r\n }\r\n\r\n // 如果已经在监听,先停止\r\n if (this._isListening) {\r\n this.stop();\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n this.recognition = new this.SpeechRecognitionClass!();\r\n\r\n // 应用配置\r\n if (config) {\r\n if (config.lang) this.recognition.lang = config.lang;\r\n if (config.continuous !== undefined) this.recognition.continuous = config.continuous;\r\n if (config.interimResults !== undefined) {\r\n this.recognition.interimResults = config.interimResults;\r\n }\r\n if (config.maxAlternatives !== undefined) {\r\n this.recognition.maxAlternatives = config.maxAlternatives;\r\n }\r\n }\r\n\r\n // 设置事件处理\r\n this.recognition.onstart = () => {\r\n this._isListening = true;\r\n this.emit('start', { type: 'start' });\r\n resolve();\r\n };\r\n\r\n this.recognition.onend = () => {\r\n this._isListening = false;\r\n this.emit('end', { type: 'end' });\r\n };\r\n\r\n this.recognition.onresult = (event) => {\r\n const results = this.convertResults(event.results);\r\n this.emit('result', { type: 'result', result: results });\r\n };\r\n\r\n this.recognition.onerror = (event) => {\r\n const error = this.createError(event.error, this.getErrorMessage(event.error));\r\n this._isListening = false;\r\n this.emit('error', { type: 'error', error });\r\n\r\n // 如果还没启动就出错,reject Promise\r\n if (event.error === 'not-allowed' || event.error === 'no-speech') {\r\n reject(error);\r\n }\r\n };\r\n\r\n this.recognition.onsoundstart = () => {\r\n this.emit('soundstart', { type: 'soundstart' });\r\n };\r\n\r\n this.recognition.onsoundend = () => {\r\n this.emit('soundend', { type: 'soundend' });\r\n };\r\n\r\n this.recognition.onspeechstart = () => {\r\n this.emit('speechstart', { type: 'speechstart' });\r\n };\r\n\r\n this.recognition.onspeechend = () => {\r\n this.emit('speechend', { type: 'speechend' });\r\n };\r\n\r\n this.recognition.onaudiostart = () => {\r\n this.emit('audiostart', { type: 'audiostart' });\r\n };\r\n\r\n this.recognition.onaudioend = () => {\r\n this.emit('audioend', { type: 'audioend' });\r\n };\r\n\r\n this.recognition.onnomatch = () => {\r\n this.emit('nomatch', { type: 'nomatch' });\r\n };\r\n\r\n // 启动识别\r\n try {\r\n this.recognition.start();\r\n } catch (e) {\r\n const error = this.createError('START_ERROR', '启动语音识别失败', e as Error);\r\n reject(error);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 转换识别结果\r\n */\r\n private convertResults(results: BrowserSpeechRecognitionResultList): RecognitionResult {\r\n const items: RecognitionResultItem[] = [];\r\n let bestTranscript = '';\r\n let bestConfidence = 0;\r\n let isFinal = false;\r\n\r\n for (let i = 0; i < results.length; i++) {\r\n const result = results[i];\r\n if (!result) continue;\r\n isFinal = isFinal || result.isFinal;\r\n\r\n for (let j = 0; j < result.length; j++) {\r\n const alternative = result[j];\r\n if (!alternative) continue;\r\n items.push({\r\n transcript: alternative.transcript,\r\n confidence: alternative.confidence,\r\n isFinal: result.isFinal,\r\n });\r\n\r\n // 更新最佳结果\r\n if (alternative.confidence > bestConfidence) {\r\n bestConfidence = alternative.confidence;\r\n bestTranscript = alternative.transcript;\r\n }\r\n }\r\n }\r\n\r\n // 如果没有置信度信息,使用第一个结果\r\n if (bestTranscript === '' && items.length > 0) {\r\n const firstItem = items[0];\r\n if (firstItem) {\r\n bestTranscript = firstItem.transcript;\r\n bestConfidence = firstItem.confidence || 1;\r\n }\r\n }\r\n\r\n return {\r\n results: items,\r\n bestTranscript,\r\n bestConfidence,\r\n isFinal,\r\n };\r\n }\r\n\r\n /**\r\n * 获取错误消息\r\n */\r\n private getErrorMessage(errorCode: string): string {\r\n const errorMessages: Record<string, string> = {\r\n 'no-speech': '未检测到语音输入',\r\n 'audio-capture': '无法访问麦克风',\r\n 'not-allowed': '麦克风权限被拒绝',\r\n network: '网络错误',\r\n aborted: '识别被中止',\r\n 'language-not-supported': '不支持的语言',\r\n 'service-not-allowed': '语音服务不可用',\r\n 'bad-grammar': '语法错误',\r\n };\r\n return errorMessages[errorCode] || `语音识别错误: ${errorCode}`;\r\n }\r\n\r\n /**\r\n * 停止语音识别\r\n */\r\n stop(): void {\r\n if (this.recognition && this._isListening) {\r\n this.recognition.stop();\r\n }\r\n }\r\n\r\n /**\r\n * 中止语音识别\r\n */\r\n abort(): void {\r\n if (this.recognition) {\r\n this.recognition.abort();\r\n this._isListening = false;\r\n }\r\n }\r\n\r\n /**\r\n * 是否正在监听\r\n */\r\n isListening(): boolean {\r\n return this._isListening;\r\n }\r\n\r\n /**\r\n * 添加事件监听\r\n */\r\n on(event: RecognitionEventType, handler: RecognitionEventHandler): void {\r\n if (!this.eventHandlers.has(event)) {\r\n this.eventHandlers.set(event, new Set());\r\n }\r\n this.eventHandlers.get(event)!.add(handler);\r\n }\r\n\r\n /**\r\n * 移除事件监听\r\n */\r\n off(event: RecognitionEventType, handler: RecognitionEventHandler): void {\r\n this.eventHandlers.get(event)?.delete(handler);\r\n }\r\n\r\n /**\r\n * 触发事件\r\n */\r\n private emit(type: RecognitionEventType, event: RecognitionEvent): void {\r\n this.eventHandlers.get(type)?.forEach((handler) => {\r\n try {\r\n handler(event);\r\n } catch (e) {\r\n console.error('语音识别事件处理器错误:', e);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 创建错误对象\r\n */\r\n private createError(code: string, message: string, originalError?: Error): SpeechError {\r\n const result: SpeechError = { code, message };\r\n if (originalError) {\r\n result.originalError = originalError;\r\n }\r\n return result;\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// 语音识别器主类\r\n// ============================================================================\r\n\r\n/**\r\n * 语音识别器\r\n * 管理多个提供商,支持自动降级\r\n */\r\nexport class SpeechRecognizerImpl implements SpeechRecognizer {\r\n private _currentProvider: SpeechProviderType = 'browser';\r\n private _status: SpeechServiceStatus = 'idle';\r\n private provider: RecognitionProvider | null = null;\r\n private config: RecognitionConfig = {};\r\n private eventHandlers: Map<RecognitionEventType, Set<RecognitionEventHandler>> = new Map();\r\n private providers: Map<SpeechProviderType, RecognitionProvider> = new Map();\r\n\r\n /**\r\n * 当前使用的提供商类型\r\n */\r\n get currentProvider(): SpeechProviderType {\r\n return this._currentProvider;\r\n }\r\n\r\n /**\r\n * 服务状态\r\n */\r\n get status(): SpeechServiceStatus {\r\n return this._status;\r\n }\r\n\r\n /**\r\n * 初始化语音识别器\r\n * @param config - 识别配置\r\n */\r\n async initialize(config?: RecognitionConfig): Promise<void> {\r\n this._status = 'loading';\r\n this.config = {\r\n lang: 'zh-CN',\r\n continuous: false,\r\n interimResults: true,\r\n maxAlternatives: 1,\r\n preferredProvider: 'browser',\r\n autoFallback: true,\r\n fallbackProviders: ['azure', 'google', 'aws'],\r\n ...config,\r\n };\r\n\r\n try {\r\n // 注册浏览器提供商\r\n const browserProvider = new BrowserRecognitionProvider();\r\n this.providers.set('browser', browserProvider);\r\n\r\n // 尝试使用首选提供商\r\n const preferredProvider = this.config.preferredProvider || 'browser';\r\n if (await this.tryProvider(preferredProvider)) {\r\n this._status = 'ready';\r\n return;\r\n }\r\n\r\n // 如果首选提供商不可用且启用了自动降级\r\n if (this.config.autoFallback && this.config.fallbackProviders) {\r\n for (const providerType of this.config.fallbackProviders) {\r\n if (await this.tryProvider(providerType)) {\r\n this._status = 'ready';\r\n return;\r\n }\r\n }\r\n }\r\n\r\n // 所有提供商都不可用\r\n this._status = 'error';\r\n throw new Error('没有可用的语音识别提供商');\r\n } catch (error) {\r\n this._status = 'error';\r\n throw error;\r\n }\r\n }\r\n\r\n /**\r\n * 尝试使用指定提供商\r\n */\r\n private async tryProvider(type: SpeechProviderType): Promise<boolean> {\r\n const provider = this.providers.get(type);\r\n if (provider && provider.isAvailable()) {\r\n this.provider = provider;\r\n this._currentProvider = type;\r\n\r\n // 转发提供商事件\r\n this.forwardProviderEvents(provider);\r\n\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 转发提供商事件到识别器\r\n */\r\n private forwardProviderEvents(provider: RecognitionProvider): void {\r\n const events: RecognitionEventType[] = [\r\n 'start',\r\n 'end',\r\n 'result',\r\n 'error',\r\n 'soundstart',\r\n 'soundend',\r\n 'speechstart',\r\n 'speechend',\r\n 'audiostart',\r\n 'audioend',\r\n 'nomatch',\r\n ];\r\n events.forEach((event) => {\r\n provider.on(event, (e) => this.emit(event, e));\r\n });\r\n }\r\n\r\n /**\r\n * 开始语音识别\r\n * @param config - 可选的识别配置\r\n */\r\n async start(config?: RecognitionConfig): Promise<void> {\r\n if (!this.provider) {\r\n throw new Error('语音识别器未初始化');\r\n }\r\n\r\n const mergedConfig = { ...this.config, ...config };\r\n return this.provider.start(mergedConfig);\r\n }\r\n\r\n /**\r\n * 停止语音识别\r\n */\r\n stop(): void {\r\n this.provider?.stop();\r\n }\r\n\r\n /**\r\n * 中止语音识别\r\n */\r\n abort(): void {\r\n this.provider?.abort();\r\n }\r\n\r\n /**\r\n * 是否正在监听\r\n */\r\n isListening(): boolean {\r\n return this.provider?.isListening() ?? false;\r\n }\r\n\r\n /**\r\n * 添加事件监听\r\n */\r\n on(event: RecognitionEventType, handler: RecognitionEventHandler): void {\r\n if (!this.eventHandlers.has(event)) {\r\n this.eventHandlers.set(event, new Set());\r\n }\r\n this.eventHandlers.get(event)!.add(handler);\r\n }\r\n\r\n /**\r\n * 移除事件监听\r\n */\r\n off(event: RecognitionEventType, handler: RecognitionEventHandler): void {\r\n this.eventHandlers.get(event)?.delete(handler);\r\n }\r\n\r\n /**\r\n * 触发事件\r\n */\r\n private emit(type: RecognitionEventType, event: RecognitionEvent): void {\r\n this.eventHandlers.get(type)?.forEach((handler) => {\r\n try {\r\n handler(event);\r\n } catch (e) {\r\n console.error('语音识别事件处理器错误:', e);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * 销毁实例\r\n */\r\n dispose(): void {\r\n this.abort();\r\n this.eventHandlers.clear();\r\n this.provider = null;\r\n this._status = 'idle';\r\n }\r\n\r\n /**\r\n * 注册自定义提供商\r\n * @param type - 提供商类型\r\n * @param provider - 提供商实例\r\n */\r\n registerProvider(type: SpeechProviderType, provider: RecognitionProvider): void {\r\n this.providers.set(type, provider);\r\n }\r\n}\r\n\r\n// ============================================================================\r\n// 工厂函数\r\n// ============================================================================\r\n\r\n/**\r\n * 创建语音识别器实例\r\n * @param config - 可选的识别配置\r\n * @returns 语音识别器实例\r\n *\r\n * @example\r\n * ```typescript\r\n * // 创建并初始化语音识别器\r\n * const recognizer = await createSpeechRecognizer({\r\n * lang: 'zh-CN',\r\n * continuous: true,\r\n * interimResults: true,\r\n * });\r\n *\r\n * // 监听识别结果\r\n * recognizer.on('result', (event) => {\r\n * if (event.result) {\r\n * console.log('识别结果:', event.result.bestTranscript);\r\n * }\r\n * });\r\n *\r\n * // 开始识别\r\n * await recognizer.start();\r\n *\r\n * // 停止识别\r\n * recognizer.stop();\r\n *\r\n * // 销毁\r\n * recognizer.dispose();\r\n * ```\r\n */\r\nexport async function createSpeechRecognizer(\r\n config?: RecognitionConfig\r\n): Promise<SpeechRecognizer> {\r\n const recognizer = new SpeechRecognizerImpl();\r\n await recognizer.initialize(config);\r\n return recognizer;\r\n}\r\n\r\n/**\r\n * 检查当前环境是否支持语音识别\r\n * @returns 是否支持语音识别\r\n */\r\nexport function isSpeechRecognitionSupported(): boolean {\r\n return getSpeechRecognitionConstructor() !== null;\r\n}\r\n\r\n/**\r\n * 快速进行一次语音识别\r\n * @param config - 可选的识别配置\r\n * @returns 识别结果\r\n *\r\n * @example\r\n * ```typescript\r\n * // 进行一次语音识别\r\n * const result = await listen({ lang: 'zh-CN' });\r\n * console.log('识别结果:', result.bestTranscript);\r\n * ```\r\n */\r\nexport async function listen(config?: RecognitionConfig): Promise<RecognitionResult> {\r\n if (!isSpeechRecognitionSupported()) {\r\n throw new Error('当前环境不支持语音识别');\r\n }\r\n\r\n const recognizer = await createSpeechRecognizer({\r\n ...config,\r\n continuous: false,\r\n });\r\n\r\n return new Promise((resolve, reject) => {\r\n recognizer.on('result', (event) => {\r\n if (event.result && event.result.isFinal) {\r\n recognizer.dispose();\r\n resolve(event.result);\r\n }\r\n });\r\n\r\n recognizer.on('error', (event) => {\r\n recognizer.dispose();\r\n reject(event.error);\r\n });\r\n\r\n recognizer.on('end', () => {\r\n // 如果结束时还没有结果,返回空结果\r\n recognizer.dispose();\r\n resolve({\r\n results: [],\r\n bestTranscript: '',\r\n bestConfidence: 0,\r\n isFinal: true,\r\n });\r\n });\r\n\r\n recognizer.start().catch(reject);\r\n });\r\n}\r\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/fp/compose.ts","../src/fp/curry.ts","../src/fp/result.ts","../src/fp/option.ts","../src/fp/hof.ts"],"names":["__name"],"mappings":"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","file":"chunk-ZT6HVG4G.cjs","sourcesContent":["/**\r\n * @fileoverview 函数组合工具\r\n * @module melange/fp/compose\r\n * @description 提供组合和连接函数的工具,\r\n * 实现无点风格编程和函数链式调用。\r\n */\r\n\r\nimport type { UnaryFunction } from '../types';\r\n\r\n/**\r\n * 从右到左组合多个函数。\r\n * 最右边的函数可以接受多个参数,其他所有函数必须是一元的。\r\n *\r\n * @description\r\n * 函数组合是函数式编程中的基本概念。\r\n * `compose(f, g, h)(x)` 等价于 `f(g(h(x)))`。\r\n *\r\n * @example\r\n * ```typescript\r\n * const addOne = (x: number) => x + 1;\r\n * const double = (x: number) => x * 2;\r\n * const square = (x: number) => x * x;\r\n *\r\n * const composed = compose(square, double, addOne);\r\n * composed(2); // ((2 + 1) * 2)² = 36\r\n * ```\r\n *\r\n * @param fns - 要组合的函数\r\n * @returns 一个新函数,从右到左应用所有函数\r\n */\r\nexport function compose<A, B>(fn1: UnaryFunction<A, B>): UnaryFunction<A, B>;\r\nexport function compose<A, B, C>(\r\n fn2: UnaryFunction<B, C>,\r\n fn1: UnaryFunction<A, B>\r\n): UnaryFunction<A, C>;\r\nexport function compose<A, B, C, D>(\r\n fn3: UnaryFunction<C, D>,\r\n fn2: UnaryFunction<B, C>,\r\n fn1: UnaryFunction<A, B>\r\n): UnaryFunction<A, D>;\r\nexport function compose<A, B, C, D, E>(\r\n fn4: UnaryFunction<D, E>,\r\n fn3: UnaryFunction<C, D>,\r\n fn2: UnaryFunction<B, C>,\r\n fn1: UnaryFunction<A, B>\r\n): UnaryFunction<A, E>;\r\nexport function compose<A, B, C, D, E, F>(\r\n fn5: UnaryFunction<E, F>,\r\n fn4: UnaryFunction<D, E>,\r\n fn3: UnaryFunction<C, D>,\r\n fn2: UnaryFunction<B, C>,\r\n fn1: UnaryFunction<A, B>\r\n): UnaryFunction<A, F>;\r\nexport function compose(...fns: UnaryFunction<unknown, unknown>[]): UnaryFunction<unknown, unknown>;\r\n\r\nexport function compose(\r\n ...fns: UnaryFunction<unknown, unknown>[]\r\n): UnaryFunction<unknown, unknown> {\r\n if (fns.length === 0) {\r\n return (x: unknown) => x;\r\n }\r\n\r\n if (fns.length === 1) {\r\n return fns[0] as UnaryFunction<unknown, unknown>;\r\n }\r\n\r\n return fns.reduce(\r\n (composed, fn) => (x: unknown) => composed(fn(x))\r\n );\r\n}\r\n\r\n/**\r\n * 从左到右连接多个函数。\r\n * 第一个函数可以接受多个参数,其他所有函数必须是一元的。\r\n *\r\n * @description\r\n * Pipe 是 compose 的反向操作,从左到右应用函数。\r\n * `pipe(f, g, h)(x)` 等价于 `h(g(f(x)))`。\r\n * 这通常更易读,因为它遵循自然的阅读顺序。\r\n *\r\n * @example\r\n * ```typescript\r\n * const addOne = (x: number) => x + 1;\r\n * const double = (x: number) => x * 2;\r\n * const square = (x: number) => x * x;\r\n *\r\n * const piped = pipe(addOne, double, square);\r\n * piped(2); // ((2 + 1) * 2)² = 36\r\n * ```\r\n *\r\n * @param fns - 要连接的函数\r\n * @returns 一个新函数,从左到右应用所有函数\r\n */\r\nexport function pipe<A, B>(fn1: UnaryFunction<A, B>): UnaryFunction<A, B>;\r\nexport function pipe<A, B, C>(\r\n fn1: UnaryFunction<A, B>,\r\n fn2: UnaryFunction<B, C>\r\n): UnaryFunction<A, C>;\r\nexport function pipe<A, B, C, D>(\r\n fn1: UnaryFunction<A, B>,\r\n fn2: UnaryFunction<B, C>,\r\n fn3: UnaryFunction<C, D>\r\n): UnaryFunction<A, D>;\r\nexport function pipe<A, B, C, D, E>(\r\n fn1: UnaryFunction<A, B>,\r\n fn2: UnaryFunction<B, C>,\r\n fn3: UnaryFunction<C, D>,\r\n fn4: UnaryFunction<D, E>\r\n): UnaryFunction<A, E>;\r\nexport function pipe<A, B, C, D, E, F>(\r\n fn1: UnaryFunction<A, B>,\r\n fn2: UnaryFunction<B, C>,\r\n fn3: UnaryFunction<C, D>,\r\n fn4: UnaryFunction<D, E>,\r\n fn5: UnaryFunction<E, F>\r\n): UnaryFunction<A, F>;\r\nexport function pipe(...fns: UnaryFunction<unknown, unknown>[]): UnaryFunction<unknown, unknown>;\r\n\r\nexport function pipe(...fns: UnaryFunction<unknown, unknown>[]): UnaryFunction<unknown, unknown> {\r\n if (fns.length === 0) {\r\n return (x: unknown) => x;\r\n }\r\n\r\n if (fns.length === 1) {\r\n return fns[0] as UnaryFunction<unknown, unknown>;\r\n }\r\n\r\n return fns.reduce(\r\n (piped, fn) => (x: unknown) => fn(piped(x))\r\n );\r\n}\r\n\r\n/**\r\n * 创建函数流,类似于 pipe 但立即返回最终结果。\r\n * 适用于通过一系列函数转换值。\r\n *\r\n * @description\r\n * Flow 类似于 pipe,但不是返回函数,\r\n * 而是立即将值通过所有函数应用。\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = flow(\r\n * 5,\r\n * x => x + 1,\r\n * x => x * 2,\r\n * x => x.toString()\r\n * );\r\n * // result = \"12\"\r\n * ```\r\n *\r\n * @param value - 初始值\r\n * @param fns - 要应用的函数\r\n * @returns 将所有函数应用于值的结果\r\n */\r\nexport function flow<A>(value: A): A;\r\nexport function flow<A, B>(value: A, fn1: UnaryFunction<A, B>): B;\r\nexport function flow<A, B, C>(value: A, fn1: UnaryFunction<A, B>, fn2: UnaryFunction<B, C>): C;\r\nexport function flow<A, B, C, D>(\r\n value: A,\r\n fn1: UnaryFunction<A, B>,\r\n fn2: UnaryFunction<B, C>,\r\n fn3: UnaryFunction<C, D>\r\n): D;\r\nexport function flow<A, B, C, D, E>(\r\n value: A,\r\n fn1: UnaryFunction<A, B>,\r\n fn2: UnaryFunction<B, C>,\r\n fn3: UnaryFunction<C, D>,\r\n fn4: UnaryFunction<D, E>\r\n): E;\r\nexport function flow<A, B, C, D, E, F>(\r\n value: A,\r\n fn1: UnaryFunction<A, B>,\r\n fn2: UnaryFunction<B, C>,\r\n fn3: UnaryFunction<C, D>,\r\n fn4: UnaryFunction<D, E>,\r\n fn5: UnaryFunction<E, F>\r\n): F;\r\n\r\nexport function flow(value: unknown, ...fns: UnaryFunction<unknown, unknown>[]): unknown {\r\n return fns.reduce((acc, fn) => fn(acc), value);\r\n}\r\n","/**\n * @fileoverview 柯里化和部分应用工具\n * @module melange/fp/curry\n * @description 提供柯里化函数和部分应用的工具,\n * 实现更灵活的函数组合和重用。\n */\n\n/**\n * 柯里化二元函数。\n * 将接受两个参数的函数转换为接受一个参数并返回接受第二个参数的函数。\n *\n * @description\n * 柯里化以数学家 Haskell Curry 命名。它将具有多个参数的函数转换为一系列函数,每个函数接受一个参数。\n *\n * @example\n * ```typescript\n * const add = (a: number, b: number) => a + b;\n * const curriedAdd = curry(add);\n *\n * curriedAdd(1)(2); // 3\n * const addFive = curriedAdd(5);\n * addFive(10); // 15\n * ```\n *\n * @template A - 第一个参数的类型\n * @template B - 第二个参数的类型\n * @template R - 返回类型\n * @param fn - 要柯里化的二元函数\n * @returns 函数的柯里化版本\n */\nexport function curry<A, B, R>(fn: (a: A, b: B) => R): (a: A) => (b: B) => R;\n\n/**\n * 柯里化三元函数。\n *\n * @template A - 第一个参数的类型\n * @template B - 第二个参数的类型\n * @template C - 第三个参数的类型\n * @template R - 返回类型\n * @param fn - 要柯里化的三元函数\n * @returns 函数的柯里化版本\n */\nexport function curry<A, B, C, R>(\n fn: (a: A, b: B, c: C) => R\n): (a: A) => (b: B) => (c: C) => R;\n\n/**\n * 柯里化四元函数。\n *\n * @template A - 第一个参数的类型\n * @template B - 第二个参数的类型\n * @template C - 第三个参数的类型\n * @template D - 第四个参数的类型\n * @template R - 返回类型\n * @param fn - 要柯里化的四元函数\n * @returns 函数的柯里化版本\n */\nexport function curry<A, B, C, D, R>(\n fn: (a: A, b: B, c: C, d: D) => R\n): (a: A) => (b: B) => (c: C) => (d: D) => R;\n\nexport function curry(fn: (...args: unknown[]) => unknown): unknown {\n const arity = fn.length;\n\n function curried(...args: unknown[]): unknown {\n if (args.length >= arity) {\n return fn(...args);\n }\n return (...moreArgs: unknown[]) => curried(...args, ...moreArgs);\n }\n\n return curried;\n}\n\n/**\n * 反柯里化函数。\n * 将一元函数序列转换回接受多个参数的单个函数。\n *\n * @example\n * ```typescript\n * const curriedAdd = (a: number) => (b: number) => a + b;\n * const add = uncurry(curriedAdd);\n *\n * add(1, 2); // 3\n * ```\n *\n * @template A - 第一个参数的类型\n * @template B - 第二个参数的类型\n * @template R - 返回类型\n * @param fn - 要反柯里化的函数\n * @returns 函数的反柯里化版本\n */\nexport function uncurry<A, B, R>(fn: (a: A) => (b: B) => R): (a: A, b: B) => R;\nexport function uncurry<A, B, C, R>(\n fn: (a: A) => (b: B) => (c: C) => R\n): (a: A, b: B, c: C) => R;\n\nexport function uncurry(fn: (a: unknown) => unknown): (...args: unknown[]) => unknown {\n return (...args: unknown[]) => {\n let result: unknown = fn;\n for (const arg of args) {\n result = (result as (a: unknown) => unknown)(arg);\n }\n return result;\n };\n}\n\n/**\n * 从左侧部分应用参数到函数。\n * 返回一个接受剩余参数的新函数。\n *\n * @description\n * 部分应用不同于柯里化。柯里化将函数转换为一元函数序列,\n * 而部分应用固定一些参数并返回接受剩余参数的函数。\n *\n * @example\n * ```typescript\n * const greet = (greeting: string, name: string, punctuation: string) =>\n * `${greeting}, ${name}${punctuation}`;\n *\n * const sayHello = partial(greet, 'Hello');\n * sayHello('World', '!'); // \"Hello, World!\"\n *\n * const sayHelloWorld = partial(greet, 'Hello', 'World');\n * sayHelloWorld('!'); // \"Hello, World!\"\n * ```\n *\n * @template T - 部分参数的元组类型\n * @template R - 剩余参数的元组类型\n * @template Result - 返回类型\n * @param fn - 要部分应用的函数\n * @param partialArgs - 要固定的参数\n * @returns 接受剩余参数的新函数\n */\nexport function partial<T extends unknown[], R extends unknown[], Result>(\n fn: (...args: [...T, ...R]) => Result,\n ...partialArgs: T\n): (...remainingArgs: R) => Result {\n return (...remainingArgs: R): Result => fn(...partialArgs, ...remainingArgs);\n}\n\n/**\n * 从右侧部分应用参数到函数。\n * 返回一个接受剩余参数的新函数。\n *\n * @example\n * ```typescript\n * const greet = (greeting: string, name: string, punctuation: string) =>\n * `${greeting}, ${name}${punctuation}`;\n *\n * const greetExcitedly = partialRight(greet, '!');\n * greetExcitedly('Hello', 'World'); // \"Hello, World!\"\n * ```\n *\n * @template L - 前导参数的元组类型\n * @template T - 部分参数的元组类型\n * @template Result - 返回类型\n * @param fn - 要部分应用的函数\n * @param partialArgs - 从右侧固定的参数\n * @returns 接受前导参数的新函数\n */\nexport function partialRight<L extends unknown[], T extends unknown[], Result>(\n fn: (...args: [...L, ...T]) => Result,\n ...partialArgs: T\n): (...leadingArgs: L) => Result {\n return (...leadingArgs: L): Result => fn(...leadingArgs, ...partialArgs);\n}\n","/**\r\n * @fileoverview 用于函数式错误处理的 Result 类型\r\n * @module melange/fp/result\r\n * @description 提供 Result 类型和工具,用于处理可能成功或失败的操作,\r\n * 而无需抛出异常。\r\n */\r\n\r\nimport type { Result, Ok, Err, UnaryFunction } from '../types';\r\n\r\n/**\r\n * 创建包含给定值的成功 Result。\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = ok(42);\r\n * // { _tag: 'Ok', value: 42 }\r\n * ```\r\n *\r\n * @template T - 成功值的类型\r\n * @param value - 成功值\r\n * @returns 包含该值的 Ok Result\r\n */\r\nexport function ok<T>(value: T): Ok<T> {\r\n return { _tag: 'Ok', value };\r\n}\r\n\r\n/**\r\n * 创建包含给定错误的失败 Result。\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = err(new Error('出错了'));\r\n * // { _tag: 'Err', error: Error('出错了') }\r\n * ```\r\n *\r\n * @template E - 错误的类型\r\n * @param error - 错误值\r\n * @returns 包含该错误的 Err Result\r\n */\r\nexport function err<E>(error: E): Err<E> {\r\n return { _tag: 'Err', error };\r\n}\r\n\r\n/**\r\n * 类型守卫,用于检查 Result 是否为 Ok。\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = ok(42);\r\n * if (isOk(result)) {\r\n * console.log(result.value); // 42\r\n * }\r\n * ```\r\n *\r\n * @template T - 成功类型\r\n * @template E - 错误类型\r\n * @param result - 要检查的 Result\r\n * @returns 如果 Result 是 Ok 则返回 true\r\n */\r\nexport function isOk<T, E>(result: Result<T, E>): result is Ok<T> {\r\n return result._tag === 'Ok';\r\n}\r\n\r\n/**\r\n * 类型守卫,用于检查 Result 是否为 Err。\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = err('error');\r\n * if (isErr(result)) {\r\n * console.log(result.error); // 'error'\r\n * }\r\n * ```\r\n *\r\n * @template T - 成功类型\r\n * @template E - 错误类型\r\n * @param result - 要检查的 Result\r\n * @returns 如果 Result 是 Err 则返回 true\r\n */\r\nexport function isErr<T, E>(result: Result<T, E>): result is Err<E> {\r\n return result._tag === 'Err';\r\n}\r\n\r\n/**\r\n * 在 Result 的成功值上映射函数。\r\n * 如果 Result 是 Err,则错误将原样传递。\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = ok(5);\r\n * const doubled = mapResult(result, x => x * 2);\r\n * // { _tag: 'Ok', value: 10 }\r\n *\r\n * const error = err('error');\r\n * const still = mapResult(error, x => x * 2);\r\n * // { _tag: 'Err', error: 'error' }\r\n * ```\r\n *\r\n * @template T - 原始成功类型\r\n * @template U - 映射后的成功类型\r\n * @template E - 错误类型\r\n * @param result - 要映射的 Result\r\n * @param fn - 要应用于成功值的函数\r\n * @returns 带有映射值的新 Result\r\n */\r\nexport function mapResult<T, U, E>(\r\n result: Result<T, E>,\r\n fn: UnaryFunction<T, U>\r\n): Result<U, E> {\r\n if (isOk(result)) {\r\n return ok(fn(result.value));\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * 在 Result 的成功值上映射返回 Result 的函数。\r\n * 在其他库中这也被称为 `chain` 或 `bind`。\r\n *\r\n * @example\r\n * ```typescript\r\n * const safeDivide = (a: number, b: number): Result<number, string> =>\r\n * b === 0 ? err('除零错误') : ok(a / b);\r\n *\r\n * const result = ok(10);\r\n * const divided = flatMapResult(result, x => safeDivide(x, 2));\r\n * // { _tag: 'Ok', value: 5 }\r\n *\r\n * const divideByZero = flatMapResult(result, x => safeDivide(x, 0));\r\n * // { _tag: 'Err', error: '除零错误' }\r\n * ```\r\n *\r\n * @template T - 原始成功类型\r\n * @template U - 映射后的成功类型\r\n * @template E - 错误类型\r\n * @param result - 要 flatMap 的 Result\r\n * @param fn - 应用的返回 Result 的函数\r\n * @returns 展平后的 Result\r\n */\r\nexport function flatMapResult<T, U, E>(\r\n result: Result<T, E>,\r\n fn: UnaryFunction<T, Result<U, E>>\r\n): Result<U, E> {\r\n if (isOk(result)) {\r\n return fn(result.value);\r\n }\r\n return result;\r\n}\r\n\r\n/**\r\n * 解包 Result,返回成功值或如果为 Err 则返回默认值。\r\n *\r\n * @example\r\n * ```typescript\r\n * const success = ok(42);\r\n * unwrapOr(success, 0); // 42\r\n *\r\n * const failure = err('error');\r\n * unwrapOr(failure, 0); // 0\r\n * ```\r\n *\r\n * @template T - 成功类型\r\n * @template E - 错误类型\r\n * @param result - 要解包的 Result\r\n * @param defaultValue - 如果为 Err 的默认值\r\n * @returns 成功值或默认值\r\n */\r\nexport function unwrapOr<T, E>(result: Result<T, E>, defaultValue: T): T {\r\n if (isOk(result)) {\r\n return result.value;\r\n }\r\n return defaultValue;\r\n}\r\n\r\n/**\r\n * 解包 Result,返回成功值或如果为 Err 则调用函数。\r\n *\r\n * @example\r\n * ```typescript\r\n * const success = ok(42);\r\n * unwrapOrElse(success, () => 0); // 42\r\n *\r\n * const failure = err('error');\r\n * unwrapOrElse(failure, () => 0); // 0\r\n * ```\r\n *\r\n * @template T - 成功类型\r\n * @template E - 错误类型\r\n * @param result - 要解包的 Result\r\n * @param fn - 如果为 Err 要调用的函数\r\n * @returns 成功值或函数的结果\r\n */\r\nexport function unwrapOrElse<T, E>(\r\n result: Result<T, E>,\r\n fn: UnaryFunction<E, T>\r\n): T {\r\n if (isOk(result)) {\r\n return result.value;\r\n }\r\n return fn(result.error);\r\n}\r\n\r\n/**\r\n * 将 Result 与成功和错误处理程序匹配。\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = ok(42);\r\n * const message = match(result, {\r\n * ok: value => `得到 ${value}`,\r\n * err: error => `错误: ${error}`\r\n * });\r\n * // \"得到 42\"\r\n * ```\r\n *\r\n * @template T - 成功类型\r\n * @template E - 错误类型\r\n * @template R - 返回类型\r\n * @param result - 要匹配的 Result\r\n * @param handlers - 带有 ok 和 err 处理程序的对象\r\n * @returns 匹配处理程序的结果\r\n */\r\nexport function matchResult<T, E, R>(\r\n result: Result<T, E>,\r\n handlers: { ok: UnaryFunction<T, R>; err: UnaryFunction<E, R> }\r\n): R {\r\n if (isOk(result)) {\r\n return handlers.ok(result.value);\r\n }\r\n return handlers.err(result.error);\r\n}\r\n\r\n/**\r\n * 尝试执行函数并将结果包装在 Result 类型中。\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = tryCatch(() => JSON.parse('{\"a\": 1}'));\r\n * // { _tag: 'Ok', value: { a: 1 } }\r\n *\r\n * const error = tryCatch(() => JSON.parse('invalid'));\r\n * // { _tag: 'Err', error: SyntaxError(...) }\r\n * ```\r\n *\r\n * @template T - 函数的返回类型\r\n * @param fn - 要执行的函数\r\n * @returns 包含返回值或错误的 Result\r\n */\r\nexport function tryCatch<T>(fn: () => T): Result<T, unknown> {\r\n try {\r\n return ok(fn());\r\n } catch (error) {\r\n return err(error);\r\n }\r\n}\r\n\r\n/**\r\n * 尝试执行异步函数并将结果包装在 Result 类型中。\r\n *\r\n * @example\r\n * ```typescript\r\n * const result = await tryCatchAsync(async () => {\r\n * const response = await fetch('/api/data');\r\n * return response.json();\r\n * });\r\n * ```\r\n *\r\n * @template T - 异步函数的返回类型\r\n * @param fn - 要执行的异步函数\r\n * @returns 包含返回值或错误的 Result 的 Promise\r\n */\r\nexport async function tryCatchAsync<T>(\r\n fn: () => Promise<T>\r\n): Promise<Result<T, unknown>> {\r\n try {\r\n const result = await fn();\r\n return ok(result);\r\n } catch (error) {\r\n return err(error);\r\n }\r\n}\r\n","/**\r\n * @fileoverview 用于可空值处理的 Option 类型\r\n * @module melange/fp/option\r\n * @description 提供 Option 类型和工具,用于处理可能存在或不存在的值,\r\n * 而不直接使用 null/undefined。\r\n */\r\n\r\nimport type { Option, Some, None, UnaryFunction } from '../types';\r\n\r\n/**\r\n * 创建包含给定值的 Some Option。\r\n *\r\n * @example\r\n * ```typescript\r\n * const option = some(42);\r\n * // { _tag: 'Some', value: 42 }\r\n * ```\r\n *\r\n * @template T - 值的类型\r\n * @param value - 要包装的值\r\n * @returns 包含该值的 Some Option\r\n */\r\nexport function some<T>(value: T): Some<T> {\r\n return { _tag: 'Some', value };\r\n}\r\n\r\n/**\r\n * 创建表示缺失值的 None Option。\r\n *\r\n * @example\r\n * ```typescript\r\n * const option = none();\r\n * // { _tag: 'None' }\r\n * ```\r\n *\r\n * @returns None Option\r\n */\r\nexport function none(): None {\r\n return { _tag: 'None' };\r\n}\r\n\r\n/**\r\n * 类型守卫,用于检查 Option 是否为 Some。\r\n *\r\n * @example\r\n * ```typescript\r\n * const option = some(42);\r\n * if (isSome(option)) {\r\n * console.log(option.value); // 42\r\n * }\r\n * ```\r\n *\r\n * @template T - 值的类型\r\n * @param option - 要检查的 Option\r\n * @returns 如果 Option 是 Some 则返回 true\r\n */\r\nexport function isSome<T>(option: Option<T>): option is Some<T> {\r\n return option._tag === 'Some';\r\n}\r\n\r\n/**\r\n * 类型守卫,用于检查 Option 是否为 None。\r\n *\r\n * @example\r\n * ```typescript\r\n * const option = none();\r\n * if (isNone(option)) {\r\n * console.log('无值');\r\n * }\r\n * ```\r\n *\r\n * @template T - 值的类型\r\n * @param option - 要检查的 Option\r\n * @returns 如果 Option 是 None 则返回 true\r\n */\r\nexport function isNone<T>(option: Option<T>): option is None {\r\n return option._tag === 'None';\r\n}\r\n\r\n/**\r\n * 从可空值创建 Option。\r\n * 如果值为 null 或 undefined,返回 None;否则返回 Some。\r\n *\r\n * @example\r\n * ```typescript\r\n * fromNullable(42); // Some(42)\r\n * fromNullable(null); // None\r\n * fromNullable(undefined);// None\r\n * ```\r\n *\r\n * @template T - 值的类型\r\n * @param value - 可空值\r\n * @returns 包装该值的 Option\r\n */\r\nexport function fromNullable<T>(value: T | null | undefined): Option<T> {\r\n return value == null ? none() : some(value);\r\n}\r\n\r\n/**\r\n * 在 Option 的值上映射函数。\r\n * 如果 Option 是 None,则原样返回 None。\r\n *\r\n * @example\r\n * ```typescript\r\n * const option = some(5);\r\n * const doubled = mapOption(option, x => x * 2);\r\n * // Some(10)\r\n *\r\n * const empty = none();\r\n * const still = mapOption(empty, x => x * 2);\r\n * // None\r\n * ```\r\n *\r\n * @template T - 原始值类型\r\n * @template U - 映射后的值类型\r\n * @param option - 要映射的 Option\r\n * @param fn - 要应用于值的函数\r\n * @returns 带有映射值的新 Option\r\n */\r\nexport function mapOption<T, U>(\r\n option: Option<T>,\r\n fn: UnaryFunction<T, U>\r\n): Option<U> {\r\n if (isSome(option)) {\r\n return some(fn(option.value));\r\n }\r\n return option;\r\n}\r\n\r\n/**\r\n * 在 Option 的值上映射返回 Option 的函数。\r\n * 在其他库中这也被称为 `chain` 或 `bind`。\r\n *\r\n * @example\r\n * ```typescript\r\n * const safeDivide = (n: number): Option<number> =>\r\n * n === 0 ? none() : some(100 / n);\r\n *\r\n * const option = some(10);\r\n * const divided = flatMapOption(option, safeDivide);\r\n * // Some(10)\r\n *\r\n * const zero = some(0);\r\n * const divideByZero = flatMapOption(zero, safeDivide);\r\n * // None\r\n * ```\r\n *\r\n * @template T - 原始值类型\r\n * @template U - 映射后的值类型\r\n * @param option - 要 flatMap 的 Option\r\n * @param fn - 应用的返回 Option 的函数\r\n * @returns 展平后的 Option\r\n */\r\nexport function flatMapOption<T, U>(\r\n option: Option<T>,\r\n fn: UnaryFunction<T, Option<U>>\r\n): Option<U> {\r\n if (isSome(option)) {\r\n return fn(option.value);\r\n }\r\n return option;\r\n}\r\n\r\n/**\r\n * 从 Option 获取值,如果为 None 则返回默认值。\r\n *\r\n * @example\r\n * ```typescript\r\n * const present = some(42);\r\n * getOrElse(present, 0); // 42\r\n *\r\n * const absent = none();\r\n * getOrElse(absent, 0); // 0\r\n * ```\r\n *\r\n * @template T - 值的类型\r\n * @param option - 要解包的 Option\r\n * @param defaultValue - 如果为 None 的默认值\r\n * @returns 值或默认值\r\n */\r\nexport function getOrElse<T>(option: Option<T>, defaultValue: T): T {\r\n if (isSome(option)) {\r\n return option.value;\r\n }\r\n return defaultValue;\r\n}\r\n\r\n/**\r\n * 从 Option 获取值,如果为 None 则调用函数。\r\n *\r\n * @example\r\n * ```typescript\r\n * const present = some(42);\r\n * getOrElseL(present, () => 0); // 42\r\n *\r\n * const absent = none();\r\n * getOrElseL(absent, () => computeDefault()); // computeDefault() 的结果\r\n * ```\r\n *\r\n * @template T - 值的类型\r\n * @param option - 要解包的 Option\r\n * @param fn - 如果为 None 要调用的函数\r\n * @returns 值或函数的结果\r\n */\r\nexport function getOrElseL<T>(option: Option<T>, fn: () => T): T {\r\n if (isSome(option)) {\r\n return option.value;\r\n }\r\n return fn();\r\n}\r\n\r\n/**\r\n * 将 Option 与 Some 和 None 处理程序匹配。\r\n *\r\n * @example\r\n * ```typescript\r\n * const option = some(42);\r\n * const message = matchOption(option, {\r\n * some: value => `得到 ${value}`,\r\n * none: () => '无'\r\n * });\r\n * // \"得到 42\"\r\n * ```\r\n *\r\n * @template T - 值的类型\r\n * @template R - 返回类型\r\n * @param option - 要匹配的 Option\r\n * @param handlers - 带有 some 和 none 处理程序的对象\r\n * @returns 匹配处理程序的结果\r\n */\r\nexport function matchOption<T, R>(\r\n option: Option<T>,\r\n handlers: { some: UnaryFunction<T, R>; none: () => R }\r\n): R {\r\n if (isSome(option)) {\r\n return handlers.some(option.value);\r\n }\r\n return handlers.none();\r\n}\r\n\r\n/**\r\n * 将 Option 转换为可空值。\r\n *\r\n * @example\r\n * ```typescript\r\n * toNullable(some(42)); // 42\r\n * toNullable(none()); // null\r\n * ```\r\n *\r\n * @template T - 值的类型\r\n * @param option - 要转换的 Option\r\n * @returns 值或 null\r\n */\r\nexport function toNullable<T>(option: Option<T>): T | null {\r\n if (isSome(option)) {\r\n return option.value;\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * 基于谓词过滤 Option。\r\n * 如果 Option 是 Some 且谓词返回 false,则返回 None。\r\n *\r\n * @example\r\n * ```typescript\r\n * const option = some(10);\r\n * filter(option, x => x > 5); // Some(10)\r\n * filter(option, x => x > 15); // None\r\n * ```\r\n *\r\n * @template T - 值的类型\r\n * @param option - 要过滤的 Option\r\n * @param predicate - 谓词函数\r\n * @returns 如果谓词通过则返回 Option,否则返回 None\r\n */\r\nexport function filterOption<T>(\r\n option: Option<T>,\r\n predicate: (value: T) => boolean\r\n): Option<T> {\r\n if (isSome(option) && predicate(option.value)) {\r\n return option;\r\n }\r\n return none();\r\n}\r\n\r\n/**\r\n * 返回第一个为 Some 的 Option,如果都是 None 则返回 None。\r\n *\r\n * @example\r\n * ```typescript\r\n * alt(none(), some(42)); // Some(42)\r\n * alt(some(1), some(2)); // Some(1)\r\n * alt(none(), none()); // None\r\n * ```\r\n *\r\n * @template T - 值的类型\r\n * @param first - 第一个 Option\r\n * @param second - 第二个 Option\r\n * @returns 第一个 Some Option,或 None\r\n */\r\nexport function alt<T>(first: Option<T>, second: Option<T>): Option<T> {\r\n return isSome(first) ? first : second;\r\n}\r\n","/**\r\n * @fileoverview 高阶函数和工具\r\n * @module melange/fp/hof\r\n * @description 提供高阶函数用于记忆化、函数控制\r\n * 和其他函数式编程工具。\r\n */\r\n\r\nimport type { AnyFunction } from '../types';\r\n\r\n/**\r\n * 创建函数的记忆化版本。\r\n * 记忆化函数根据提供的参数缓存结果。\r\n *\r\n * @description\r\n * 记忆化是一种优化技术,存储昂贵函数调用的结果,\r\n * 当相同输入再次出现时返回缓存结果。\r\n *\r\n * @example\r\n * ```typescript\r\n * const expensiveCalculation = (n: number) => {\r\n * console.log('计算中...');\r\n * return n * n;\r\n * };\r\n *\r\n * const memoized = memoize(expensiveCalculation);\r\n * memoized(5); // 记录 '计算中...', 返回 25\r\n * memoized(5); // 从缓存返回 25, 无记录\r\n * memoized(3); // 记录 '计算中...', 返回 9\r\n * ```\r\n *\r\n * @template T - 函数类型\r\n * @param fn - 要记忆化的函数\r\n * @param keyFn - 生成缓存键的可选函数\r\n * @returns 函数的记忆化版本\r\n */\r\nexport function memoize<T extends AnyFunction>(\r\n fn: T,\r\n keyFn?: (...args: Parameters<T>) => string\r\n): T {\r\n const cache = new Map<string, ReturnType<T>>();\r\n\r\n return ((...args: Parameters<T>): ReturnType<T> => {\r\n const key = keyFn ? keyFn(...args) : JSON.stringify(args);\r\n\r\n if (cache.has(key)) {\r\n return cache.get(key) as ReturnType<T>;\r\n }\r\n\r\n const result = fn(...args) as ReturnType<T>;\r\n cache.set(key, result);\r\n return result;\r\n }) as T;\r\n}\r\n\r\n/**\r\n * 创建只能调用一次的函数。\r\n * 后续调用返回第一次调用的结果。\r\n *\r\n * @example\r\n * ```typescript\r\n * const initialize = once(() => {\r\n * console.log('初始化中...');\r\n * return { initialized: true };\r\n * });\r\n *\r\n * initialize(); // 记录 '初始化中...', 返回 { initialized: true }\r\n * initialize(); // 返回 { initialized: true }, 无记录\r\n * ```\r\n *\r\n * @template T - 函数类型\r\n * @param fn - 要包装的函数\r\n * @returns 只能调用一次的函数\r\n */\r\nexport function once<T extends AnyFunction>(fn: T): T {\r\n let called = false;\r\n let result: ReturnType<T>;\r\n\r\n return ((...args: Parameters<T>): ReturnType<T> => {\r\n if (!called) {\r\n called = true;\r\n result = fn(...args) as ReturnType<T>;\r\n }\r\n return result;\r\n }) as T;\r\n}\r\n\r\n/**\r\n * 创建调用原始函数然后执行副作用的函数,返回原始结果。\r\n *\r\n * @description\r\n * Tap 适用于在管道中调试或记录日志\r\n * 而不影响数据流。\r\n *\r\n * @example\r\n * ```typescript\r\n * const addOne = (x: number) => x + 1;\r\n * const logValue = tap((x: number) => console.log('值:', x));\r\n *\r\n * pipe(\r\n * 5,\r\n * addOne,\r\n * logValue, // 记录 '值: 6', 返回 6\r\n * x => x * 2\r\n * ); // 返回 12\r\n * ```\r\n *\r\n * @template T - 值类型\r\n * @param effect - 要执行的副作用函数\r\n * @returns 执行副作用并返回输入的函数\r\n */\r\nexport function tap<T>(effect: (value: T) => void): (value: T) => T {\r\n return (value: T): T => {\r\n effect(value);\r\n return value;\r\n };\r\n}\r\n\r\n/**\r\n * 返回传入的值而不改变。\r\n * 恒等函数作为默认转换器很有用。\r\n *\r\n * @example\r\n * ```typescript\r\n * identity(42); // 42\r\n * identity('hello'); // 'hello'\r\n * [1, 2, 3].map(identity); // [1, 2, 3]\r\n * ```\r\n *\r\n * @template T - 值类型\r\n * @param value - 要返回的值\r\n * @returns 相同的值\r\n */\r\nexport function identity<T>(value: T): T {\r\n return value;\r\n}\r\n\r\n/**\r\n * 创建总是返回相同值的函数。\r\n * 适用于创建占位符函数。\r\n *\r\n * @example\r\n * ```typescript\r\n * const alwaysFive = constant(5);\r\n * alwaysFive(); // 5\r\n * alwaysFive(100); // 5\r\n *\r\n * [1, 2, 3].map(constant('x')); // ['x', 'x', 'x']\r\n * ```\r\n *\r\n * @template T - 值类型\r\n * @param value - 总是返回的值\r\n * @returns 总是返回值的函数\r\n */\r\nexport function constant<T>(value: T): () => T {\r\n return () => value;\r\n}\r\n\r\n/**\r\n * 不执行任何操作并返回 undefined 的函数。\r\n * 适合作为默认回调或占位符。\r\n *\r\n * @example\r\n * ```typescript\r\n * const callback = maybeCallback || noop;\r\n * callback();\r\n * ```\r\n */\r\nexport function noop(): void {\r\n // 故意为空\r\n}\r\n\r\n/**\r\n * 否定谓词函数。\r\n *\r\n * @example\r\n * ```typescript\r\n * const isEven = (n: number) => n % 2 === 0;\r\n * const isOdd = not(isEven);\r\n *\r\n * isOdd(3); // true\r\n * isOdd(4); // false\r\n * ```\r\n *\r\n * @template T - 参数类型\r\n * @param predicate - 要否定的谓词\r\n * @returns 否定的谓词\r\n */\r\nexport function not<T>(predicate: (value: T) => boolean): (value: T) => boolean {\r\n return (value: T) => !predicate(value);\r\n}\r\n\r\n/**\r\n * 创建当所有谓词都返回 true 时返回 true 的函数。\r\n *\r\n * @example\r\n * ```typescript\r\n * const isPositive = (n: number) => n > 0;\r\n * const isEven = (n: number) => n % 2 === 0;\r\n * const isPositiveEven = allPass([isPositive, isEven]);\r\n *\r\n * isPositiveEven(4); // true\r\n * isPositiveEven(-4); // false\r\n * isPositiveEven(3); // false\r\n * ```\r\n *\r\n * @template T - 参数类型\r\n * @param predicates - 要检查的谓词数组\r\n * @returns 当所有谓词都通过时返回 true 的函数\r\n */\r\nexport function allPass<T>(\r\n predicates: Array<(value: T) => boolean>\r\n): (value: T) => boolean {\r\n return (value: T) => predicates.every(predicate => predicate(value));\r\n}\r\n\r\n/**\r\n * 创建当任何谓词返回 true 时返回 true 的函数。\r\n *\r\n * @example\r\n * ```typescript\r\n * const isZero = (n: number) => n === 0;\r\n * const isNegative = (n: number) => n < 0;\r\n * const isNotPositive = anyPass([isZero, isNegative]);\r\n *\r\n * isNotPositive(0); // true\r\n * isNotPositive(-1); // true\r\n * isNotPositive(1); // false\r\n * ```\r\n *\r\n * @template T - 参数类型\r\n * @param predicates - 要检查的谓词数组\r\n * @returns 当任何谓词通过时返回 true 的函数\r\n */\r\nexport function anyPass<T>(\r\n predicates: Array<(value: T) => boolean>\r\n): (value: T) => boolean {\r\n return (value: T) => predicates.some(predicate => predicate(value));\r\n}\r\n\r\n/**\r\n * 翻转二元函数的参数。\r\n *\r\n * @example\r\n * ```typescript\r\n * const divide = (a: number, b: number) => a / b;\r\n * const flippedDivide = flip(divide);\r\n *\r\n * divide(10, 2); // 5\r\n * flippedDivide(10, 2); // 0.2\r\n * ```\r\n *\r\n * @template A - 第一个参数类型\r\n * @template B - 第二个参数类型\r\n * @template R - 返回类型\r\n * @param fn - 要翻转的函数\r\n * @returns 参数翻转后的函数\r\n */\r\nexport function flip<A, B, R>(fn: (a: A, b: B) => R): (b: B, a: A) => R {\r\n return (b: B, a: A) => fn(a, b);\r\n}\r\n\r\n/**\r\n * 将值应用到函数。\r\n * 适用于无点编程。\r\n *\r\n * @example\r\n * ```typescript\r\n * const addOne = (x: number) => x + 1;\r\n * apply(5, addOne); // 6\r\n *\r\n * const funcs = [x => x + 1, x => x * 2];\r\n * funcs.map(f => apply(5, f)); // [6, 10]\r\n * ```\r\n *\r\n * @template T - 值类型\r\n * @template R - 返回类型\r\n * @param value - 要应用的值\r\n * @param fn - 要应用的函数\r\n * @returns 将值应用到函数的结果\r\n */\r\nexport function apply<T, R>(value: T, fn: (value: T) => R): R {\r\n return fn(value);\r\n}\r\n\r\n/**\r\n * 从值创建 thunk(延迟计算)。\r\n *\r\n * @example\r\n * ```typescript\r\n * const lazyValue = thunk(expensiveComputation);\r\n * // ... 稍后\r\n * const result = lazyValue(); // 计算在此处发生\r\n * ```\r\n *\r\n * @template T - 返回类型\r\n * @param fn - 要延迟的函数\r\n * @returns 调用时执行函数的 thunk\r\n */\r\nexport function thunk<T>(fn: () => T): () => T {\r\n return fn;\r\n}\r\n\r\n/**\r\n * 反转布尔值。\r\n *\r\n * @example\r\n * ```typescript\r\n * invert(true); // false\r\n * invert(false); // true\r\n * ```\r\n *\r\n * @param value - 要反转的布尔值\r\n * @returns 反转后的布尔值\r\n */\r\nexport function invert(value: boolean): boolean {\r\n return !value;\r\n}\r\n"]}
|