Login
7 branches 0 tags
Ben (Mac) Fixed serialization of quoted values d0bc4ce 4 years ago 56 Commits
nujel / stdlib / async.nuj
;; Contains everything related to the yield/coroutine system

[def yield-queue [cons "Start of Yield Queue"]]

[def yield [λ [pred expr] "Evaluates EXPR once PRED is true"
	[set-cdr! [last-pair yield-queue] [cons [cons pred expr]]]
	#t
]]

[def yield-run [let []
	[def yield-try [λ [l]
		[cond [[eval [car l]] [eval [cdr l]] #t]
		      [#t #f]
		]
	]]

	[def yield-run-iter [λ [l]
		[cond [[nil? l] #t]
		      [[nil? [cdr l]] #t]
		      [[yield-try [cadr l]] [set-cdr! l [cddr l]] [yield-run-iter l]]
		      [#t [yield-run-iter [cdr l]]]
		]
	]]

	[λ [] "Executes pending coroutines if their predicate evaluates to #t"
		[yield-run-iter yield-queue]
	]
]]

[def timeout [λ [milliseconds] "Returns a function that evaluates to true once MILLISECONDS have passed"
	[let [[goal [+ [time/milliseconds] milliseconds]]]
		[λ [] [> [time/milliseconds] goal]]
	]
]]

[def event-bind [λ [event-name handler] "Binds handler lambda to event-name"
	[set! [str->sym event-name] [cons handler [resolve [str->sym event-name]]]]
]]

[def event-clear [λ [event-name] "Clears all event handlers for event-name"
	[set! [str->sym event-name] '[]]
]]

[def event-fire-iter [λ [l v] "Iter for event-fire"
	[cond [[nil? l] #t]
	      [#t [apply [car l] v] [event-fire-iter [cdr l] v]]
	]
]]

[def event-fire [λ [event-name ...val] "Applies ...val to all event handlers associated with event-name"
	[event-fire-iter [resolve [str->sym event-name]] ...val]
]]