aoye 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +84 -0
- package/dist/aoye.cjs.js +1120 -0
- package/dist/aoye.esm.js +1112 -0
- package/dist/aoye.umd.js +1051 -0
- package/dist/shared/util.d.ts +22 -0
- package/dist/signal/src/__test__/dep-str.d.ts +8 -0
- package/dist/signal/src/__test__/scope.test.d.ts +1 -0
- package/dist/signal/src/__test__/siganl.test.d.ts +1 -0
- package/dist/signal/src/__test__/watch.test.d.ts +1 -0
- package/dist/signal/src/dfs.d.ts +14 -0
- package/dist/signal/src/global.d.ts +21 -0
- package/dist/signal/src/index.d.ts +27 -0
- package/dist/signal/src/line.d.ts +31 -0
- package/dist/signal/src/priority-queue.d.ts +44 -0
- package/dist/signal/src/schedule.d.ts +9 -0
- package/dist/signal/src/scope.d.ts +13 -0
- package/dist/signal/src/signal.d.ts +42 -0
- package/dist/signal/src/task.d.ts +12 -0
- package/dist/signal/src/test-hidden-class-transfrom.d.ts +17 -0
- package/dist/signal/src/type.d.ts +42 -0
- package/dist/signal/src/util.d.ts +2 -0
- package/package.json +37 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
type QueueItem<T> = {
|
|
2
|
+
v: T;
|
|
3
|
+
prev?: QueueItem<T>;
|
|
4
|
+
next?: QueueItem<T>;
|
|
5
|
+
};
|
|
6
|
+
export declare class Queue<T> {
|
|
7
|
+
_first?: QueueItem<T>;
|
|
8
|
+
get first(): T;
|
|
9
|
+
_last?: QueueItem<T>;
|
|
10
|
+
get last(): T;
|
|
11
|
+
len: number;
|
|
12
|
+
push(it: T): void;
|
|
13
|
+
shift(): T;
|
|
14
|
+
}
|
|
15
|
+
export declare function isNum(char: string): char is "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
|
|
16
|
+
export declare const genKey: (v: string | number) => number;
|
|
17
|
+
export declare class SortMap<T> {
|
|
18
|
+
data: Record<string | symbol, T[]>;
|
|
19
|
+
clear(): void;
|
|
20
|
+
add(key: string | symbol, value: T): void;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Signal } from './signal';
|
|
2
|
+
import { Line } from './line';
|
|
3
|
+
import { DFSCtxBegin, DFSCtxCompete, Vertex } from './type';
|
|
4
|
+
declare const DefaultDFSOpt: {
|
|
5
|
+
isUp: boolean;
|
|
6
|
+
begin: (dfsCtx: DFSCtxBegin) => any;
|
|
7
|
+
complete: (dfsCtx: DFSCtxCompete) => any;
|
|
8
|
+
breakStack: Line[];
|
|
9
|
+
breakLine: Line;
|
|
10
|
+
breakNode: Signal;
|
|
11
|
+
};
|
|
12
|
+
type DFSOpt = typeof DefaultDFSOpt;
|
|
13
|
+
export declare function dfs(root: Vertex, opt?: Partial<DFSOpt>): void;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { SortMap } from '../../shared/util';
|
|
2
|
+
import type { Signal } from './signal';
|
|
3
|
+
export declare const G: {
|
|
4
|
+
/** 原子 signal 更新次数 */
|
|
5
|
+
version: number;
|
|
6
|
+
id: number;
|
|
7
|
+
/** scope 销毁任务序号 */
|
|
8
|
+
scopeDisposeI: number;
|
|
9
|
+
};
|
|
10
|
+
export declare const dirtyLeafs: SortMap<Signal<any>>;
|
|
11
|
+
export declare enum State {
|
|
12
|
+
Clean = 0,
|
|
13
|
+
/** 仅用于 scope 节点是否 abort */
|
|
14
|
+
ScopeAbort = 32,
|
|
15
|
+
OutLink = 16,
|
|
16
|
+
Unknown = 8,
|
|
17
|
+
Dirty = 4,
|
|
18
|
+
Check = 2,
|
|
19
|
+
ScopeReady = 1
|
|
20
|
+
}
|
|
21
|
+
export declare const DirtyState: number;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Scheduler } from './schedule';
|
|
2
|
+
import { Signal } from './signal';
|
|
3
|
+
import { Getter, Mix } from './type';
|
|
4
|
+
export { Scheduler, scheduler } from './schedule';
|
|
5
|
+
export * from './type';
|
|
6
|
+
declare const DefaultCustomSignalOpt: {
|
|
7
|
+
scheduler: Scheduler;
|
|
8
|
+
isScope: boolean;
|
|
9
|
+
};
|
|
10
|
+
export type CustomSignalOpt = Partial<typeof DefaultCustomSignalOpt>;
|
|
11
|
+
export type CreateSignal = {
|
|
12
|
+
<T extends (...args: any[]) => any>(get: T, opt?: CustomSignalOpt): Mix<ReturnType<T>>;
|
|
13
|
+
<T = any>(value: T, opt?: CustomSignalOpt): Mix<T>;
|
|
14
|
+
};
|
|
15
|
+
export declare const $: CreateSignal;
|
|
16
|
+
export declare const watch: (values: Getter[], watcher: Function, opt?: CustomSignalOpt) => Mix<void>;
|
|
17
|
+
export declare const scope: (fn: () => void) => {
|
|
18
|
+
(): void;
|
|
19
|
+
ins: Signal<void>;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* 数据变化时,自定义 触发订阅函数的时机
|
|
23
|
+
* @param {CustomSignalOpt} opt 配置如下:
|
|
24
|
+
* @prop scheduler: (runIfDirty, effect) => void 执行 runIfDirty 定制触发 effect 时机
|
|
25
|
+
* @prop scope: 用于统一释放 effect link 的作用域 默认是 defaultScope 可以全局获取
|
|
26
|
+
*/
|
|
27
|
+
export declare const customSignal: (opt?: CustomSignalOpt) => CreateSignal;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Signal } from './signal';
|
|
2
|
+
import { Vertex } from './type';
|
|
3
|
+
export declare class Line {
|
|
4
|
+
static link(v1: Signal, v2: Signal): void;
|
|
5
|
+
static unlink(line: Line): void;
|
|
6
|
+
static unlinkRec(line: Line): void;
|
|
7
|
+
static unlinkEmit(line: Line): void;
|
|
8
|
+
/** 上游节点 连 link */
|
|
9
|
+
static emit_line(upstream: Vertex, line: Line): void;
|
|
10
|
+
/** 下游节点 连 link */
|
|
11
|
+
static rec_line(downstream: Vertex, line: Line): void;
|
|
12
|
+
/** 同一节点发出的 两个条线 相连 */
|
|
13
|
+
static line_line_emit(l1: Line, l2: Line): void;
|
|
14
|
+
/** 同一节点接收的 两个条线 相连 */
|
|
15
|
+
static line_line_rec(l1: Line, l2: Line): void;
|
|
16
|
+
static insert_line_emit(l1: Line, l2: Line, ins: Line): void;
|
|
17
|
+
static insert_line_rec(l1: Line, l2: Line, ins: Line): void;
|
|
18
|
+
/** 上游顶点 */
|
|
19
|
+
upstream: Vertex;
|
|
20
|
+
/** 上游节点 发出的上一条线 */
|
|
21
|
+
prevEmitLine: Line;
|
|
22
|
+
/** 上游节点 发出的下一条线 */
|
|
23
|
+
nextEmitLine: Line;
|
|
24
|
+
/** 下游顶点 */
|
|
25
|
+
downstream: Vertex;
|
|
26
|
+
/** 下游节点 接收的上一条线 */
|
|
27
|
+
prevRecLine: Line;
|
|
28
|
+
/** 下游节点 接收的下一条线 */
|
|
29
|
+
nextRecLine: Line;
|
|
30
|
+
constructor();
|
|
31
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 这是一个优先队列 (满足子节点总是比父节点大)
|
|
3
|
+
* 1
|
|
4
|
+
*
|
|
5
|
+
* 10 20
|
|
6
|
+
*
|
|
7
|
+
* 15 30 25 30
|
|
8
|
+
*
|
|
9
|
+
* 17
|
|
10
|
+
* 现在插入 7 , 会按广度优先的顺序插入在数组尾部
|
|
11
|
+
* 1
|
|
12
|
+
*
|
|
13
|
+
* 10 20
|
|
14
|
+
*
|
|
15
|
+
* 15 30 25 30
|
|
16
|
+
*
|
|
17
|
+
* 17 7
|
|
18
|
+
* 接着我们只需要将 7 逐层与上门的父节点比较, 7 较小则两者交互,一直让 7 上浮到适合的位置
|
|
19
|
+
*
|
|
20
|
+
* 0
|
|
21
|
+
*
|
|
22
|
+
* 1 2 2^0 得到第二层第一个索引
|
|
23
|
+
*
|
|
24
|
+
* 3 4 5 6 2^0 + 2^1 。。。 + 2^n + x = y
|
|
25
|
+
*
|
|
26
|
+
* 7 8
|
|
27
|
+
* 上浮后我们得到以上的树
|
|
28
|
+
*/
|
|
29
|
+
type IGetIndex = (v: number, max: number) => number | null;
|
|
30
|
+
export declare const leakI: IGetIndex;
|
|
31
|
+
export declare class PriorityQueue<T> {
|
|
32
|
+
aIsUrgent: (a: T, b: T) => boolean;
|
|
33
|
+
arr: T[];
|
|
34
|
+
constructor(aIsUrgent: (a: T, b: T) => boolean);
|
|
35
|
+
_add(current: T): void;
|
|
36
|
+
add(...items: T[]): void;
|
|
37
|
+
goUp: (arr: T[], current: T, len: number) => void;
|
|
38
|
+
poll(): T;
|
|
39
|
+
goDown: (arr: T[], i: number) => void;
|
|
40
|
+
peek(): T;
|
|
41
|
+
size(): number;
|
|
42
|
+
logTree(): void;
|
|
43
|
+
}
|
|
44
|
+
export {};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ScheduleHandler } from "./type";
|
|
2
|
+
export declare enum Scheduler {
|
|
3
|
+
Sync = "__Sync_",
|
|
4
|
+
Layout = "__Layout_",
|
|
5
|
+
Micro = "__Micro_",
|
|
6
|
+
Macro = "__Macro_"
|
|
7
|
+
}
|
|
8
|
+
export declare const _scheduler: Record<string | symbol, ScheduleHandler>;
|
|
9
|
+
export declare const scheduler: (key: string | symbol, value: ScheduleHandler) => ScheduleHandler;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Line } from './line';
|
|
2
|
+
import type { Signal } from './signal';
|
|
3
|
+
import { TaskQueue } from './task';
|
|
4
|
+
/** scope 捕获,引用外部 signal 孤岛 */
|
|
5
|
+
export declare const unTrackIsland: (signal: Signal) => void;
|
|
6
|
+
/** scope 释放,被重新连接的孤岛 */
|
|
7
|
+
export declare const trackIsland: (signal: Signal) => void;
|
|
8
|
+
export declare const markOutLink: (signal: Signal, downstream: Signal) => void;
|
|
9
|
+
export declare const ideScheduler: TaskQueue<import("./type").Task & {
|
|
10
|
+
index: number;
|
|
11
|
+
}>;
|
|
12
|
+
export declare function handleOneTask(s: Signal, breakStack: Line[]): boolean;
|
|
13
|
+
export declare function unlinkRecWithScope(line: Line): void;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { State } from './global';
|
|
2
|
+
import { Line } from './line';
|
|
3
|
+
import { SignalOpt, Vertex } from './type';
|
|
4
|
+
export declare class Signal<T = any> implements Vertex {
|
|
5
|
+
private nextValue;
|
|
6
|
+
/** 为什么是 shallow,因为 pullDeep 会把
|
|
7
|
+
* 上游节点 get 执行完成,让其可以直接拿到缓存值
|
|
8
|
+
*/
|
|
9
|
+
private customPull?;
|
|
10
|
+
version: number;
|
|
11
|
+
id: number;
|
|
12
|
+
state: State;
|
|
13
|
+
/** 当前节点创建时处于的 effect 就是 scope */
|
|
14
|
+
scope: Signal;
|
|
15
|
+
recEnd: Line;
|
|
16
|
+
recStart: Line;
|
|
17
|
+
emitStart: Line;
|
|
18
|
+
emitEnd: Line;
|
|
19
|
+
scheduler: string;
|
|
20
|
+
value: T;
|
|
21
|
+
static Pulling: Signal;
|
|
22
|
+
pull: () => T;
|
|
23
|
+
constructor(nextValue: T,
|
|
24
|
+
/** 为什么是 shallow,因为 pullDeep 会把
|
|
25
|
+
* 上游节点 get 执行完成,让其可以直接拿到缓存值
|
|
26
|
+
*/
|
|
27
|
+
customPull?: () => T);
|
|
28
|
+
static create<T>(nextValue: T, { customPull, isScope, ...rest }: SignalOpt<T>): Signal<T>;
|
|
29
|
+
DEFAULT_PULL(): T;
|
|
30
|
+
/**
|
|
31
|
+
* 递归拉取负责建立以来链
|
|
32
|
+
*/
|
|
33
|
+
pullRecurse(shouldLink?: boolean): T;
|
|
34
|
+
pullDeep(): T;
|
|
35
|
+
get(): T;
|
|
36
|
+
markDownStreamsDirty(): void;
|
|
37
|
+
set(v: T): void;
|
|
38
|
+
run(...args: any[]): any;
|
|
39
|
+
runIfDirty(): void;
|
|
40
|
+
isAbort(): number;
|
|
41
|
+
}
|
|
42
|
+
export declare function runWithPulling(fn: Function, signal: Signal | undefined): void;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { PriorityQueue } from './priority-queue';
|
|
2
|
+
import { CreateTaskProps, Task } from './type';
|
|
3
|
+
export declare class TaskQueue<T> {
|
|
4
|
+
callbackAble: CreateTaskProps<T>['callbackAble'];
|
|
5
|
+
aIsUrgent: CreateTaskProps<T>['aIsUrgent'];
|
|
6
|
+
constructor(callbackAble: CreateTaskProps<T>['callbackAble'], aIsUrgent: CreateTaskProps<T>['aIsUrgent']);
|
|
7
|
+
isScheduling: boolean;
|
|
8
|
+
taskQueue: PriorityQueue<Task & T>;
|
|
9
|
+
static create<T>({ callbackAble, aIsUrgent }: CreateTaskProps<T>): TaskQueue<Task & T>;
|
|
10
|
+
pushTask(task: Task & T): void;
|
|
11
|
+
scheduleTask(): boolean;
|
|
12
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare class A {
|
|
2
|
+
static HH: string;
|
|
3
|
+
value: number;
|
|
4
|
+
constructor(a?: number);
|
|
5
|
+
change(value: number): void;
|
|
6
|
+
get: () => void;
|
|
7
|
+
get v(): number;
|
|
8
|
+
set v(v: number);
|
|
9
|
+
}
|
|
10
|
+
export default class {
|
|
11
|
+
private b;
|
|
12
|
+
value: number;
|
|
13
|
+
constructor(b: number, value?: number);
|
|
14
|
+
change(value: number): void;
|
|
15
|
+
get: () => void;
|
|
16
|
+
get v(): number;
|
|
17
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { Line } from './line';
|
|
2
|
+
import type { Signal } from './signal';
|
|
3
|
+
export type Task = () => any;
|
|
4
|
+
export type CreateTaskProps<T> = {
|
|
5
|
+
callbackAble: (fn: Function) => any;
|
|
6
|
+
aIsUrgent: (a: Task & T, b: Task & T) => boolean;
|
|
7
|
+
};
|
|
8
|
+
export type ScheduleHandler = (effects: Signal[]) => any;
|
|
9
|
+
export type SignalOpt<T> = {
|
|
10
|
+
customPull?: () => T;
|
|
11
|
+
scheduler?: string;
|
|
12
|
+
isScope?: boolean;
|
|
13
|
+
};
|
|
14
|
+
export type Vertex = {
|
|
15
|
+
/** 上游来的最后一条线 */
|
|
16
|
+
recEnd: Line;
|
|
17
|
+
recStart: Line;
|
|
18
|
+
/** 向下游发出的最后一条线 */
|
|
19
|
+
emitEnd: Line;
|
|
20
|
+
emitStart: Line;
|
|
21
|
+
};
|
|
22
|
+
export type DFSCtxBegin = {
|
|
23
|
+
node: Signal;
|
|
24
|
+
lineFromUp: Line;
|
|
25
|
+
walkedLine: Line[];
|
|
26
|
+
notGoDeep?: boolean;
|
|
27
|
+
};
|
|
28
|
+
export type DFSCtxCompete = {
|
|
29
|
+
node: Signal;
|
|
30
|
+
lineToDeep: Line;
|
|
31
|
+
walkedLine: Line[];
|
|
32
|
+
notGoDeep?: boolean;
|
|
33
|
+
};
|
|
34
|
+
export type Getter<T = any> = {
|
|
35
|
+
(): T;
|
|
36
|
+
ins?: Signal;
|
|
37
|
+
};
|
|
38
|
+
export type Mix<T = any> = {
|
|
39
|
+
(v: T): void;
|
|
40
|
+
(): T;
|
|
41
|
+
v: T;
|
|
42
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "aoye",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"main": "dist/aoye.cjs.js",
|
|
5
|
+
"module": "dist/aoye.esm.js",
|
|
6
|
+
"browser": "dist/aoye.umd.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"devDependencies": {},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"ini": "node scripts/init.js",
|
|
11
|
+
"build": "rm -rf ./dist && rollup -c",
|
|
12
|
+
"pub": "node scripts/publish.js",
|
|
13
|
+
"dev": "rollup -c -w",
|
|
14
|
+
"t": "jest",
|
|
15
|
+
"tw": "jest --coverage --watch --trace-deprecation"
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"keywords": [
|
|
22
|
+
"aoye",
|
|
23
|
+
"new-me",
|
|
24
|
+
"smooth",
|
|
25
|
+
"cat"
|
|
26
|
+
],
|
|
27
|
+
"author": "smooth-cat",
|
|
28
|
+
"repository": {
|
|
29
|
+
"type": "git",
|
|
30
|
+
"url": "git+git@github.com:smooth-cat/newme.git"
|
|
31
|
+
},
|
|
32
|
+
"bugs": {
|
|
33
|
+
"url": "https://github.com/smooth-cat/newme/issues"
|
|
34
|
+
},
|
|
35
|
+
"homepage": "https://github.com/smooth-cat/newme#readme",
|
|
36
|
+
"description": "a fast signal lib"
|
|
37
|
+
}
|