application/octet-stream
•
1.55 KB
•
49 lines
; Nujel - Copyright (C) 2020-2021 - Benjamin Vincent Schulenburg
; This project uses the MIT license, a copy should be included under /LICENSE
;; Contains everything related to the yield/coroutine system
[def yield-queue #nil]
[defun yield [pred fun] "Evaluates FUN once PRED is true"
[set! yield-queue [cons [cons pred fun] yield-queue]]
#t
]
[defun yield-run []
"Executes pending coroutines if their predicate evaluates to #t"
[def l yield-queue]
[def new #nil]
[def cur #nil]
[set! yield-queue #nil]
[while l
[set! cur [car l]]
[if [[car cur]]
[[cdr cur]]
[set! yield-queue [cons cur yield-queue]]]
[set! l [cdr l]]
]
]
[defun timeout [milliseconds] "Returns a function that evaluates to true once MILLISECONDS have passed"
[def goal [+ [time/milliseconds] milliseconds]]
[\ [] [> [time/milliseconds] goal]]
]
[defun event-bind [event-name handler] "Binds handler lambda to event-name"
[set! [str->sym event-name] [cons handler [resolve [str->sym event-name]]]]
]
[defun event-clear [event-name] "Clears all event handlers for event-name"
[set! [str->sym event-name] '[]]
]
[defun event-fire-iter [l v] "Iter for event-fire"
[cond [[nil? l] #t]
[#t [apply [car l] v] [event-fire-iter [cdr l] v]]
]
]
[defun event-fire [event-name ...val] "Applies ...val to all event handlers associated with event-name"
[event-fire-iter [resolve [str->sym event-name]] ...val]
]