Repository navigation
Expand file tree
/
Copy pathCoroutineLibrary.cs
More file actions
103 lines (92 loc) · 2.89 KB
/
Copy pathCoroutineLibrary.cs
File metadata and controls
103 lines (92 loc) · 2.89 KB
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
92
93
94
95
96
97
98
99
100
101
102
103
using Lua.Runtime;
namespace Lua.Standard;
public sealed class CoroutineLibrary
{
public static readonly CoroutineLibrary Instance = new();
public CoroutineLibrary()
{
var libraryName = "coroutine";
Functions =
[
new(libraryName, "create", Create),
new(libraryName, "resume", Resume),
new(libraryName, "running", Running),
new(libraryName, "status", Status),
new(libraryName, "wrap", Wrap),
new(libraryName, "yield", Yield),
];
}
public readonly LibraryFunction[] Functions;
public ValueTask<int> Create(
LuaFunctionExecutionContext context,
CancellationToken cancellationToken
)
{
var arg0 = context.GetArgument<LuaFunction>(0);
return new(context.Return(context.State.CreateCoroutine(arg0, true)));
}
public ValueTask<int> Resume(
LuaFunctionExecutionContext context,
CancellationToken cancellationToken
)
{
var state = context.GetArgument<LuaState>(0);
return state.ResumeAsync(
context with
{
ArgumentCount = context.ArgumentCount - 1,
},
cancellationToken
);
}
public ValueTask<int> Running(
LuaFunctionExecutionContext context,
CancellationToken cancellationToken
)
{
return new(context.Return(context.State, context.State == context.GlobalState.MainThread));
}
public ValueTask<int> Status(
LuaFunctionExecutionContext context,
CancellationToken cancellationToken
)
{
var state = context.GetArgument<LuaState>(0);
return new(
context.Return(
state.GetStatus() switch
{
LuaThreadStatus.Normal => "normal",
LuaThreadStatus.Suspended => "suspended",
LuaThreadStatus.Running => "running",
LuaThreadStatus.Dead => "dead",
_ => "",
}
)
);
}
public ValueTask<int> Wrap(
LuaFunctionExecutionContext context,
CancellationToken cancellationToken
)
{
var arg0 = context.GetArgument<LuaFunction>(0);
var state = context.State.CreateCoroutine(arg0, false);
return new(context.Return(new CSharpClosure("wrap", [state], WrapResume)));
}
static ValueTask<int> WrapResume(
LuaFunctionExecutionContext context,
CancellationToken cancellationToken
)
{
var state = context.GetCsClosure()!.UpValues[0].Read<LuaState>();
return state.ResumeWrappedAsync(context, cancellationToken);
}
public ValueTask<int> Yield(
LuaFunctionExecutionContext context,
CancellationToken cancellationToken
)
{
return context.State.YieldAsync(context, cancellationToken);
}
}