This repository has been archived by the owner on Nov 11, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcodegen.js
91 lines (76 loc) · 2.45 KB
/
codegen.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
const interfaceTemplate = `namespace AltV.Community.Events;
public interface IEvent{generic}
{
bool AddHandler(Action{generic} handler);
bool AddHandler(Func<{func_generic}Task> handler);
bool RemoveHandler(Action{generic} handler);
bool RemoveHandler(Func<{func_generic}Task> handler);
void Invoke({parameters});
Task InvokeAsync({parameters});
Task InvokeAsyncSerial({parameters});
}
`;
const classTemplate = `namespace AltV.Community.Events;
public class Event{generic}(IEventInvoker invoker) : IEvent{generic}
{
private readonly HashSet<Delegate> delegates = [];
public bool AddHandler(Action{generic} handler)
{
return delegates.Add(handler);
}
public bool AddHandler(Func<{func_generic}Task> handler)
{
return delegates.Add(handler);
}
public bool RemoveHandler(Action{generic} handler)
{
return delegates.Remove(handler);
}
public bool RemoveHandler(Func<{func_generic}Task> handler)
{
return delegates.Remove(handler);
}
public void Invoke({parameters})
{
invoker.Invoke(delegates{args});
}
public Task InvokeAsync({parameters})
{
return invoker.InvokeAsync(delegates{args});
}
public Task InvokeAsyncSerial({parameters})
{
return invoker.InvokeAsyncSerial(delegates{args});
}
}
`;
const createNumberFilledArray = (length) =>
new Array(length).fill(0).map((_, i) => i);
for (let k = 0; k !== 8; ++k) {
const numbers = createNumberFilledArray(k);
const generic =
k === 0 ? "" : `<${numbers.map((a) => `T${a + 1}`).join(", ")}>`;
const funcGeneric =
k === 0 ? "" : `${numbers.map((a) => `T${a + 1}`).join(", ")}, `;
const parameters =
k === 0 ? "" : `${numbers.map((a) => `T${a + 1} arg${a + 1}`).join(", ")}`;
const args =
k === 0 ? "" : `, ${numbers.map((a) => `arg${a + 1}`).join(", ")}`;
const interfaceFilename = `[Generated]/IEvent${k === 0 ? "" : `\`${k}`}.g.cs`;
const classFilename = `[Generated]/Event${k === 0 ? "" : `\`${k}`}.g.cs`;
await Bun.write(
interfaceFilename,
interfaceTemplate
.replaceAll("{generic}", generic)
.replaceAll("{func_generic}", funcGeneric)
.replaceAll("{parameters}", parameters)
);
await Bun.write(
classFilename,
classTemplate
.replaceAll("{generic}", generic)
.replaceAll("{func_generic}", funcGeneric)
.replaceAll("{parameters}", parameters)
.replaceAll("{args}", args)
);
}