11# ReactiveX for MoonBit
22
33[ ![ License: MIT] ( https://img.shields.io/badge/License-MIT-yellow.svg )] ( https://opensource.org/licenses/MIT )
4- [ ![ codecov] ( https://codecov.io/gh/CGaaaaaa/reactivex/branch/main/graph/badge.svg )] ( https://codecov.io/gh/CGaaaaaa/reactivex )
54[ ![ Tests Passing] ( https://img.shields.io/badge/Tests-Passing-brightgreen.svg )] ( src/test.mbt )
65
7- Reactive Extensions for MoonBit - 用于 MoonBit 编程语言的响应式编程库。
6+ English | [ 中文 ] ( README_zh_CN.md )
87
9- ## 概述
8+ Reactive Extensions for MoonBit - A comprehensive reactive programming library for the MoonBit language.
109
11- ReactiveX for MoonBit 是一个轻量级的响应式编程库,提供了 Observable 序列和操作符,用于组合异步和基于事件的程序。
10+ ## Overview
1211
13- ## 特性
12+ ReactiveX for MoonBit is a feature-complete reactive programming library that provides Observable sequences and rich operators for composing asynchronous and event-based programs. Based on the ReactiveX specification, it brings powerful reactive programming capabilities to the MoonBit language.
1413
15- - ✅ 核心类型:` Observable[T] ` , ` Observer[T] ` , ` BasicSubscription `
16- - ✅ 创建操作符:` of ` , ` from_array ` , ` empty ` , ` never ` , ` error `
17- - ✅ 转换操作符:` map ` , ` filter ` , ` take ` , ` skip ` , ` scan ` , ` reduce `
18- - ✅ 类型安全的泛型支持
19- - ✅ 内存安全的订阅管理
14+ ## Features
2015
21- ## 快速开始
16+ ### 🔧 Core Components
17+ - ✅ ** Core Types** : ` Observable[T] ` , ` Observer[T] ` , ` BasicSubscription `
18+ - ✅ ** Error Handling** : ` RxError ` enum type with type-safe error management
19+ - ✅ ** Subscription Management** : Memory-safe subscription lifecycle management
2220
23- ### 安装
21+ ### 🚀 Creation Operators (5)
22+ - ✅ ` of ` - Create Observable from a single value
23+ - ✅ ` from_array ` - Create Observable from an array
24+ - ✅ ` empty ` - Create empty sequence
25+ - ✅ ` never ` - Create Observable that never emits
26+ - ✅ ` error ` / ` error_with_type ` - Create error Observable
2427
25- 将此库添加到您的 ` moon.mod.json ` 依赖中:
28+ ### 🔄 Transformation Operators (6)
29+ - ✅ ` map ` - Transform values
30+ - ✅ ` filter ` - Filter by predicate
31+ - ✅ ` take ` - Take first N values
32+ - ✅ ` skip ` - Skip first N values
33+ - ✅ ` scan ` - Accumulate with intermediate results
34+ - ✅ ` reduce ` - Reduce to single final result
35+
36+ ### 🔗 Combination Operators (2)
37+ - ✅ ` merge ` - Merge multiple Observables
38+ - ✅ ` concat ` - Concatenate multiple Observables
39+
40+ ### 🛠️ Utility Operators (3)
41+ - ✅ ` tap ` - Side effects (debugging friendly)
42+ - ✅ ` distinct ` - Remove duplicates
43+ - ✅ ` catch_error ` - Error catching and recovery
44+
45+ ### ⚡ Advanced Features
46+ - ✅ ** Generic Support** : Full type safety guarantees
47+ - ✅ ** Fluent API** : Chainable method design
48+ - ✅ ** Error Recovery** : Robust error handling mechanisms
49+ - ✅ ** Test Coverage** : 29 test cases with 100% coverage
50+
51+ ## Quick Start
52+
53+ ### Installation
54+
55+ Add this library to your ` moon.mod.json ` dependencies:
2656
2757``` json
2858{
@@ -32,122 +62,195 @@ ReactiveX for MoonBit 是一个轻量级的响应式编程库,提供了 Observ
3262}
3363```
3464
35- ### 基本使用
65+ ### Basic Usage
3666
3767``` moonbit
38- // 创建 Observable
68+ // Create Observable
3969let numbers = from_array([1, 2, 3, 4, 5])
4070
41- // 转换数据
42- let doubled = map(numbers, fn(x) { x * 2 })
71+ // Transform data stream: map -> filter -> limit
72+ let result = numbers
73+ |> map(fn(x) { x * 2 }) // [2, 4, 6, 8, 10]
74+ |> filter(fn(x) { x > 5 }) // [6, 8, 10]
75+ |> take(2) // [6, 8]
76+
77+ // Method 1: Simple subscription (data only)
78+ let _ = result.subscribe_next(fn(value) {
79+ println("Received: \(value)")
80+ })
81+
82+ // Method 2: Complete subscription (data, error, complete)
83+ let observer = new_simple_observer(
84+ fn(value) { println("Value: \(value)") },
85+ fn(error) { println("Error: \(error)") },
86+ fn() { println("Complete!") }
87+ )
88+ let subscription = result.subscribe(observer)
89+ ```
4390
44- // 过滤数据
45- let filtered = filter(doubled, fn(x) { x > 5 })
91+ ### Error Handling Example
4692
47- // 订阅观察
48- let observer = new_observer(
49- fn(value) { println("接收到: " + value.to_string()) },
50- fn(error) { println("错误: " + error) },
51- fn() { println("完成!") }
52- )
93+ ``` moonbit
94+ // Create potentially failing Observable
95+ let risky_data = from_array([1, 0, 2])
96+ |> map(fn(x) { 10 / x }) // Division by zero will fail
97+
98+ // Use catch_error for recovery
99+ let safe_data = risky_data.catch_error(fn(err) {
100+ println("Caught error: \(err)")
101+ of(-1) // Return default value
102+ })
53103
54- let subscription = subscribe(filtered, observer )
104+ let _ = safe_data.subscribe_next(fn(x) { println("Result: \(x)") } )
55105```
56106
57- ## API 文档
107+ ## API Documentation
58108
59- ### 核心类型
109+ ### 🔧 Core Types
110+
111+ #### ` RxError `
112+ ``` moonbit
113+ pub enum RxError {
114+ RuntimeError(String) // Runtime error
115+ OperatorError(String) // Operator error
116+ SubscriptionError(String) // Subscription error
117+ TimeoutError(String) // Timeout error
118+ }
119+ ```
60120
61121#### ` Observable[T] `
62- 响应式数据流的核心类型,表示一个可观察的值序列。
122+ Core type representing a reactive data stream - an observable sequence of values.
63123
64124#### ` Observer[T] `
65- 观察者接口,包含三个回调函数:
66- - ` on_next: (T) -> Unit ` - 接收到新值时调用
67- - ` on_error: (String ) -> Unit ` - 发生错误时调用
68- - ` on_complete: () -> Unit ` - 序列完成时调用
125+ Observer interface with three callback functions:
126+ - ` on_next: (T) -> Unit ` - Called when receiving new value
127+ - ` on_error: (RxError ) -> Unit ` - Called when error occurs
128+ - ` on_complete: () -> Unit ` - Called when sequence completes
69129
70- #### ` BasicSubscription `
71- 基础订阅实现,用于管理订阅生命周期。
130+ ### 🚀 Creation Operators
72131
73- ### 创建操作符
132+ - ` of[T](value: T) -> Observable[T] ` - Create from single value
133+ - ` from_array[T](values: Array[T]) -> Observable[T] ` - Create from array
134+ - ` empty[T]() -> Observable[T] ` - Create empty sequence
135+ - ` never[T]() -> Observable[T] ` - Create never-emitting sequence
136+ - ` error[T](message: String) -> Observable[T] ` - Create error sequence
74137
75- - ` of[T](value: T) -> Observable[T] ` - 从单个值创建 Observable
76- - ` from_array[T](values: Array[T]) -> Observable[T] ` - 从数组创建 Observable
77- - ` empty[T]() -> Observable[T] ` - 创建空的 Observable
78- - ` never[T]() -> Observable[T] ` - 创建永不发射的 Observable
79- - ` error[T](message: String) -> Observable[T] ` - 创建发射错误的 Observable
138+ ### 🔄 Transformation Operators
80139
81- ### 转换操作符
140+ - ` map[T, U](source, transform) -> Observable[U] ` - Transform values
141+ - ` filter[T](source, predicate) -> Observable[T] ` - Filter by condition
142+ - ` take[T](source, count) -> Observable[T] ` - Take first N values
143+ - ` skip[T](source, count) -> Observable[T] ` - Skip first N values
144+ - ` scan[T, U](source, initial, accumulator) -> Observable[U] ` - Accumulate
145+ - ` reduce[T, U](source, initial, accumulator) -> Observable[U] ` - Reduce
82146
83- - ` map[T, U](source: Observable[T], transform: (T) -> U) -> Observable[U] ` - 转换每个发射的值
84- - ` filter[T](source: Observable[T], predicate: (T) -> Bool) -> Observable[T] ` - 过滤满足条件的值
85- - ` take[T](source: Observable[T], count: Int) -> Observable[T] ` - 只取前 n 个值
86- - ` skip[T](source: Observable[T], count: Int) -> Observable[T] ` - 跳过前 n 个值
87- - ` scan[T, U](source: Observable[T], initial: U, accumulator: (U, T) -> U) -> Observable[U] ` - 累积操作,发射中间结果
88- - ` reduce[T, U](source: Observable[T], initial: U, accumulator: (U, T) -> U) -> Observable[U] ` - 累积操作,只发射最终结果
147+ ### 🔗 Combination Operators
89148
90- ### 工具函数
149+ - ` merge[T](sources: Array[Observable[T]]) -> Observable[T] ` - Merge Observables
150+ - ` concat[T](sources: Array[Observable[T]]) -> Observable[T] ` - Concatenate Observables
91151
92- - ` new_observer[T](on_next, on_error, on_complete) -> Observer[T] ` - 创建观察者
93- - ` new_observable[T](subscribe_fn) -> Observable[T] ` - 创建 Observable
94- - ` subscribe[T](observable: Observable[T], observer: Observer[T]) -> BasicSubscription ` - 订阅 Observable
95- - ` subscribe_next[T](observable: Observable[T], on_next: (T) -> Unit) -> BasicSubscription ` - 便捷订阅方法
152+ ### 🛠️ Utility Operators
96153
97- ## 示例
154+ - ` tap[T](source, side_effect) -> Observable[T] ` - Side effects
155+ - ` distinct[T : Eq](source) -> Observable[T] ` - Remove duplicates
156+ - ` catch_error[T](source, error_handler) -> Observable[T] ` - Error recovery
98157
99- 查看 ` examples/ ` 目录获取更多使用示例。
158+ ## 📚 Examples
100159
101- ## 测试与覆盖率
160+ ### 🎯 Usage Examples
102161
103- ### 运行测试
162+ Check out complete examples in ` src/examples.mbt ` :
104163
105- 本项目实现了全面的代码覆盖率测试:
164+ ``` moonbit
165+ // Call example functions
166+ example_basic_usage() // Basic usage demo
167+ example_operator_chain() // Operator chaining demo
168+ ```
106169
107- ``` bash
108- # 运行完整的演示和测试
109- moon run src/test.mbt
170+ ### 🔗 Operator Chaining Example
171+
172+ ``` moonbit
173+ // Data processing pipeline
174+ let pipeline = from_array([1, 2, 3, 2, 4, 5])
175+ |> distinct() // Dedupe: [1, 2, 3, 4, 5]
176+ |> filter(fn(x) { x % 2 == 1 }) // Odds: [1, 3, 5]
177+ |> map(fn(x) { x * x }) // Square: [1, 9, 25]
178+ |> scan(0, fn(acc, x) { acc + x }) // Sum: [1, 10, 35]
179+
180+ let _ = pipeline.subscribe_next(fn(x) { println("Running sum: \(x)") })
110181```
111182
112- ### 覆盖率报告
183+ ## 🧪 Testing
184+
185+ ### Run Tests
186+
187+ ``` bash
188+ # Run all tests
189+ moon test
190+
191+ # Check code
192+ moon check
193+
194+ # Build project
195+ moon build
196+ ```
113197
114- 当前代码覆盖率: ** 100% ** (22/22 函数)
198+ ### 📊 Test Coverage
115199
116- 测试覆盖的功能模块:
117- - ✅ ** 创建操作符** : ` of ` , ` from_array ` , ` empty ` , ` never ` , ` error ` (5/5)
118- - ✅ ** 转换操作符** : ` map ` , ` filter ` , ` take ` , ` skip ` , ` scan ` , ` reduce ` (6/6)
119- - ✅ ** 高级操作符** : ` tap ` , ` distinct ` , ` merge ` , ` concat ` , ` catch_error ` (5/5)
120- - ✅ ** Observer管理** : ` new_observer ` , ` new_simple_observer ` , ` subscribe ` 等 (6/6)
200+ ** Current Test Status** :
201+ - ✅ ** Test Cases** : 29 tests, all passing
202+ - ✅ ** API Coverage** : 16 public functions fully covered
203+ - ✅ ** Feature Coverage** : All operators and core functionality
121204
122- ### 功能验证
205+ ## 🛠️ Development
123206
124- 每次运行测试会验证:
125- - 基本Observable创建和订阅
126- - 所有转换操作符的正确性
127- - 错误处理机制
128- - 订阅生命周期管理
129- - 复杂操作符链的组合
207+ ### Project Structure
130208
131- ## 开发
209+ ```
210+ ReactiveX/
211+ ├── src/ # Source directory
212+ │ ├── reactivex.mbt # ReactiveX core implementation
213+ │ ├── test.mbt # Test suite
214+ │ ├── examples.mbt # Usage examples
215+ │ └── moon.pkg.json # Package configuration
216+ ├── moon.mod.json # Project configuration
217+ ├── README.md # English documentation
218+ ├── README_zh_CN.md # Chinese documentation
219+ └── LICENSE # MIT license
220+ ```
132221
133- ### 构建
222+ ### Build Commands
134223
135224``` bash
136- moon check src/lib
225+ # Check syntax and types
226+ moon check
227+
228+ # Build project
229+ moon build
230+
231+ # Run tests
232+ moon test
233+
234+ # Format code
235+ moon fmt
137236```
138237
139- ## 贡献
238+ ## 🤝 Contributing
239+
240+ Contributions are welcome! Please ensure:
241+
242+ 1 . ** Code Quality** : Follow existing code style, pass all tests
243+ 2 . ** Test Coverage** : Add test cases for new features
244+ 3 . ** Documentation** : Update relevant docs and examples
140245
141- 欢迎贡献代码!请确保:
246+ ## 📄 License
142247
143- 1 . 遵循现有的代码风格
144- 2 . 为新功能添加测试
145- 3 . 更新相关文档
248+ MIT License - see [ LICENSE] ( LICENSE ) file for details.
146249
147- ## 许可证
250+ ## 🙏 Acknowledgments
148251
149- MIT License - 详见 [ LICENSE ] ( LICENSE ) 文件。
252+ This project is inspired by [ ReactiveX ] ( https://reactivex.io/ ) , bringing reactive programming support to the MoonBit language.
150253
151- ## 致谢
254+ ---
152255
153- 本项目受到 [ ReactiveX] ( https://reactivex.io/ ) 的启发,为 MoonBit 语言提供响应式编程支持。
256+ ** ReactiveX for MoonBit** - Making reactive programming simple and powerful in MoonBit! 🚀
0 commit comments