@fi4f/hg 0.0.0 → 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/.github/workflows/publish.yml +25 -23
- package/package.json +27 -29
- package/src/asset.ts +248 -248
- package/src/event.ts +173 -173
- package/src/hg.ts +20 -20
- package/src/math.ts +4 -4
- package/src/matrix2.ts +214 -214
- package/src/matrix3.ts +301 -301
- package/src/matrix4.ts +414 -414
- package/src/scene.ts +44 -44
- package/src/stage.ts +481 -481
- package/src/vector2.ts +79 -79
- package/src/vector3.ts +87 -87
- package/src/vector4.ts +95 -95
- package/src/version.ts +25 -25
- package/tsconfig.json +44 -44
package/src/event.ts
CHANGED
|
@@ -1,174 +1,174 @@
|
|
|
1
|
-
import type { Maybe } from "./types.js"
|
|
2
|
-
|
|
3
|
-
export namespace Event {
|
|
4
|
-
export type Listener<T> = (event: T, context: Event.Context<T>) => void
|
|
5
|
-
|
|
6
|
-
export type Listen = { action: "listen" , path: string, type : string , listener : Listener<any> }
|
|
7
|
-
export type Deafen = { action: "deafen" , path: string, type ?: string | undefined, listener ?: Listener<any> | undefined }
|
|
8
|
-
export type Dispatch = { action: "dispatch", path: string, type: string, event: any }
|
|
9
|
-
|
|
10
|
-
export type Action = Listen | Deafen | Dispatch
|
|
11
|
-
|
|
12
|
-
export type Tree = {
|
|
13
|
-
root : Event.Node
|
|
14
|
-
pending: Array<Event.Action>
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
export type Node = {
|
|
18
|
-
children : Map<string, Event.Node >
|
|
19
|
-
listeners: Map<string, Set<Event.Listener<any>>>
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export type Context<T> = {
|
|
23
|
-
tree: Event.Tree
|
|
24
|
-
node: Event.Node
|
|
25
|
-
path: string
|
|
26
|
-
type: string
|
|
27
|
-
self: Event.Listener<T>
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export const Event = {
|
|
32
|
-
Tree: {
|
|
33
|
-
new() {
|
|
34
|
-
return {
|
|
35
|
-
root : Event.Node.new(),
|
|
36
|
-
pending: [ ]
|
|
37
|
-
} satisfies Event.Tree
|
|
38
|
-
}
|
|
39
|
-
},
|
|
40
|
-
|
|
41
|
-
Node: {
|
|
42
|
-
new() {
|
|
43
|
-
return {
|
|
44
|
-
children : new Map(),
|
|
45
|
-
listeners: new Map()
|
|
46
|
-
} satisfies Event.Node
|
|
47
|
-
}
|
|
48
|
-
},
|
|
49
|
-
|
|
50
|
-
once<T>(listener: Event.Listener<T>) {
|
|
51
|
-
return ((event: T, context: Event.Context<T>) => {
|
|
52
|
-
listener(event, context)
|
|
53
|
-
const { tree, path, type, self } = context
|
|
54
|
-
Event.deafen(tree, type, self, { path, defer: false })
|
|
55
|
-
}) satisfies Event.Listener<T>
|
|
56
|
-
},
|
|
57
|
-
|
|
58
|
-
listen<T>(tree: Event.Tree, type : string, listener : Event.Listener<T>, o ?: { path ?: string, defer ?: boolean }) {
|
|
59
|
-
const a: Event.Listen = { action: "listen", path: o?.path ?? "", type, listener }
|
|
60
|
-
if (o?.defer ?? true) queue(tree, a)
|
|
61
|
-
else flush(tree, a)
|
|
62
|
-
},
|
|
63
|
-
|
|
64
|
-
deafen<T>(tree: Event.Tree, type ?: string, listener ?: Event.Listener<T>, o ?: { path ?: string, defer ?: boolean }) {
|
|
65
|
-
const a: Event.Deafen = { action: "deafen", path: o?.path ?? "", type, listener }
|
|
66
|
-
if (o?.defer ?? true) queue(tree, a)
|
|
67
|
-
else flush(tree, a)
|
|
68
|
-
},
|
|
69
|
-
|
|
70
|
-
dispatch(tree: Event.Tree, type: string, event: any, o ?: { path ?: string, defer ?: boolean }) {
|
|
71
|
-
const a: Event.Dispatch = { action: "dispatch", path: o?.path ?? "", type, event }
|
|
72
|
-
if (o?.defer ?? true) queue(tree, a)
|
|
73
|
-
else flush(tree, a)
|
|
74
|
-
},
|
|
75
|
-
|
|
76
|
-
poll(tree: Event.Tree) {
|
|
77
|
-
tree.pending.splice(0).forEach(
|
|
78
|
-
a => flush(tree, a)
|
|
79
|
-
)
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function queue(tree: Event.Tree, a: Event.Action) {
|
|
84
|
-
tree.pending.push(a)
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function flush(tree: Event.Tree, a: Event.Action) {
|
|
88
|
-
switch(a.action) {
|
|
89
|
-
case "listen" : return onListen (tree, a)
|
|
90
|
-
case "deafen" : return onDeafen (tree, a)
|
|
91
|
-
case "dispatch": return onDispatch(tree, a)
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
function requestListeners(node: Maybe<Event.Node>, type: string) {
|
|
96
|
-
let list = node?.listeners.get(type)
|
|
97
|
-
// if (!list) node.listeners.set(
|
|
98
|
-
// type, list = new Set()
|
|
99
|
-
// )
|
|
100
|
-
return list
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function requireListeners(node: Event.Node , type: string) {
|
|
104
|
-
let list = node.listeners.get(type)
|
|
105
|
-
if (!list) node.listeners.set(
|
|
106
|
-
type, list = new Set()
|
|
107
|
-
)
|
|
108
|
-
return list
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function requestNode(root: Maybe<Event.Node>, path: string) {
|
|
112
|
-
for (const part of path.split("/")) {
|
|
113
|
-
let node = root?.children.get(part)
|
|
114
|
-
if (!node) return
|
|
115
|
-
root = node
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
return root
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
function requireNode(root: Event.Node , path: string) {
|
|
122
|
-
for (const part of path.split("/")) {
|
|
123
|
-
let node = root.children.get(part)
|
|
124
|
-
if (!node) root.children.set(
|
|
125
|
-
part, node = Event.Node.new()
|
|
126
|
-
)
|
|
127
|
-
root = node
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
return root
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
function onListen (tree: Event.Tree, a: Event.Listen ) {
|
|
134
|
-
const node = requireNode(tree.root, a.path)
|
|
135
|
-
const list = requireListeners(node, a.type)
|
|
136
|
-
list.add(a.listener)
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
function onDeafen (tree: Event.Tree, a: Event.Deafen ) {
|
|
140
|
-
if (a.type !== undefined && a.listener !== undefined) {
|
|
141
|
-
const node = requestNode(tree.root, a.path)
|
|
142
|
-
const list = requestListeners(node, a.type)
|
|
143
|
-
list?.delete(a.listener)
|
|
144
|
-
} else if (a.type !== undefined && a.listener === undefined) {
|
|
145
|
-
const node = requestNode(tree.root, a.path)
|
|
146
|
-
const list = requestListeners(node, a.type)
|
|
147
|
-
list?.clear()
|
|
148
|
-
} else if (a.type === undefined && a.listener !== undefined) {
|
|
149
|
-
const node = requestNode(tree.root, a.path)
|
|
150
|
-
node?.listeners.forEach((list) => {
|
|
151
|
-
list.delete(a.listener!)
|
|
152
|
-
})
|
|
153
|
-
} else if (a.type === undefined && a.listener === undefined) {
|
|
154
|
-
const node = requestNode(tree.root, a.path)
|
|
155
|
-
node?.children .clear()
|
|
156
|
-
node?.listeners.clear()
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
function onDispatch(tree: Event.Tree, { path, type, event }: Event.Dispatch) {
|
|
161
|
-
const node = requestNode(tree.root, path)
|
|
162
|
-
if (!node) return
|
|
163
|
-
reDispatch(tree, node, path, type, event)
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
function reDispatch(tree: Event.Tree, node: Event.Node, path: string, type: string, event: any) {
|
|
167
|
-
requestListeners(node, type)?.forEach(self => {
|
|
168
|
-
self(event, { tree, node, path, type, self })
|
|
169
|
-
})
|
|
170
|
-
|
|
171
|
-
node.children.forEach((child, name) => {
|
|
172
|
-
reDispatch(tree, child, `${path}/${name}`, type, event)
|
|
173
|
-
})
|
|
1
|
+
import type { Maybe } from "./types.js"
|
|
2
|
+
|
|
3
|
+
export namespace Event {
|
|
4
|
+
export type Listener<T> = (event: T, context: Event.Context<T>) => void
|
|
5
|
+
|
|
6
|
+
export type Listen = { action: "listen" , path: string, type : string , listener : Listener<any> }
|
|
7
|
+
export type Deafen = { action: "deafen" , path: string, type ?: string | undefined, listener ?: Listener<any> | undefined }
|
|
8
|
+
export type Dispatch = { action: "dispatch", path: string, type: string, event: any }
|
|
9
|
+
|
|
10
|
+
export type Action = Listen | Deafen | Dispatch
|
|
11
|
+
|
|
12
|
+
export type Tree = {
|
|
13
|
+
root : Event.Node
|
|
14
|
+
pending: Array<Event.Action>
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export type Node = {
|
|
18
|
+
children : Map<string, Event.Node >
|
|
19
|
+
listeners: Map<string, Set<Event.Listener<any>>>
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export type Context<T> = {
|
|
23
|
+
tree: Event.Tree
|
|
24
|
+
node: Event.Node
|
|
25
|
+
path: string
|
|
26
|
+
type: string
|
|
27
|
+
self: Event.Listener<T>
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const Event = {
|
|
32
|
+
Tree: {
|
|
33
|
+
new() {
|
|
34
|
+
return {
|
|
35
|
+
root : Event.Node.new(),
|
|
36
|
+
pending: [ ]
|
|
37
|
+
} satisfies Event.Tree
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
Node: {
|
|
42
|
+
new() {
|
|
43
|
+
return {
|
|
44
|
+
children : new Map(),
|
|
45
|
+
listeners: new Map()
|
|
46
|
+
} satisfies Event.Node
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
|
|
50
|
+
once<T>(listener: Event.Listener<T>) {
|
|
51
|
+
return ((event: T, context: Event.Context<T>) => {
|
|
52
|
+
listener(event, context)
|
|
53
|
+
const { tree, path, type, self } = context
|
|
54
|
+
Event.deafen(tree, type, self, { path, defer: false })
|
|
55
|
+
}) satisfies Event.Listener<T>
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
listen<T>(tree: Event.Tree, type : string, listener : Event.Listener<T>, o ?: { path ?: string, defer ?: boolean }) {
|
|
59
|
+
const a: Event.Listen = { action: "listen", path: o?.path ?? "", type, listener }
|
|
60
|
+
if (o?.defer ?? true) queue(tree, a)
|
|
61
|
+
else flush(tree, a)
|
|
62
|
+
},
|
|
63
|
+
|
|
64
|
+
deafen<T>(tree: Event.Tree, type ?: string, listener ?: Event.Listener<T>, o ?: { path ?: string, defer ?: boolean }) {
|
|
65
|
+
const a: Event.Deafen = { action: "deafen", path: o?.path ?? "", type, listener }
|
|
66
|
+
if (o?.defer ?? true) queue(tree, a)
|
|
67
|
+
else flush(tree, a)
|
|
68
|
+
},
|
|
69
|
+
|
|
70
|
+
dispatch(tree: Event.Tree, type: string, event: any, o ?: { path ?: string, defer ?: boolean }) {
|
|
71
|
+
const a: Event.Dispatch = { action: "dispatch", path: o?.path ?? "", type, event }
|
|
72
|
+
if (o?.defer ?? true) queue(tree, a)
|
|
73
|
+
else flush(tree, a)
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
poll(tree: Event.Tree) {
|
|
77
|
+
tree.pending.splice(0).forEach(
|
|
78
|
+
a => flush(tree, a)
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function queue(tree: Event.Tree, a: Event.Action) {
|
|
84
|
+
tree.pending.push(a)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
function flush(tree: Event.Tree, a: Event.Action) {
|
|
88
|
+
switch(a.action) {
|
|
89
|
+
case "listen" : return onListen (tree, a)
|
|
90
|
+
case "deafen" : return onDeafen (tree, a)
|
|
91
|
+
case "dispatch": return onDispatch(tree, a)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function requestListeners(node: Maybe<Event.Node>, type: string) {
|
|
96
|
+
let list = node?.listeners.get(type)
|
|
97
|
+
// if (!list) node.listeners.set(
|
|
98
|
+
// type, list = new Set()
|
|
99
|
+
// )
|
|
100
|
+
return list
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function requireListeners(node: Event.Node , type: string) {
|
|
104
|
+
let list = node.listeners.get(type)
|
|
105
|
+
if (!list) node.listeners.set(
|
|
106
|
+
type, list = new Set()
|
|
107
|
+
)
|
|
108
|
+
return list
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function requestNode(root: Maybe<Event.Node>, path: string) {
|
|
112
|
+
for (const part of path.split("/")) {
|
|
113
|
+
let node = root?.children.get(part)
|
|
114
|
+
if (!node) return
|
|
115
|
+
root = node
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return root
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
function requireNode(root: Event.Node , path: string) {
|
|
122
|
+
for (const part of path.split("/")) {
|
|
123
|
+
let node = root.children.get(part)
|
|
124
|
+
if (!node) root.children.set(
|
|
125
|
+
part, node = Event.Node.new()
|
|
126
|
+
)
|
|
127
|
+
root = node
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return root
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function onListen (tree: Event.Tree, a: Event.Listen ) {
|
|
134
|
+
const node = requireNode(tree.root, a.path)
|
|
135
|
+
const list = requireListeners(node, a.type)
|
|
136
|
+
list.add(a.listener)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function onDeafen (tree: Event.Tree, a: Event.Deafen ) {
|
|
140
|
+
if (a.type !== undefined && a.listener !== undefined) {
|
|
141
|
+
const node = requestNode(tree.root, a.path)
|
|
142
|
+
const list = requestListeners(node, a.type)
|
|
143
|
+
list?.delete(a.listener)
|
|
144
|
+
} else if (a.type !== undefined && a.listener === undefined) {
|
|
145
|
+
const node = requestNode(tree.root, a.path)
|
|
146
|
+
const list = requestListeners(node, a.type)
|
|
147
|
+
list?.clear()
|
|
148
|
+
} else if (a.type === undefined && a.listener !== undefined) {
|
|
149
|
+
const node = requestNode(tree.root, a.path)
|
|
150
|
+
node?.listeners.forEach((list) => {
|
|
151
|
+
list.delete(a.listener!)
|
|
152
|
+
})
|
|
153
|
+
} else if (a.type === undefined && a.listener === undefined) {
|
|
154
|
+
const node = requestNode(tree.root, a.path)
|
|
155
|
+
node?.children .clear()
|
|
156
|
+
node?.listeners.clear()
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function onDispatch(tree: Event.Tree, { path, type, event }: Event.Dispatch) {
|
|
161
|
+
const node = requestNode(tree.root, path)
|
|
162
|
+
if (!node) return
|
|
163
|
+
reDispatch(tree, node, path, type, event)
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function reDispatch(tree: Event.Tree, node: Event.Node, path: string, type: string, event: any) {
|
|
167
|
+
requestListeners(node, type)?.forEach(self => {
|
|
168
|
+
self(event, { tree, node, path, type, self })
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
node.children.forEach((child, name) => {
|
|
172
|
+
reDispatch(tree, child, `${path}/${name}`, type, event)
|
|
173
|
+
})
|
|
174
174
|
}
|
package/src/hg.ts
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import { Version } from "./version.js";
|
|
2
|
-
|
|
3
|
-
export const VERSION = Version.new({
|
|
4
|
-
moniker: "hg",
|
|
5
|
-
major : 0,
|
|
6
|
-
minor : 0,
|
|
7
|
-
patch : 1,
|
|
8
|
-
})
|
|
9
|
-
|
|
10
|
-
export { Version } from "./version.js"
|
|
11
|
-
export { Vector2 } from "./vector2.js"
|
|
12
|
-
export { Vector3 } from "./vector3.js"
|
|
13
|
-
export { Vector4 } from "./vector4.js"
|
|
14
|
-
export { Matrix2 } from "./matrix2.js"
|
|
15
|
-
export { Matrix3 } from "./matrix3.js"
|
|
16
|
-
export { Matrix4 } from "./matrix4.js"
|
|
17
|
-
export { Stage } from "./stage.js"
|
|
18
|
-
export { Scene } from "./scene.js"
|
|
19
|
-
export { Event } from "./event.js"
|
|
20
|
-
|
|
1
|
+
import { Version } from "./version.js";
|
|
2
|
+
|
|
3
|
+
export const VERSION = Version.new({
|
|
4
|
+
moniker: "hg",
|
|
5
|
+
major : 0,
|
|
6
|
+
minor : 0,
|
|
7
|
+
patch : 1,
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
export { Version } from "./version.js"
|
|
11
|
+
export { Vector2 } from "./vector2.js"
|
|
12
|
+
export { Vector3 } from "./vector3.js"
|
|
13
|
+
export { Vector4 } from "./vector4.js"
|
|
14
|
+
export { Matrix2 } from "./matrix2.js"
|
|
15
|
+
export { Matrix3 } from "./matrix3.js"
|
|
16
|
+
export { Matrix4 } from "./matrix4.js"
|
|
17
|
+
export { Stage } from "./stage.js"
|
|
18
|
+
export { Scene } from "./scene.js"
|
|
19
|
+
export { Event } from "./event.js"
|
|
20
|
+
|
|
21
21
|
export { Asset, Cache } from "./asset.js"
|
package/src/math.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export function ADD(a: number, b: number) { return a + b }
|
|
2
|
-
export function SUB(a: number, b: number) { return a - b }
|
|
3
|
-
export function MUL(a: number, b: number) { return a * b }
|
|
4
|
-
export function DIV(a: number, b: number) { return a / b }
|
|
1
|
+
export function ADD(a: number, b: number) { return a + b }
|
|
2
|
+
export function SUB(a: number, b: number) { return a - b }
|
|
3
|
+
export function MUL(a: number, b: number) { return a * b }
|
|
4
|
+
export function DIV(a: number, b: number) { return a / b }
|
|
5
5
|
export function MOD(a: number, b: number) { return a % b }
|