0.0.1 • Published 2 years ago
@lsby/ts_route v0.0.1
ts_route
受 mobius 启发的响应式工具.
概念
这个库由三种设备组成.
节点
节点是基础单元, 是数据的存储者, 也是副作用的执行者.
创建节点时, 需要提供节点名称, 初始数据和事件函数. 初始数据的类型即是此节点的类型.
当节点的数据被修改时, 会上报修改数据给自己所连接的所有交换机.
当节点收到数据时, 会执行你创建节点时提供的事件函数.
交换机
交换机是同类型节点的连接者.
创建交换机时, 不需要提供任何信息.
一个交换机可以连接多个节点, 一个节点可以连接多个交换机, 当交换机收到节点上报的数据后, 会进行泛洪.
交换机连接的所有节点都必须拥有相同的内部数据.
交换机可以连接两个路由器, 称为输入
和输出
. 当收到输入
路由器的数据后, 会进行泛洪.
* 在这里, 泛洪是指将收到的数据转换给除来源之外的所有设备, 包括所有节点和输出
路由器.
路由器
路由器是不同类型交换机的连接者.
创建路由器时, 需要提供转换函数, 此函数可以将 A 类型的数据转换为 B 类型的数据.
路由器可以与两个交换机相连, 称为输入
和输出
, 当收到输入
交换机的数据后, 会使用转换函数将其转换, 并将结果发至输出
交换机.
其中, 输入
交换机必须连接 A 类型的节点, 输出
交换机必须连接 B 类型的节点.
快速开始
type 类型A = { name: string; value: number }
type 类型B = { a: number; b: number }
var a = 节点({ name: 'a', value: 0 }, async () => null)
var b = 节点({ name: 'b', value: 0 }, async () => null)
var c = 节点({ a: 0, b: 0 }, async (data, self) => {
await self.修改数据({ a: data.a || self.节点数据.a, b: data.b || self.节点数据.b })
console.log(self.节点数据.a + self.节点数据.b)
})
路由器<类型A, 类型B>(async (data) => {
if (data.name == 'a') return { a: data.value, b: null }
if (data.name == 'b') return { a: null, b: data.value }
})
.连接入口(交换机<类型A>().连接到节点(a).连接到节点(b))
.连接出口(交换机<类型B>().连接到节点(c))
await a.修改数据({ name: 'a', value: 1 }) // => log 1
await b.修改数据({ name: 'b', value: 1 }) // => log 2
await b.修改数据({ name: 'b', value: 2 }) // => log 3
await a.修改数据({ name: 'a', value: 3 }) // => log 5
await a.修改数据({ name: 'a', value: 4 }) // => log 6
0.0.1
2 years ago