Current collected state Current
Observed since 20 Oct, 20:26 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
typescript pattern project
TypeScript 数据结构与算法工具库。
npm install 55ab-loach
import { Stack, Queue, QuadTree, AsyncQueue, math } from "55ab-loach";
后进先出(LIFO)数据结构。
const stack = new Stack<number>();
const stack = new Stack<number>({ maxCount: 100, items: [1, 2, 3] });
| 方法 | 说明 |
|---|---|
push(item) | 入栈 |
pushs(items) | 批量入栈 |
pop() | 出栈,空栈返回 undefined |
pops(count) | 批量出栈 |
peek() | 返回栈顶元素 |
isEmpty() | 栈是否为空 |
isFull() | 栈是否已满 |
size() | 栈长度 |
clear() | 清空栈 |
includes(item) | 是否包含元素 |
indexOf(item) | 查找元素索引 |
remove(item) | 移除指定元素 |
toArray() | 转为数组 |
forEach(callback) | 遍历 |
toString() | 字符串表示 |
属性:maxCount(可读写,默认 1000)
先进先出(FIFO)数据结构。
const queue = new Queue<number>();
const queue = new Queue<number>({ maxCount: 100, items: [1, 2, 3] });
| 方法 | 说明 |
|---|---|
enQueue(item) | 入队 |
enQueues(items) | 批量入队 |
deQueue() | 出队,空队列返回 undefined |
deQueues(count) | 批量出队 |
front() | 返回队首元素 |
back() | 返回队尾元素 |
isEmpty() | 队列是否为空 |
isFull() | 队列是否已满 |
size() | 队列长度 |
clear() | 清空队列 |
includes(item) | 是否包含元素 |
indexOf(item) | 查找元素索引 |
remove(item) | 移除指定元素 |
toArray() | 转为数组 |
forEach(callback) | 遍历 |
toString() | 字符串表示 |
属性:maxCount(可读写,默认 1000)
空间分区数据结构,适用于碰撞检测、空间查询等场景。支持矩形和圆形两种形状。
const qt = new QuadTree<IQuadItemObject>({
x: 0,
y: 0,
width: 800,
height: 600,
maxObjects: 10, // 每个节点最大对象数,默认 10
maxLevels: 4, // 最大分割层级,默认 4
});
// 矩形对象
const rect: IQuadItemObject = {
shape: "rect",
x: 10,
y: 10,
width: 20,
height: 20,
};
// 圆形对象
const circle: IQuadItemObject = { shape: "circle", x: 50, y: 50, radius: 10 };
| 方法 | 说明 |
|---|---|
insert(item) | 插入对象,超出阈值自动分割 |
inserts(items) | 批量插入 |
remove(item) | 移除对象,返回是否成功 |
query(item) | 查询对象所在象限中的所有对象 |
queryRange(range) | 查询矩形范围内的所有对象 |
contains(item) | 是否包含指定对象 |
getAllObjects() | 获取所有对象 |
getSize() | 获取对象总数 |
getDepth() | 获取四叉树深度 |
clear() | 清除所有对象和子节点 |
isPointInBounds(point) | 判断点是否在范围内 |
subdivide() | 手动分割为四个子节点 |
属性:x, y, width, height, level, maxObjects(可读写), maxLevels(可读写), nodes, objects
const qt = new QuadTree<IQuadItemObject>({
x: 0,
y: 0,
width: 800,
height: 600,
maxObjects: 4,
});
const player = { shape: "rect", x: 100, y: 100, width: 20, height: 20 };
qt.insert(player);
// 查询与 player 同象限的候选对象
const candidates = qt.query(player);
// 查询指定矩形范围内的对象
const nearby = qt.queryRange({
shape: "rect",
x: 90,
y: 90,
width: 40,
height: 40,
});
并发控制的异步函数执行队列,支持任务调度、暂停/恢复、优先级和事件订阅。
const queue = new AsyncQueue<number, number>({
concurrency: 3, // 最大并发数,默认 1
timeout: 5000, // 任务超时时间(ms),默认 0(不超时)
retryCount: 2, // 失败重试次数,默认 0
retryDelay: 1000, // 重试间隔(ms),默认 1000
autoStart: true, // 是否自动开始,默认 true
});
| 方法 | 说明 |
|---|---|
enqueue(task, priority?) | 添加任务,支持优先级 |
start() | 开始执行队列 |
pause() | 暂停执行 |
resume() | 恢复执行 |
clear() | 清空队列 |
abort() | 中止所有任务 |
getStats() | 获取队列统计信息 |
on(event, handler) | 订阅事件 |
off(event, handler) | 取消订阅 |
| 事件 | 说明 |
|---|---|
taskStart | 任务开始 |
taskEnd | 任务完成 |
taskError | 任务错误 |
taskRetry | 任务重试 |
queueEmpty | 队列空 |
queueFull | 队列满 |
pause | 暂停 |
resume | 恢复 |
statsUpdate | 统计更新 |
const queue = new AsyncQueue<string, number>({ concurrency: 2 });
queue.on("taskEnd", ({ result }) => {
console.log("任务完成:", result);
});
queue.enqueue(async () => {
const response = await fetch("https://api.example.com/data");
return response.json();
});
queue.enqueue(async () => "second task", 1); // 高优先级
queue.start();
import { math } from "55ab-loach";
math.distance(x1, y1, x2, y2); // 两点距离
math.rad(v1, v2); // 两点角度(弧度)
math.abs(a); // 绝对值
math.random(from, to, fixed); // 随机数
math.randomUint(from, to, fixed); // 随机正数
npm run build # 构建
npm run test # 运行测试
npm run test:watch # 监听模式运行测试
npm · 90 observations shown. Missing days are unknown.
| Date / source period | Value | Observed at |
|---|---|---|
| 2026-10-20 – 2026-10-20 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-10-19 – 2026-10-19 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-10-18 – 2026-10-18 | 10 | 2026-10-21T11:01:40.6624041Z |
| 2026-10-17 – 2026-10-17 | 1 | 2026-10-21T11:01:40.6624041Z |
| 2026-10-16 – 2026-10-16 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-10-15 – 2026-10-15 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-10-14 – 2026-10-14 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-10-13 – 2026-10-13 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-10-12 – 2026-10-12 | 2 | 2026-10-21T11:01:40.6624041Z |
| 2026-10-11 – 2026-10-11 | 2 | 2026-10-21T11:01:40.6624041Z |
| 2026-10-10 – 2026-10-10 | 2 | 2026-10-21T11:01:40.6624041Z |
| 2026-10-09 – 2026-10-09 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-10-08 – 2026-10-08 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-10-07 – 2026-10-07 | 1 | 2026-10-21T11:01:40.6624041Z |
| 2026-10-06 – 2026-10-06 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-10-05 – 2026-10-05 | 1 | 2026-10-21T11:01:40.6624041Z |
| 2026-10-04 – 2026-10-04 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-10-03 – 2026-10-03 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-10-02 – 2026-10-02 | 2 | 2026-10-21T11:01:40.6624041Z |
| 2026-10-01 – 2026-10-01 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-30 – 2026-09-30 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-29 – 2026-09-29 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-28 – 2026-09-28 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-27 – 2026-09-27 | 4 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-26 – 2026-09-26 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-25 – 2026-09-25 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-24 – 2026-09-24 | 2 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-23 – 2026-09-23 | 1 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-22 – 2026-09-22 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-21 – 2026-09-21 | 3 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-20 – 2026-09-20 | 13 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-19 – 2026-09-19 | 1 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-18 – 2026-09-18 | 1 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-17 – 2026-09-17 | 38 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-16 – 2026-09-16 | 1 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-15 – 2026-09-15 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-14 – 2026-09-14 | 10 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-13 – 2026-09-13 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-12 – 2026-09-12 | 30 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-11 – 2026-09-11 | 5 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-10 – 2026-09-10 | 1 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-09 – 2026-09-09 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-08 – 2026-09-08 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-07 – 2026-09-07 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-06 – 2026-09-06 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-05 – 2026-09-05 | 1 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-04 – 2026-09-04 | 50 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-03 – 2026-09-03 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-02 – 2026-09-02 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-09-01 – 2026-09-01 | 1 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-31 – 2026-08-31 | 3 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-30 – 2026-08-30 | 6 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-29 – 2026-08-29 | 1 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-28 – 2026-08-28 | 1 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-27 – 2026-08-27 | 2 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-26 – 2026-08-26 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-25 – 2026-08-25 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-24 – 2026-08-24 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-23 – 2026-08-23 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-22 – 2026-08-22 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-21 – 2026-08-21 | 10 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-20 – 2026-08-20 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-19 – 2026-08-19 | 5 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-18 – 2026-08-18 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-17 – 2026-08-17 | 5 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-16 – 2026-08-16 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-15 – 2026-08-15 | 61 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-14 – 2026-08-14 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-13 – 2026-08-13 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-12 – 2026-08-12 | 2 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-11 – 2026-08-11 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-10 – 2026-08-10 | 14 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-09 – 2026-08-09 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-08 – 2026-08-08 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-07 – 2026-08-07 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-06 – 2026-08-06 | 13 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-05 – 2026-08-05 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-04 – 2026-08-04 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-03 – 2026-08-03 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-02 – 2026-08-02 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-08-01 – 2026-08-01 | 1 | 2026-10-21T11:01:40.6624041Z |
| 2026-07-31 – 2026-07-31 | 2 | 2026-10-21T11:01:40.6624041Z |
| 2026-07-30 – 2026-07-30 | 1 | 2026-10-21T11:01:40.6624041Z |
| 2026-07-29 – 2026-07-29 | 1 | 2026-10-21T11:01:40.6624041Z |
| 2026-07-28 – 2026-07-28 | 3 | 2026-10-21T11:01:40.6624041Z |
| 2026-07-27 – 2026-07-27 | 0 | 2026-10-21T11:01:40.6624041Z |
| 2026-07-26 – 2026-07-26 | 6 | 2026-10-21T11:01:40.6624041Z |
| 2026-07-25 – 2026-07-25 | 10 | 2026-10-21T11:01:40.6624041Z |
| 2026-07-24 – 2026-07-24 | 11 | 2026-10-21T11:01:40.6624041Z |
| 2026-07-23 – 2026-07-23 | 0 | 2026-10-21T11:01:40.6624041Z |
This describes our collected data; it is not a security assessment.
Observed since 20 Oct, 20:26 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package:bd18ce5794b23b263cd348a0b34c20af411a7deedbb2461e86b7102c56df604c