0.0.1 • Published 2 years ago

@lsby/ts_route v0.0.1

Weekly downloads
-
License
-
Repository
-
Last release
2 years ago

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

npm.io