moduforge-model 0.7.0

不可变数据结构与事务系统基础
Documentation
# ModuForge 操作符系统全面分析


## 概述


ModuForge 通过 Rust 的操作符重载机制实现了一套直观且强大的树操作 API。当前系统实现了8个核心操作符,为文档树的操作提供了丰富的语法糖。

## 架构设计


### 核心组件


1. **引用包装器**   - `NodeRef<'a>` - 节点操作引用包装器
   - `MarkRef<'a>` - 标记操作引用包装器  
   - `AttrsRef<'a>` - 属性操作引用包装器

2. **操作模块**   - `add.rs` - 加法运算符 `+`
   - `sub.rs` - 减法运算符 `-`
   - `mul.rs` - 乘法运算符 `*`
   - `bitand.rs` - 位与运算符 `&`
   - `bitor.rs` - 位或运算符 `|`
   - `shl.rs` - 左移运算符 `<<`
   - `shr.rs` - 右移运算符 `>>`

## 操作符详细分析


### 1. 加法运算符 `+` (add.rs)


**功能定位**: 向树结构中添加新内容

**实现的操作**:

#### NodeRef 操作

- `NodeRef + Node` - 添加单个节点到子节点列表
- `NodeRef + (usize, Node)` - 在指定位置插入节点
- `NodeRef + Vec<Node>` - 批量添加多个节点
- `NodeRef + NodeEnum` - 添加枚举类型节点

#### MarkRef 操作

- `MarkRef + Mark` - 添加单个标记
- `MarkRef + Vec<Mark>` - 批量添加多个标记

#### AttrsRef 操作

- `AttrsRef + Attrs` - 添加属性对象
- `AttrsRef + (String, Value)` - 添加单个键值对
- `AttrsRef + im::HashMap<String, Value>` - 直接添加属性映射

**设计特点**:
- 返回类型统一为 `PoolResult<RefType>`,支持错误处理
- 保持引用包装器的链式调用能力
- 支持多种数据类型的重载

### 2. 减法运算符 `-` (sub.rs)


**功能定位**: 从树结构中移除内容

**实现的操作**:

#### NodeRef 操作

- `NodeRef - NodeId` - 删除指定节点
- `NodeRef - Vec<NodeId>` - 批量删除多个节点
- `NodeRef - usize` - 按索引删除节点

#### MarkRef 操作

- `MarkRef - Mark` - 删除指定标记对象
- `MarkRef - String` - 按名称删除标记
- `MarkRef - Vec<Mark>` - 批量删除多个标记

**设计特点**:
- 支持按ID、索引、名称等多种方式删除
- 批量删除采用循环方式逐个处理
- 错误处理机制完善

### 3. 乘法运算符 `*` (mul.rs)


**功能定位**: 复制和克隆节点

**实现的操作**:

#### NodeRef 操作

- `NodeRef * usize` - 复制当前节点N次
- `NodeRef * NodeId` - 复制指定节点到当前位置
- `NodeRef * Vec<NodeId>` - 批量复制多个指定节点

**设计特点**:
- 自动生成新的唯一ID(通过 `IdGenerator::get_id()`- 深度克隆节点结构
- 智能处理复制位置(添加到父节点或当前节点)

### 4. 位与运算符 `&` (bitand.rs)


**功能定位**: 过滤和交集操作

**实现的操作**:

#### NodeRef 操作

- `NodeRef & String` - 只保留指定类型的子节点
- `NodeRef & Vec<String>` - 保留多个指定类型的子节点

#### MarkRef 操作

- `MarkRef & String` - 只保留指定名称的标记
- `MarkRef & Vec<String>` - 保留多个指定名称的标记

**设计特点**:
- 采用"移除不匹配项"的策略实现过滤
- 支持单个条件和多条件过滤
- 类型安全的字符串比较

### 5. 位或运算符 `|` (bitor.rs)


**功能定位**: 合并和联合操作

**实现的操作**:

#### NodeRef 操作

- `NodeRef | NodeId` - 合并另一个节点的所有子节点
- `NodeRef | Vec<NodeId>` - 合并多个节点的子节点
- `NodeRef | Vec<Node>` - 直接合并节点列表

#### MarkRef 操作

- `MarkRef | Mark` - 合并标记(自动去重)
- `MarkRef | Vec<Mark>` - 合并多个标记(自动去重)

**设计特点**:
- 自动生成新ID防止冲突
- 标记合并时自动去重(基于类型和属性)
- 批量操作优化

### 6. 左移运算符 `<<` (shl.rs)


**功能定位**: 插入到开头或向左移动

**实现的操作**:

#### NodeRef 操作

- `NodeRef << Node` - 在子节点列表开头插入节点
- `NodeRef << Vec<Node>` - 在开头插入多个节点(保持顺序)
- `NodeRef << usize` - 将当前节点向左移动N个位置

**设计特点**:
- 使用 `add_at_index(0, node)` 实现开头插入
- 多节点插入时维护原始顺序
- 移动操作使用 `saturating_sub` 防止下溢

### 7. 右移运算符 `>>` (shr.rs)


**功能定位**: 插入到末尾或向右移动

**实现的操作**:

#### NodeRef 操作

- `NodeRef >> Node` - 在子节点列表末尾添加节点
- `NodeRef >> Vec<Node>` - 在末尾添加多个节点
- `NodeRef >> usize` - 将当前节点向右移动N个位置

#### MarkRef 操作

- `MarkRef >> Mark` - 在标记列表末尾添加标记
- `MarkRef >> Vec<Mark>` - 在末尾添加多个标记

**设计特点**:
- 末尾添加等同于标准的 `add` 操作
- 移动操作限制在有效范围内
- 同时支持节点和标记操作

## 系统特性分析


### 1. 类型安全

- 所有操作都通过 Rust 的类型系统保证安全性
- 返回类型统一为 `PoolResult<T>`,提供错误处理
- 编译时检查操作合法性

### 2. 内存管理

- 使用引用包装器避免不必要的所有权转移
- 生命周期参数 `'a` 确保引用有效性
- ID 生成器确保节点唯一性

### 3. 错误处理

- 统一的错误处理机制
- 详细的错误信息(如 `node_not_found`- 操作失败时安全回退

### 4. 性能优化

- 批量操作避免多次 API 调用
- 延迟计算和智能缓存
- 最小化树结构遍历次数

## 功能完整性评估


### 已实现的功能

✅ 基础增删改操作 (`+`, `-`)  
✅ 节点复制功能 (`*`)  
✅ 内容过滤功能 (`&`)  
✅ 内容合并功能 (`|`)  
✅ 位置控制功能 (`<<`, `>>`)  

### 潜在改进点


1. **性能优化**:
   - 批量操作可以进一步优化
   - 考虑实现写时复制(COW)机制

2. **功能扩展**:
   - 添加缺失的操作符实现
   - 支持更多数据类型的重载

3. **错误处理**:
   - 提供更详细的错误上下文
   - 支持错误恢复机制

4. **API 一致性**:
   - 统一命名约定
   - 标准化参数顺序


## 总结


ModuForge 的操作符系统展现了以下优势:

1. **直观性**: 操作符语义与数学/编程直觉一致
2. **完整性**: 覆盖了树操作的主要场景  
3. **安全性**: 类型安全和错误处理机制完善
4. **扩展性**: 模块化设计便于添加新功能
5. **性能**: 批量操作和智能优化

当前实现已经为文档树操作提供了强大的基础设施,剩余的操作符实现将进一步完善整个系统的功能性。