mt-lang 0.2.0 → 0.2.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.
- checksums.yaml +4 -4
- data/docs/index.html +4 -3
- data/lib/milk_tea/base.rb +1 -1
- data/std/asset_pack.mt +267 -0
- data/std/async/libuv_runtime.mt +539 -0
- data/std/async/mailbox.mt +191 -0
- data/std/async/runtime.mt +87 -0
- data/std/async.mt +87 -0
- data/std/base64.mt +185 -0
- data/std/behavior_tree.mt +396 -0
- data/std/binary.mt +314 -0
- data/std/binary_heap.mt +157 -0
- data/std/bitset.mt +239 -0
- data/std/box2d.mt +535 -0
- data/std/bytes.mt +46 -0
- data/std/c/box2d.mt +1254 -0
- data/std/c/cgltf.mt +647 -0
- data/std/c/cjson.mt +106 -0
- data/std/c/crypto.mt +11 -0
- data/std/c/crypto_support.h +51 -0
- data/std/c/ctype.mt +19 -0
- data/std/c/ctype_bindgen.h +29 -0
- data/std/c/curl.mt +1223 -0
- data/std/c/enet.mt +473 -0
- data/std/c/errno.mt +41 -0
- data/std/c/errno_bindgen.h +53 -0
- data/std/c/flecs.mt +2945 -0
- data/std/c/fs.linux.mt +43 -0
- data/std/c/fs.windows.mt +43 -0
- data/std/c/fs_support.h +954 -0
- data/std/c/gl.mt +2065 -0
- data/std/c/gl_registry_helpers.h +10748 -0
- data/std/c/glfw.mt +499 -0
- data/std/c/libc.mt +167 -0
- data/std/c/libuv.mt +1491 -0
- data/std/c/math.mt +22 -0
- data/std/c/math_bindgen.h +31 -0
- data/std/c/miniaudio.mt +3420 -0
- data/std/c/pcre2.mt +735 -0
- data/std/c/process.mt +58 -0
- data/std/c/process_support.h +1147 -0
- data/std/c/raygui.mt +1602 -0
- data/std/c/raylib.mt +1245 -0
- data/std/c/raymath.mt +163 -0
- data/std/c/rlgl.mt +434 -0
- data/std/c/rpng.mt +60 -0
- data/std/c/rres.mt +187 -0
- data/std/c/sdl3.mt +4132 -0
- data/std/c/sqlite3.mt +951 -0
- data/std/c/stb_image.mt +52 -0
- data/std/c/stb_image_resize2.mt +128 -0
- data/std/c/stb_image_write.mt +19 -0
- data/std/c/stb_rect_pack.mt +38 -0
- data/std/c/stb_truetype.mt +175 -0
- data/std/c/stb_vorbis.mt +31 -0
- data/std/c/stdio.mt +90 -0
- data/std/c/steamworks.h +5769 -0
- data/std/c/steamworks.mt +4771 -0
- data/std/c/string.mt +16 -0
- data/std/c/string_bindgen.h +36 -0
- data/std/c/sync.mt +33 -0
- data/std/c/sync_support.h +219 -0
- data/std/c/terminal.mt +24 -0
- data/std/c/terminal_support.h +408 -0
- data/std/c/time.mt +26 -0
- data/std/c/tls.mt +24 -0
- data/std/c/tls_support.h +626 -0
- data/std/c/tracy.mt +53 -0
- data/std/c/zlib.mt +20 -0
- data/std/c/zlib_support.h +239 -0
- data/std/c/zstd.mt +231 -0
- data/std/cell.mt +60 -0
- data/std/cgltf.mt +115 -0
- data/std/cjson.mt +90 -0
- data/std/cli.mt +768 -0
- data/std/cookie.mt +198 -0
- data/std/counter.mt +160 -0
- data/std/crypto.mt +74 -0
- data/std/cstring.mt +13 -0
- data/std/ctype.mt +52 -0
- data/std/curl/runtime.mt +261 -0
- data/std/curl.mt +38 -0
- data/std/deque.mt +348 -0
- data/std/encoding.mt +93 -0
- data/std/enet.mt +133 -0
- data/std/env.mt +41 -0
- data/std/errno.mt +47 -0
- data/std/flecs.mt +978 -0
- data/std/fmt.mt +271 -0
- data/std/fs.linux.mt +696 -0
- data/std/fs.windows.mt +711 -0
- data/std/fsm.mt +267 -0
- data/std/gl.mt +2062 -0
- data/std/glfw.mt +471 -0
- data/std/goap.mt +342 -0
- data/std/graph.mt +521 -0
- data/std/gzip.mt +77 -0
- data/std/hash.mt +429 -0
- data/std/http/server.mt +810 -0
- data/std/http.mt +1227 -0
- data/std/intern.mt +53 -0
- data/std/jobs.mt +288 -0
- data/std/json.mt +627 -0
- data/std/libc.mt +34 -0
- data/std/libuv.mt +554 -0
- data/std/linear_algebra.mt +243 -0
- data/std/linked_map.mt +372 -0
- data/std/linked_map_view.mt +49 -0
- data/std/linked_set.mt +117 -0
- data/std/log.mt +69 -0
- data/std/map.mt +418 -0
- data/std/math.mt +24 -0
- data/std/mem/arena.mt +137 -0
- data/std/mem/endian.mt +51 -0
- data/std/mem/heap.mt +298 -0
- data/std/mem/pool.mt +164 -0
- data/std/mem/stack.mt +47 -0
- data/std/mem/tracking.mt +119 -0
- data/std/miniaudio.mt +1299 -0
- data/std/multiset.mt +191 -0
- data/std/net/channel.mt +727 -0
- data/std/net/clock.mt +237 -0
- data/std/net/discovery.mt +277 -0
- data/std/net/lobby.mt +813 -0
- data/std/net/manager.mt +539 -0
- data/std/net/mux.mt +839 -0
- data/std/net/nat.mt +122 -0
- data/std/net/packet.mt +219 -0
- data/std/net/punch.mt +162 -0
- data/std/net/rpc.mt +119 -0
- data/std/net/session.mt +1157 -0
- data/std/net/stun.mt +252 -0
- data/std/net/sync.mt +183 -0
- data/std/net/turn.mt +459 -0
- data/std/net.mt +2944 -0
- data/std/oauth2.mt +408 -0
- data/std/option.mt +51 -0
- data/std/ordered_map.mt +497 -0
- data/std/ordered_set.mt +348 -0
- data/std/path.mt +368 -0
- data/std/pcre2/runtime.mt +35 -0
- data/std/pcre2.mt +78 -0
- data/std/priority_queue.mt +55 -0
- data/std/process.mt +837 -0
- data/std/queue.mt +55 -0
- data/std/random.mt +146 -0
- data/std/raygui.mt +99 -0
- data/std/raylib/debug_console.mt +71 -0
- data/std/raylib/easing.mt +388 -0
- data/std/raylib/packed_assets.mt +255 -0
- data/std/raylib/runtime.mt +30 -0
- data/std/raylib/tracy_gpu.mt +37 -0
- data/std/raylib.mt +1510 -0
- data/std/raymath.mt +153 -0
- data/std/result.mt +89 -0
- data/std/rlgl.mt +268 -0
- data/std/rpng.mt +46 -0
- data/std/rres.mt +36 -0
- data/std/sdl3/runtime.mt +54 -0
- data/std/sdl3.mt +1731 -0
- data/std/serialize.mt +68 -0
- data/std/set.mt +124 -0
- data/std/spatial.mt +176 -0
- data/std/sqlite3.mt +151 -0
- data/std/stack.mt +55 -0
- data/std/stb_image.mt +47 -0
- data/std/stb_image_resize2.mt +41 -0
- data/std/stb_image_write.mt +17 -0
- data/std/stb_rect_pack.mt +15 -0
- data/std/stb_truetype.mt +77 -0
- data/std/stb_vorbis.mt +16 -0
- data/std/stdio.mt +88 -0
- data/std/steamworks.mt +1542 -0
- data/std/str.mt +293 -0
- data/std/string.mt +234 -0
- data/std/sync.mt +194 -0
- data/std/tar.mt +704 -0
- data/std/terminal.mt +1002 -0
- data/std/testing.mt +266 -0
- data/std/thread.mt +120 -0
- data/std/time.mt +105 -0
- data/std/tls.mt +616 -0
- data/std/toml.mt +1310 -0
- data/std/tracy.mt +42 -0
- data/std/uri.mt +118 -0
- data/std/url.mt +372 -0
- data/std/vec.mt +433 -0
- data/std/zstd.mt +94 -0
- metadata +187 -2
data/std/fsm.mt
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import std.vec as vec
|
|
2
|
+
|
|
3
|
+
public enum DispatchKind: ubyte
|
|
4
|
+
ignored = 0
|
|
5
|
+
transitioned = 1
|
|
6
|
+
|
|
7
|
+
public struct DispatchResult[State]:
|
|
8
|
+
kind: DispatchKind
|
|
9
|
+
previous_state: State
|
|
10
|
+
current_state: State
|
|
11
|
+
|
|
12
|
+
public struct Transition[State, Event, Context]:
|
|
13
|
+
from_state: State
|
|
14
|
+
input: Event
|
|
15
|
+
to_state: State
|
|
16
|
+
guard: fn(context: ptr[Context], input: Event, current_state: State, next_state: State) -> bool
|
|
17
|
+
action: fn(context: ptr[Context], input: Event, previous_state: State, next_state: State) -> void
|
|
18
|
+
|
|
19
|
+
public struct StateHooks[State, Context]:
|
|
20
|
+
state: State
|
|
21
|
+
on_enter: fn(context: ptr[Context], state: State) -> void
|
|
22
|
+
on_exit: fn(context: ptr[Context], state: State) -> void
|
|
23
|
+
on_update: fn(context: ptr[Context], state: State) -> void
|
|
24
|
+
|
|
25
|
+
public struct StateMachine[State, Event, Context]:
|
|
26
|
+
current_state: State
|
|
27
|
+
transitions: vec.Vec[Transition[State, Event, Context]]
|
|
28
|
+
hooks: vec.Vec[StateHooks[State, Context]]
|
|
29
|
+
states_equal: fn(left: State, right: State) -> bool
|
|
30
|
+
events_equal: fn(left: Event, right: Event) -> bool
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
function always_allow_transition[State, Event, Context](
|
|
34
|
+
_context: ptr[Context],
|
|
35
|
+
_input: Event,
|
|
36
|
+
_current_state: State,
|
|
37
|
+
_next_state: State
|
|
38
|
+
) -> bool:
|
|
39
|
+
return true
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
function noop_transition_action[State, Event, Context](
|
|
43
|
+
_context: ptr[Context],
|
|
44
|
+
_input: Event,
|
|
45
|
+
_previous_state: State,
|
|
46
|
+
_next_state: State
|
|
47
|
+
) -> void:
|
|
48
|
+
pass
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
function noop_state_hook[State, Context](_context: ptr[Context], _state: State) -> void:
|
|
52
|
+
pass
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
function find_state_hooks[State, Event, Context](
|
|
56
|
+
machine: ref[StateMachine[State, Event, Context]],
|
|
57
|
+
state: State
|
|
58
|
+
) -> ptr[StateHooks[State, Context]]?:
|
|
59
|
+
for entry in machine.hooks:
|
|
60
|
+
unsafe:
|
|
61
|
+
let current = read(entry)
|
|
62
|
+
if machine.states_equal(current.state, state):
|
|
63
|
+
return entry
|
|
64
|
+
|
|
65
|
+
return null
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
extending DispatchResult[State]:
|
|
69
|
+
public function did_transition() -> bool:
|
|
70
|
+
return this.kind == DispatchKind.transitioned
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
extending Transition[State, Event, Context]:
|
|
74
|
+
public static function create(
|
|
75
|
+
from_state: State,
|
|
76
|
+
input: Event,
|
|
77
|
+
to_state: State,
|
|
78
|
+
guard: fn(context: ptr[Context], input: Event, current_state: State, next_state: State) -> bool,
|
|
79
|
+
action: fn(context: ptr[Context], input: Event, previous_state: State, next_state: State) -> void
|
|
80
|
+
) -> Transition[State, Event, Context]:
|
|
81
|
+
return Transition[State, Event, Context](
|
|
82
|
+
from_state = from_state,
|
|
83
|
+
input = input,
|
|
84
|
+
to_state = to_state,
|
|
85
|
+
guard = guard,
|
|
86
|
+
action = action
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
public static function always(
|
|
91
|
+
from_state: State,
|
|
92
|
+
input: Event,
|
|
93
|
+
to_state: State,
|
|
94
|
+
action: fn(context: ptr[Context], input: Event, previous_state: State, next_state: State) -> void
|
|
95
|
+
) -> Transition[State, Event, Context]:
|
|
96
|
+
return Transition[State, Event, Context].create(
|
|
97
|
+
from_state,
|
|
98
|
+
input,
|
|
99
|
+
to_state,
|
|
100
|
+
always_allow_transition[State, Event, Context],
|
|
101
|
+
action
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
public static function simple(
|
|
106
|
+
from_state: State,
|
|
107
|
+
input: Event,
|
|
108
|
+
to_state: State
|
|
109
|
+
) -> Transition[State, Event, Context]:
|
|
110
|
+
return Transition[State, Event, Context].create(
|
|
111
|
+
from_state,
|
|
112
|
+
input,
|
|
113
|
+
to_state,
|
|
114
|
+
always_allow_transition[State, Event, Context],
|
|
115
|
+
noop_transition_action[State, Event, Context]
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
extending StateHooks[State, Context]:
|
|
120
|
+
public static function create(
|
|
121
|
+
state: State,
|
|
122
|
+
on_enter: fn(context: ptr[Context], state: State) -> void,
|
|
123
|
+
on_exit: fn(context: ptr[Context], state: State) -> void,
|
|
124
|
+
on_update: fn(context: ptr[Context], state: State) -> void
|
|
125
|
+
) -> StateHooks[State, Context]:
|
|
126
|
+
return StateHooks[State, Context](
|
|
127
|
+
state = state,
|
|
128
|
+
on_enter = on_enter,
|
|
129
|
+
on_exit = on_exit,
|
|
130
|
+
on_update = on_update
|
|
131
|
+
)
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
public static function noop(state: State) -> StateHooks[State, Context]:
|
|
135
|
+
return StateHooks[State, Context].create(
|
|
136
|
+
state,
|
|
137
|
+
noop_state_hook[State, Context],
|
|
138
|
+
noop_state_hook[State, Context],
|
|
139
|
+
noop_state_hook[State, Context]
|
|
140
|
+
)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
extending StateMachine[State, Event, Context]:
|
|
144
|
+
public static function create(
|
|
145
|
+
initial_state: State,
|
|
146
|
+
states_equal: fn(left: State, right: State) -> bool,
|
|
147
|
+
events_equal: fn(left: Event, right: Event) -> bool
|
|
148
|
+
) -> StateMachine[State, Event, Context]:
|
|
149
|
+
return StateMachine[State, Event, Context](
|
|
150
|
+
current_state = initial_state,
|
|
151
|
+
transitions = vec.Vec[Transition[State, Event, Context]].create(),
|
|
152
|
+
hooks = vec.Vec[StateHooks[State, Context]].create(),
|
|
153
|
+
states_equal = states_equal,
|
|
154
|
+
events_equal = events_equal
|
|
155
|
+
)
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
public editable function release() -> void:
|
|
159
|
+
this.transitions.release()
|
|
160
|
+
this.hooks.release()
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
public function state() -> State:
|
|
164
|
+
return this.current_state
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
public function transitions_len() -> ptr_uint:
|
|
168
|
+
return this.transitions.len()
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
public function hooks_len() -> ptr_uint:
|
|
172
|
+
return this.hooks.len()
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
public function is_in_state(state: State) -> bool:
|
|
176
|
+
return this.states_equal(this.current_state, state)
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
public editable function add_transition(transition: Transition[State, Event, Context]) -> void:
|
|
180
|
+
this.transitions.push(transition)
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
public editable function add_state_hooks(hooks: StateHooks[State, Context]) -> void:
|
|
184
|
+
let existing = find_state_hooks(ref_of(this), hooks.state)
|
|
185
|
+
if existing != null:
|
|
186
|
+
unsafe:
|
|
187
|
+
read(ptr[StateHooks[State, Context]]<-existing) = hooks
|
|
188
|
+
return
|
|
189
|
+
|
|
190
|
+
this.hooks.push(hooks)
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
public editable function tick(context: ref[Context]) -> void:
|
|
194
|
+
let maybe_hooks = find_state_hooks(ref_of(this), this.current_state) else:
|
|
195
|
+
return
|
|
196
|
+
|
|
197
|
+
unsafe:
|
|
198
|
+
let hooks = read(ptr[StateHooks[State, Context]]<-maybe_hooks)
|
|
199
|
+
hooks.on_update(ptr_of(context), this.current_state)
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
public editable function set_state(context: ref[Context], next_state: State) -> DispatchResult[State]:
|
|
203
|
+
let previous_state = this.current_state
|
|
204
|
+
if this.states_equal(previous_state, next_state):
|
|
205
|
+
return DispatchResult[State](
|
|
206
|
+
kind = DispatchKind.ignored,
|
|
207
|
+
previous_state = previous_state,
|
|
208
|
+
current_state = previous_state
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
let previous_hooks = find_state_hooks(ref_of(this), previous_state)
|
|
212
|
+
if previous_hooks != null:
|
|
213
|
+
unsafe:
|
|
214
|
+
let hooks = read(ptr[StateHooks[State, Context]]<-previous_hooks)
|
|
215
|
+
hooks.on_exit(ptr_of(context), previous_state)
|
|
216
|
+
|
|
217
|
+
this.current_state = next_state
|
|
218
|
+
|
|
219
|
+
let next_hooks = find_state_hooks(ref_of(this), next_state)
|
|
220
|
+
if next_hooks != null:
|
|
221
|
+
unsafe:
|
|
222
|
+
let hooks = read(ptr[StateHooks[State, Context]]<-next_hooks)
|
|
223
|
+
hooks.on_enter(ptr_of(context), next_state)
|
|
224
|
+
|
|
225
|
+
return DispatchResult[State](
|
|
226
|
+
kind = DispatchKind.transitioned,
|
|
227
|
+
previous_state = previous_state,
|
|
228
|
+
current_state = next_state
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
public editable function dispatch(context: ref[Context], input: Event) -> DispatchResult[State]:
|
|
233
|
+
for entry in this.transitions:
|
|
234
|
+
unsafe:
|
|
235
|
+
let transition = read(entry)
|
|
236
|
+
if not this.states_equal(transition.from_state, this.current_state):
|
|
237
|
+
continue
|
|
238
|
+
if not this.events_equal(transition.input, input):
|
|
239
|
+
continue
|
|
240
|
+
if not transition.guard(ptr_of(context), input, transition.from_state, transition.to_state):
|
|
241
|
+
continue
|
|
242
|
+
|
|
243
|
+
let previous_state = this.current_state
|
|
244
|
+
let previous_hooks = find_state_hooks(ref_of(this), previous_state)
|
|
245
|
+
if previous_hooks != null:
|
|
246
|
+
let hooks = read(ptr[StateHooks[State, Context]]<-previous_hooks)
|
|
247
|
+
hooks.on_exit(ptr_of(context), previous_state)
|
|
248
|
+
|
|
249
|
+
transition.action(ptr_of(context), input, previous_state, transition.to_state)
|
|
250
|
+
this.current_state = transition.to_state
|
|
251
|
+
|
|
252
|
+
let next_hooks = find_state_hooks(ref_of(this), this.current_state)
|
|
253
|
+
if next_hooks != null:
|
|
254
|
+
let hooks = read(ptr[StateHooks[State, Context]]<-next_hooks)
|
|
255
|
+
hooks.on_enter(ptr_of(context), this.current_state)
|
|
256
|
+
|
|
257
|
+
return DispatchResult[State](
|
|
258
|
+
kind = DispatchKind.transitioned,
|
|
259
|
+
previous_state = previous_state,
|
|
260
|
+
current_state = this.current_state
|
|
261
|
+
)
|
|
262
|
+
|
|
263
|
+
return DispatchResult[State](
|
|
264
|
+
kind = DispatchKind.ignored,
|
|
265
|
+
previous_state = this.current_state,
|
|
266
|
+
current_state = this.current_state
|
|
267
|
+
)
|